返回顶部
首页 > 资讯 > 后端开发 > Python >Python+OpenCV实现角度测量的示例代码
  • 878
分享到

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

2024-04-02 19:04:59 878人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

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

本文介绍如何使用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角度测量内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python+OpenCV实现角度测量的示例代码

本文链接: https://lsjlt.com/news/141404.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python+OpenCV实现角度测量的示例代码
    本文介绍如何使用python语言实现角度测量,程序包括鼠标选点、直线斜率计算、角度计算三个子程序和一个主程序。最终实现效果:在图片上用鼠标确认三点,程序将会显示由此三点确定的角度,如...
    99+
    2024-04-02
  • Python+OpenCV如何实现角度测量
    这篇文章主要为大家展示了“Python+OpenCV如何实现角度测量”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python+OpenCV如何实现角度测量”这篇文章吧。最终实现效果:在图片上用...
    99+
    2023-06-29
  • OpenCV角点检测的实现示例
    目录Harris 角点检测算法1. 角点角点检测算法的基本思想: 2. 流程3. 实现Harris 角点检测算法 1. 角点 角点是水平方向、垂直方向变化都很大的像素。 角...
    99+
    2024-04-02
  • opencv图片的任意角度旋转实现示例
    目录一 旋转角度坐标的计算二 旋转任意角度的步骤三 实现一 旋转角度坐标的计算 1.如果O点为圆心,则点P绕点O旋转redian弧度之后,点P的坐标变换为点Q的计算公式为: Q.x=...
    99+
    2024-04-02
  • C++OpenCV实现灰度图蒙版GrayMask的示例代码
    目录需求说明具体流程功能函数C++测试代码测试效果需求说明 在对图像进行处理时,经常会有这类需求:想对感兴趣区域进行掩膜处理,只操作掩膜内数据,此时需要搭配掩膜绘制功能,并在绘制过程...
    99+
    2024-04-02
  • Python+Opencv实现数字识别的示例代码
    一、什么是数字识别?   所谓的数字识别,就是使用算法自动识别出图片中的数字。具体的效果如下图所示: 上图展示了算法的处理效果,算法能够自动的识别到LC...
    99+
    2024-04-02
  • Python极简代码实现杨辉三角示例代码
    杨辉三角,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。 把每一行看做一个list,写一个generator,不断输出下一行的list 实现下列输出效果: # [1] # [1...
    99+
    2022-06-04
    代码 示例 杨辉三角
  • python+opencv实现视频抽帧示例代码
    1、数据集简述:        虽然有主流庞大的COCO、VOC数据集,但是科研人员仍需要特殊领域要求的数据集,所以采用人工实地采集的方式进行收集...
    99+
    2022-06-02
    python opencv视频抽帧 python opencv视频
  • Python实现arctan换算角度的示例
    目录笛卡尔坐标系取值范围笛卡尔坐标系 对于平面坐标系,任一射线OP与x轴夹角θ的范围,可以取[0,2π)或者(-π,π],如无特殊说明, 我们统一使用后...
    99+
    2023-03-13
    Python arctan换算角度 Python 换算角度
  • Python OpenCV实现任意角度二维码矫正
    目录前言一般图片矫正方式二维码图片矫正思路编码实现前言 那天听到领导他们在讨论,说要将图片进行个矫正处理,还叫来了算法部的大佬来讨论将要如何处理这个,讨论场面很是激烈 不得不说好奇心...
    99+
    2024-04-02
  • python+opencv实现的简单人脸识别代码示例
    # 源码如下: #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv def...
    99+
    2022-06-04
    示例 代码 简单
  • openCV实现图像融合的示例代码
    目录1. 概念2. 流程3 代码1. 概念 图像融合: 两幅图片叠加在一起,形成前景背景的效果。 2. 流程 (1)读入要融合的两幅图片。(2)把两幅图片调整到统一大小,方便下一步叠...
    99+
    2024-04-02
  • C++OpenCV实现像素画的示例代码
    目录准备工作代码实现完整代码最近在学习OpenCV,准备后续更新一波OpenCV相关的内容。代码实现主要是以 C++ 为主, 另外为了辅助学习,还会使用C# 开发一款桌面的软件,用于...
    99+
    2024-04-02
  • Python实现批量翻译的示例代码
    目录截图源码Translator.pyLog.pyUtils.py简单的使用案例Python版本截图 源码 Translator.py #!/usr/bin/python # -*...
    99+
    2024-04-02
  • Python实现梯度下降法的示例代码
    目录1.首先读取数据集2.初始化相关参数3.定义计算代价函数–>MSE4.梯度下降5.执行1.首先读取数据集 导包并读取数据,数据自行任意准备,只要有两列,可以分为...
    99+
    2024-04-02
  • Python OpenCV实现图形检测示例详解
    目录1. 轮廓识别与描绘1.1 cv2.findComtours()方法1.2 cv2.drawContours() 方法1.3 代码示例2. 轮廓拟合2.1 矩形包围框拟合 - c...
    99+
    2024-04-02
  • Python+OpenCV实现分水岭分割算法的示例代码
    目录前言1.使用分水岭算法进行分割2.Watershed与random walker分割对比前言 分水岭算法是用于分割的经典算法,在提取图像中粘连或重叠的对象时特别有用,例如下图中的...
    99+
    2024-04-02
  • 利用Python实现网络测试的示例代码
    Speedtest CLI 专为软件开发人员、系统管理员和计算机爱好者等打造,是 Ookla® 提供技术支持的首款正式 Linux 本机 Speedtest 应用程序。 Sp...
    99+
    2024-04-02
  • python+appium实现自动化测试的示例代码
    目录1.什么是Appium2.启动一个app自动化程序的步骤3.appium服务介绍4. appium客户端使用5.adb的使用 6.Appium启动过程分析1....
    99+
    2024-04-02
  • OpenCV实现灰度、高斯模糊、边缘检测的示例
    一、彩色图像转灰度 Opencv提供了一个方法,可以使彩色图像变为灰度图像。 函数名:cvtColor(src,dest,way); src表示初始的mat对象; dest表示转换...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作