这个项目很简单,要做的就是,在两条线之间形成一个角度,因此我们将使用以下方式定义这些线,我们将定义三个不同的点,这三个点将创建两条不同的线,我们测量出这两线之间的角度,第一个点为角度顶点,第二点和第三点控制角度的张口大小。
第一步:首先需要导入opencv库和math库:
第二步:导入我们需要的图像:
第三步:获取实际工作中鼠标的实际坐标值,定义点列表
第四步:获得列表点,和角边线之后进行角度计算,这里的角度计算就是进行tan(a-b)的运算
第五步:获取两点连线下的梯度
第六步:定义角度计算函数
第七步:第一二两点进行连线,第一三两点进行连线
第八步:在img图像中打印相应角度文本
完整代码如下:
import cv2 import math path = 'test.jpeg' img = cv2.imread(path) pointsList = [] #定义点参数列表 # 定义鼠标点函数 def mousePoints(event,x,y,flags,params): # 如果事件是鼠标左键按下,将会记录x和y 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) cv2.circle(img,(x,y),5,(0,0,255),cv2.FILLED) # 在鼠标点出对应画上一个实心圆 pointsList.append([x,y]) # 进行点的附加,每点击一次,点的坐标进行累加 # print(pointsList) # print(x,y) # 定义梯度函数 def gradient(pt1,pt2): return (pt2[1]-pt1[1])/(pt2[0]-pt1[0]) def getAngle(pointslist): pt1, pt2, pt3 = pointslist[-3:] # 将点列表的各点对应赋值给变量pt1,pt2,pt3 m1 = gradient(pt1,pt2) # 第一点和第二点之间的斜率 m2 = gradient(pt1,pt3) # 第一点和第三点之间的斜率 angR = math.atan((m2-m1)/(1+(m2*m1))) # 角度对应的tan值 angD = round(math.degrees(angR)) # 反解出对应角度值 # 在img图像中打印文本—-对应角度的绝对值 cv2.putText(img,str(abs(angD)),(pt1[0]-40,pt1[1]-20),cv2.FONT_HERSHEY_COMPLEX,1.5,(0,0,255),2) # print(angD) # 进行while循环 while True: # 点列表长度余3为0,调用函数getAngle() if len(pointsList) % 3 == 0 and len(pointsList) != 0: getAngle(pointsList) cv2.imshow('Image',img) # 鼠标回调值,返回对应鼠标坐标值 cv2.setMouseCallback('Image',mousePoints) # 此时waitKey()参数改为1,图像才会进行更新 if cv2.waitKey(1) & 0xFF == ord('q'): pointsList = [] # 刷新我们的点列表 img = cv2.imread(path) # 图像变为原始图像
注:这样测量只能显示锐角角度,要测钝角还需优化
效果显示: