Python+OpenCV实现角度测量的示例代码

  • 更新时间:2022-12-06 08:36:51
  • 编辑:余景天

本文介绍如何使用python语言实现角度测量,程序包括鼠标选点、直线斜率计算、角度计算三个子程序和一个主程序。最终实现效果:在图片上用鼠标确认三点,程序将会显示由此三点确定的角度,如下图所示。

1、鼠标选点

# -*- coding: utf-8 -*-
 
import cv2
 
path = "picture_mqa\\angle_measure.bmp"
img = cv2.imread(path)
pointsList = []
 
def mousePoints(event,x,y,flags,params):
    if event  == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(img,(x,y),5,(0,0,255),cv2.FILLED)
        print(x,y)
 
while True:
    cv2.imshow('Image', img)
    cv2.setMouseCallback('Image',mousePoints)
    
    key_scan = cv2.waitKey(1) & 0xff 
    
    if key_scan == ord("q"):
        pointsList = []
        img = cv2.imread(path)
    elif key_scan == ord("s"):
        break
    
cv2.destroyAllWindows()  

while循环内cv2.setMouseCallback('Image',mousePoints)为鼠标中断触发事件的开启函数,作用是当在Image图片上鼠标触发中断事件时,程序跳转到mousePoints()中断服务函数内,并给mousePoints()的五个入口参数event,x,y,flags,params赋值。其中, event是cv2_EVENT_* (MouseEventTypes)类型的变量,为鼠标触发中断事件的类型;x和y为鼠标触发中断事件时在image图像的横纵坐标;flags是cv2_EVENT_FLAG_* (MouseEventFlags)类型的变量,为特殊中断事件的标志位;param是用户自定义的参数。本文的程序中使用 EVENT_LBUTTONDOW#左键点击触发事件,当鼠标左键点击时,标注该点并记录其坐标。

event的赋值:

  • EVENT_MOUSEMOVE             #滑动
  • EVENT_LBUTTONDOWN         #左键点击
  • EVENT_RBUTTONDOWN        #右键点击
  • EVENT_MBUTTONDOWN       #中键点击
  • EVENT_LBUTTONUP               #左键放开
  • EVENT_RBUTTONUP              #右键放开
  • EVENT_MBUTTONUP              #中键放开
  • EVENT_LBUTTONDBLCLK      #左键双击
  • EVENT_RBUTTONDBLCLK     #右键双击
  • EVENT_MBUTTONDBLCLK    #中键双击

2、角度计算 

由1可以得到鼠标点击位置处的坐标,我们将其放入pointList列表内。当列表内的坐标数目为3的倍数时调用getAngle()函数,计算出三点确定的两条直线的夹角。

def gradient(pt1,pt2):
    return ((pt2[1]-pt1[1])/(pt2[0]-pt1[0]))
 
def getAngle(pointsList):
    pt1,pt2,pt3 = pointsList[-3:] 
    m1 = gradient(pt1, pt2)
    m2 = gradient(pt1, pt3)
    angR = abs(math.atan((m2-m1)/(1+m2*m1)))
    angD = round(math.degrees(angR))
    
    cv2.putText(img,str(angD),(pt1[0]-40,pt1[1]-20),cv2.FONT_HERSHEY_COMPLEX,
                1.5,(0,0,255)) 

由直线的两点式方程可得直线的倾斜角为angle = arctan(y2-y1,x2-x1),则两条直线的夹角为angle0 =angle1-angle2 = arctan(y2-y1,x2-x1) - arctan(y2-y3,x2-x3)。以上函数便可根据三点的坐标值求其形成夹角的角度。

3、完整程序

# -*- coding: utf-8 -*-
'''
测量鼠标点击过的三点形成的角度
'''
import cv2
import math
 
path = "picture_mqa\\angle_measure.bmp"  #图片路径
img = cv2.imread(path)
pointsList = []
 
#鼠标中断触发函数,将鼠标触发事件位置处描点并将该点的坐标值纪录入pointList列表内
#连接相邻三点使其形成一个夹角
def mousePoints(event,x,y,flags,params):
    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))
        cv2.circle(img,(x,y),5,(0,0,255),cv2.FILLED)
        pointsList.append([x,y])
 
#由两点的坐标值计算两点所在直线的斜率        
def gradient(pt1,pt2):
    return ((pt2[1]-pt1[1])/(pt2[0]-pt1[0]))
 
#根据相邻的三点计算出其形成夹角的角度值
def getAngle(pointsList):
    pt1,pt2,pt3 = pointsList[-3:] 
    m1 = gradient(pt1, pt2)
    m2 = gradient(pt1, pt3)
    angR = abs(math.atan((m2-m1)/(1+m2*m1)))
    angD = round(math.degrees(angR))
    
    cv2.putText(img,str(angD),(pt1[0]-40,pt1[1]-20),cv2.FONT_HERSHEY_COMPLEX,
                1.5,(0,0,255))       
 
 
while True:
    cv2.imshow('Image', img) #图片显示
    cv2.setMouseCallback('Image',mousePoints) #鼠标触发事件开启
    
    if len(pointsList) % 3 ==0 and len(pointsList)!=0: #鼠标每触发中断3次计算一次其形式夹角的角度值
        getAngle(pointsList)
    
    key_scan = cv2.waitKey(1) & 0xff #键盘扫描
    if key_scan == ord("q"):  #输入'q'时图片刷新
        pointsList = []
        img = cv2.imread(path)
        
    elif key_scan == ord("s"): #输入's'时退出程序
        break
    
cv2.destroyAllWindows()

到此这篇关于Python+OpenCV实现角度测量的示例代码的文章就介绍到这了,更多相关Python OpenCV角度测量内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!

相关教程

  • 详解python利用Opencv实现人脸识别功能

    这篇文章主要为大家详细介绍了python利用Opencv实现人脸识别功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    发布时间:2020-02-21

  • Python3.7中安装openCV库的实例讲解

    这篇文章主要介绍了Python3.7中安装openCV库的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

    发布时间:2020-02-03

  • 使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

    使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

    给大家整理了关于Python的教程,这篇文章主要介绍了使用Python的OpenCV模块识别滑动验证码的缺口,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    发布时间:2022-06-18

  • 详解python opencv3人脸识别(windows)

    这篇文章主要为大家详细介绍了python opencv3实现人脸识别程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    发布时间:2020-02-17

  • opencv对python3的支持

    支持。opencv_python-3.1.0-cp34-cp34m-win_amd64.whl。这就是用于python3.1版本的opencv库。除此之外还有其他版本的就不一一举例了,请网上详查。

    发布时间:2020-01-23

  • python和opencv构建运动检测器的实现

    python和opencv构建运动检测器的实现

    给大家整理一篇关于opencv的教程,这篇文章主要介绍了python和opencv构建运动检测器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    发布时间:2022-06-15

  • python测试opencv时imread导致的错误解决方法

    今天小编就为大家分享一篇解决python测试opencv时imread导致的错误问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    发布时间:2019-06-05

  • Python中Opencv用cuda加速方法实例

    在本篇内容里我们给大家整理了关于Python中Opencv用cuda加速方法以及实例代码,需要的朋友们跟着学习参考下吧。

    发布时间:2019-07-02

  • Python+OpenCV+pyQt5录制双目摄像头视频的实例

    Python+OpenCV+pyQt5录制双目摄像头视频的实例

    为网友们分享了关于Python OpenCV的教程,今天小编就为大家分享一篇Python+OpenCV+pyQt5录制双目摄像头视频的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    发布时间:2022-09-07

  • Python OpenCV处理图像滤镜和图像运算用法知识点

    这篇文章主要为大家详细介绍了Python OpenCV处理图像之滤镜和图像运算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    发布时间:2019-08-15

用户留言