【光电智造】计算机视觉|opencv-根据给定点计算夹角

今日光电 2024-12-14 18:00

 今日光电 

     有人说,20世纪是电的世纪,21世纪是光的世纪;知光解电,再小的个体都可以被赋能。追光逐电,光赢未来...欢迎来到今日光电!




----追光逐电 光赢未来----

概述


在计算机视觉领域,图像中的集合计算是一项基本且重要的任务。它广泛应用于图像识别、目标跟踪、场景分析等领域。本文将会通过一个有意思的小代码,介绍OpenCV库与用户进行交互,计算图像中的角度,并将其显示在原有图像上。本篇会详细解析相关代码及其原理请放心观看。以下是本文用到的示例图片




一、原理介绍


图像角度计算通常涉及到两个关键步骤:一是确定图像中的三个点,二是计算由这三个点形成的两条线之间的夹角。


确定三个点:在图像中,我们可以通过鼠标点击或其他方式选取三个点。这三个点将用于定义两条线。


计算夹角:通过计算两条线之间的斜率,我们可以得到它们之间的夹角。具体方法如下:


例如,设三个点分别为A(x1, y1)、B(x2, y2)A(x1,y1)、B(x2,y2)和C(x3, y3)C(x3,y3),则线段AB和AC的斜率分别为:


m1 = (y2 - y1) / (x2 - x1) m2 = (y3 - y1) / (x3 - x1)m1=(y2−y1)/(x2−x1)m2=(y3−y1)/(x3−x1)


根据斜率,我们可以计算两条线之间的夹角θ(弧度):


θ=atan((m2-m1)/(1+m1*m2))θ=atan((m2−m1)/(1+m1∗m2))


最后,将弧度转换为度。



二、代码讲解


1、导入相关库


import cv2import math


2、加载图片


path = 'test.png'img = cv2.imread(path)pointsList = []


path = 'test.png': 定义一个变量path,它包含图像文件的路径。


img = cv2.imread(path): 使用cv2.imread函数读取图像文件,并将其存储在名为img的变量中。该函数的参数是图像的路径。


pointsList = []: 初始化一个空列表pointsList,用于存储鼠标点击的坐标。


3、定义一个函数mousePoints


它将在鼠标事件发生时被调用。参数包括事件类型、鼠标的x和y坐标、标志和参数。


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), 2)        cv2.circle(img, (x, y), 5, (0, 0, 255), cv2.FILLED)        pointsList.append([x, y])


if event == cv2.EVENT_LBUTTONDOWN:: 检查是否发生了鼠标左键点击事件。


size = len(pointsList): 获取pointsList列表的长度。


if size != 0 and size % 3 != 0:: 检查列表长度不为0且不是3的倍数。


cv2.line(img, tuple(pointsList[round((size - 1) / 3) * 3]), (x, y), (0, 0, 255), 2): 在图像上画一条线,从pointsList中最近的第三个点开始,到当前鼠标点击的点结束。参数包括图像、起点坐标、终点坐标、线的颜色(红色)和线的宽度。


cv2.circle(img, (x, y), 5, (0, 0, 255), cv2.FILLED): 在图像上画一个圆,圆心在鼠标点击的位置,半径为5,颜色为红色,填充类型为cv2.FILLED。


pointsList.append([x, y]): 将鼠标点击的坐标添加到pointsList列表中。


4、定义一个函数gradient


用于计算两点之间的斜率。


def gradient(pt1, pt2):    return (pt2[1] - pt1[1]) / (pt2[0] - pt1[0])


return (pt2[1] - pt1[1]) / (pt2[0] - pt1[0]): 返回两点之间的斜率,即y坐标之差除以x坐标之差。


5、定义一个函数getAngle


计算由列表pointsList中最后三个点定义的两条线之间的角度,并在图像上显示这个角度的数值。


def getAngle(pointsList):    pt1, pt2, pt3 = pointsList[-3:]    m1 = gradient(pt1, pt2)    m2 = gradient(pt1, pt3)    angR = 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), 2)


pt1, pt2, pt3 = pointsList[-3:]: 从pointsList中取出最后三个点。


m1 = gradient(pt1, pt2): 计算点pt1和pt2之间的斜率。


m2 = gradient(pt1, pt3): 计算点pt1和pt3之间的斜率。


angR = math.atan((m2 - m1) / (1 + (m2 * m1))): 计算两条线之间的角度(弧度)。


angD = round(math.degrees(angR)): 将角度从弧度转换为度,并使用round函数对结果进行四舍五入,以便于显示。


cv2.putText(...):使用cv2.putText函数在图像img上绘制文本,显示计算出的角度angD。文本的位置是在pt1点的左侧和上方稍微偏移的位置。使用的字体是cv2.FONT_HERSHEY_COMPLEX,字体大小是1.5,文本颜色是红色(0, 0, 255),线条宽度是2。


6、主循环


最后是一个主循环,其工作流程如下:


程序进入一个无限循环,持续显示图像并等待用户交互。


用户通过鼠标点击在图像上添加点,这些点被存储在pointsList列表中。


pointsList列表中有三个或更多点,并且点的数量是3的倍数时,程序计算最后三个点定义的两条线之间的角度,并在图像上显示这个角度。


用户可以随时按下’q’键来清除所有点并重新加载图像,从而重置整个程序。


while True:
   if len(pointsList) % 3 == 0 and len(pointsList) != 0:        getAngle(pointsList)
   cv2.imshow('Image', img)    cv2.setMouseCallback('Image', mousePoints)    if cv2.waitKey(1) & 0xFF == ord('q'):        pointsList = []        img = cv2.imread(path)



效果演示


运行程序后,会弹出图像框,如下所示:



选取三个点,即会显示出两直线之间的夹角,可以看到,与给定参考角度一致(取决于选点的时候是否对准,可能会有一两度的偏差)



按键盘上的Q键即可取消所有标注点,重新绘制图像



总结


使用OpenCV库进行角度计算的过程,首先通过鼠标回调函数收集图像上的点,然后利用数学公式计算由这些点构成的两条线之间的斜率,进而求出它们之间的角度。这一过程不仅展示了OpenCV在图像交互和数据处理方面的强大功能,也体现了计算机视觉技术在几何分析中的应用价值。


来源:古月居


申明:感谢原创作者的辛勤付出。本号转载的文章均会在文中注明,若遇到版权问题请联系我们处理。


 

----与智者为伍 为创新赋能----


【说明】欢迎企业和个人洽谈合作,投稿发文。欢迎联系我们
诚招运营合伙人 ,对新媒体感兴趣,对光电产业和行业感兴趣。非常有意者通过以下方式联我们!条件待遇面谈
投稿丨合作丨咨询

联系邮箱:uestcwxd@126.com

QQ:493826566




评论
  • 概述 Cyclone 10 GX器件的ALM结构与Cyclone V类似,所以在Cyclone 10 GX器件上实现TDC功能理论上是可以完全参考甚至移植自Cyclone V系列的成功案例。但是,现实却是更多的问题出现当在Cyclone 10 GX使用和Cyclone V同样策略实现TDC的时候。 本文主要记录在Cyclone 10 GX器件上实现TDC时的探索,并为后续TDC设计、测试等展开前期研究。Cyclone 10 GX ALM结构 如图1所示,Cyclone 10 GX器件的ALM结构
    coyoo 2024-12-14 17:15 51浏览
  • 霍尔传感器的原理        霍尔传感器是一种固体的传感器,其输出电压与磁场强度成比例。顾名思 义,这种器件是依赖于霍尔效应原理工作的。霍尔效应原理是在导体通电 和加有磁场的情况下,在导体的横向 上会产生电压。电子(在实践中多数载流子最常被使 用)在外部电场的驱动下会产生“漂移”,当暴露于磁场中时,这些运动 的带电粒子会受到一个垂直于电场和 磁场的力的作用。这个力会让导体的边缘充电,一边为正,一边为负。边
    锦正茂科技 2024-12-14 11:41 40浏览
  • 串口调试助手软件:XCOM 也是一款专为嵌入式开发和硬件调试设计的强大工具,如正点原子串口调试助手 XCOM V2.6。这款软件支持多种串口参数配置,满足不同开发需求,广泛应用于嵌入式系统开发、硬件调试以及电子爱好者的项目开发中。XCOM在嵌入式开发和硬件调试中的作用主要体现在以下几个方面: 1. 串口通信测试:XCOM作为一款强大的串口调试工具,允许用户通过计算机的串口进行数据的发送与接收,从而实现对串口通信的测试。这对于验证硬件设备的通信协议、确保数据传输的正确性至关重要。 2. 数据发
    丙丁先生 2024-12-15 11:56 54浏览
  • 家用国产固态继电器(SSR)已成为各行各业的基石,性能可靠、设计紧凑、效率高。这些先进的开关设备取代了传统的机电继电器,具有静音运行、使用寿命更长、可靠性更高等诸多优点。家用SSR专为从工业自动化到家用电器等各种应用而设计,展示了本地制造商的独创性和竞争力。国产固态继电器特点和优势家用SSR采用半导体技术制造,与传统继电器相比,具有很强的耐磨性。主要特点包括:静音无振动运行:SSR使用半导体元件进行开关,消除了机械噪音。响应时间快:是工业控制系统中高速开关的理想选择。耐用性:没有移动部件,即使在
    克里雅半导体科技 2024-12-13 16:49 36浏览
  • 光耦合器是现代电子系统中的关键组件,可在实现电路间信号传输的同时提供电气隔离。然而,人们经常对其功能、选择和应用感到困惑。本文旨在澄清常见的误解,并为工程师和业余爱好者提供必要的见解。什么是光耦合器?光耦合器或光隔离器由封装在一个封装中的发光二极管(LED)和光电探测器(如光电晶体管或光电二极管)组成。当电流通过LED时,LED会发光。光电探测器检测到该光,并产生相应的输出信号。这种机制允许在电气隔离输入和输出的同时传输信号,保护敏感元件免受高压和噪声的影响。关于光耦合器的常见困惑1.了解功能许
    腾恩科技-彭工 2024-12-13 16:17 41浏览
  • 本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志T527开发板)的OpenCV手势识别方案测试。摘自优秀创作者-小火苗米尔基于全志T527开发板一、软件环境安装1.安装OpenCVsudo apt-get install libopencv-dev python3-opencv2.安装pipsudo apt-get install python3-pip二、OpenCV手势识别步骤​1.图像获取:从摄像头或其他图像源获取手部图像。使用OpenCV的VideoCapture类可以捕获视
    米尔电子嵌入式 2024-12-13 15:19 29浏览
  •        霍尔传感器是一种基于霍尔效应的传感器。霍尔效应指的是当通过一个导体的电流受到外部磁场的影响时,导体内部将会产生一种电场,使得在导体两端的电势差发生变化,这种电势差变化称为霍尔电势差。利用这种现象,可以设计出一种可以测量磁场强度和方向的传感器,即霍尔传感器。  霍尔传感器分为线型霍尔传感器和开关型霍尔传感器两种。  (一)开关型霍尔传感器由稳压器、霍尔元件、差分放大器,斯密特触发器和输出级组成,它输出数字量。开关型霍尔传感器还有一种特
    锦正茂科技 2024-12-14 10:58 51浏览
  • 一、引言在数字化时代,芯片作为现代科技的核心,其制造过程却常被视作神秘的黑箱。菊地正典的《大话芯片制造》为我们揭开了这层神秘的面纱,以通俗易懂的方式,全面系统地介绍了芯片制造的各个环节。作为一名电子信息技术专业的教育工作者,我深感这本书不仅为学生提供了宝贵的知识资源,也让我对芯片制造及其在现代社会中的作用有了更深刻的理解。二、生活中的芯片印记芯片的影响渗透到我们日常生活的每一个角落。从智能手机的闹钟唤醒,到交通卡的便捷支付,再到智能家居的智能化功能,芯片以其强大的运算和处理能力,为我们的现代生活
    月光 2024-12-16 11:52 16浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-14 20:56 53浏览
  • 光耦合器是一种重要的电子元件,其在电子信号隔离和传输中的作用不可替代。自20世纪60年代首次被研发以来,光耦合器经历了从基础隔离器件到高性能元件的不断演化,在现代电子设备中占据了重要地位。本文将深入探讨光耦合器的发展历程、技术特点以及在当今科技领域中的广泛应用。光耦合器的诞生背景光耦合器的诞生源于20世纪60年代,为了解决电子信号在不同电路之间传输时的隔离问题,科学家们设计了一种基于光信号传递的全新器件。光耦合器通过发光二极管(LED)将电信号转化为光信号,再由光敏器件接收并重新转换为电信号,从
    腾恩科技-彭工 2024-12-13 16:18 38浏览
  • 提高团队响应速度,优化维护运营在工业或商业建筑中,集中告警管理已成为确保安全性或检测故障的必备工具。通过将所有安全系统集中管理,企业能够将所有告警统一在一个HMI界面中,大幅提升响应速度。关键要点✔ 集成所有安全系统,获取全面的告警视图。✔ 集中管理告警,可自动触发维护请求,提升团队响应效率。一、安全系统的统一管理通过集中管理,监控摄像头、对讲系统、入侵检测、火灾报警和门禁控制等安全设备可以整合到一个统一的界面中。这不仅提供了全局的告警视图,还能更好地检测潜在威胁。1.实时全局视图通过全面掌握设
    宏集科技 2024-12-13 15:58 31浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-13 23:20 48浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦