这个项目很简单,要做的就是,在两条线之间形成一个角度,因此我们将使用以下方式定义这些线,我们将定义三个不同的点,这三个点将创建两条不同的线,我们测量出这两线之间的角度,第一个点为角度顶点,第二点和第三点控制角度的张口大小。
第一步:首先需要导入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) # 图像变为原始图像注:这样测量只能显示锐角角度,要测钝角还需优化
效果显示:

版权声明:本文为qq_60678226原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。