使用opencv进行角度测量

这个项目很简单,要做的就是,在两条线之间形成一个角度,因此我们将使用以下方式定义这些线,我们将定义三个不同的点,这三个点将创建两条不同的线,我们测量出这两线之间的角度,第一个点为角度顶点,第二点和第三点控制角度的张口大小。

第一步:首先需要导入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) # 图像变为原始图像

注:这样测量只能显示锐角角度,要测钝角还需优化

效果显示:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值