OpenCV实战项目——角度测量
数学处理
代码
# 角度测量
import cv2
import math
path = '1.jpg' # 读取路径
img = cv2.imread(path) # 读取图像
pointsList = [] # 储存我们点击的点
# 获取鼠标点函数
def mousePoints(event, x, y, flags, params): # 鼠标点,xy,标志和参数
if event == cv2.EVENT_LBUTTONDOWN: # 按住左键
size = len(pointsList)
if size != 0 and size % 3 != 0:
cv2.line(img, tuple(pointsList[round((size-1)/3)*3]), (x, y), (0, 0, 255), 2) # 画线(tuple数组转化对象)
cv2.circle(img, (x, y), 5, (0, 0, 255), cv2.FILLED) # 画出点击圆
pointsList.append([x, y]) # 将点添加进入列表
# 求两直线斜率函数
def gradient(pt1,pt2):
return (pt2[1]-pt1[1])/(pt2[0]-pt1[0])
# 获得角度函数
def getAngle(pointsList):
pt1, pt2, pt3 = pointsList[-3:]
m1 = gradient(pt1, pt2)
m2 = gradient(pt1, pt3)
angR = math.atan((m2 - m1) / (1 + (m2 * m1))) # 计算出弧度
angD = round(math.degrees(angR)) # 转化为角度制
cv2.putText(img, str(angD), (pt1[0] - 40, pt1[1] - 20), cv2.FONT_HERSHEY_COMPLEX,
1.5, (0, 0, 255), 2) # 写上文本
while True:
if len(pointsList) % 3 == 0 and len(pointsList) != 0: # 如果列表长度为三的倍数,则才获得角度
getAngle(pointsList)
cv2.imshow('image', img) # 展示图像
cv2.setMouseCallback('image', mousePoints)
if cv2.waitKey(1) & 0xFF == ord('q'): # 按住q进行清除
pointsList = []
img = cv2.imread(path)
结果