基于opencv+python的角度测量
import cv2# 导入opencvimport math# 导入math库,计算角度时需要path = './Angle Finder/background.png'# 测试样图相对路径image = cv2.imread(path)# 读入图片pointsList = []# 创建一个点列表用于存储鼠标左键单击点的坐标# 定义鼠标点函数,参数为事件、点坐标的x和y值、标志、参数def mo
·
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)
运行结果
更多推荐
所有评论(0)