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的角度测量】
文章图片
推荐阅读
- 为什么你的路演总会超时()
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- opencv|opencv C++模板匹配的简单实现
- Java|Java OpenCV图像处理之SIFT角点检测详解
- 松软可口易消化,无需烤箱超简单,新手麻麻也能轻松成功~
- 原生家庭之痛与超越
- BNC公链|BNC公链 | Eth2.0测试网Topaz已质押超100万枚ETH
- 89㎡挤出小三房,电视墙装的超好看!
- Android超简单实现沉浸式状态栏
- 超级行动力第二次作业-行动大于学习的秘密