基于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)

运行结果

在这里插入图片描述

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值