OpenCV超实用实战项目|基于opencv+python的角度测量

import cv2# 导入opencv import math# 导入math库,计算角度时需要path = './Angle Finder/background.png'# 测试样图相对路径 image = cv2.imread(path)# 读入图片 pointsList = []# 创建一个点列表用于存储鼠标左键单击点的坐标# 定义鼠标点函数,参数为事件、点坐标的x和y值、标志、参数 def mousePoints(event, x, y, flags, params): # 若事件为按下鼠标左键 if event == cv2.EVENT_LBUTTONDOWN: # 记录点列表的长度 size = len(pointsList) # 当点列表中点的个数不为零且不能被3整除时 if size != 0 and size % 3 != 0: # 在顶点与两端点之间划线 cv2.line(image, tuple(pointsList[round((size-1)/3)*3]), (x, y), (0, 0, 255), 1)# 打印输出光标点击的位置 print(pointsList) # 将鼠标左键点击的点绘制在图像上 cv2.circle(image, (x, y), 2, (0, 0, 255), cv2.FILLED) # 每次左键单击后都添加点的坐标 pointsList.append([x, y])# 利用两个点的坐标计算直线斜率 def slope(point1, point2): return (point2[1]-point1[1])/(point2[0]-point1[0])# 计算角度 def getAngle(pointsList): point1, point2, point3 = pointsList[-3:] slope1 = slope(point1, point2) slope2 = slope(point1, point3) angR = math.atan((slope2-slope1)/(1+(slope2*slope1))) angD = round(math.degrees(angR)) # 无法将类型 "int" 的对象转换为 "文本" 的 "str",必须将int类型的angD强制转换成string类型的文本 cv2.putText(image, str(angD), (point1[0]-40, point1[1]-20), cv2.FONT_HERSHEY_COMPLEX, 1.5, (255, 0, 0), 2)while True: # 如果点列表长度能被3整除且不为0,即可以构成一个角,此时可以计算角度 if len(pointsList) % 3 == 0 and len(pointsList) != 0: getAngle(pointsList)cv2.imshow('Image', image) #鼠标响应 cv2.setMouseCallback('Image', mousePoints) # 点击q键,刷新点列表,再次导入图像 if cv2.waitKey(1) & 0xFF == ord('q'): pointsList = [] image = cv2.imread(path)

运行结果
【OpenCV超实用实战项目|基于opencv+python的角度测量】OpenCV超实用实战项目|基于opencv+python的角度测量
文章图片

    推荐阅读