当前位置: 首页 > news >正文

Opencv项目实战:02 角度探测器

1,效果展示

 

 

本次项目很简单,即是根据鼠标的点击,检测角度值,如上图,存在一些人为误差,效果也是相当不错的,接下来我们正式开始。

2,项目知识讲解

 (1)鼠标点击事件

cv2.setMouseCallback(windowName, onMouse)

cv2.EVENT_LBUTTONDOWN

第一个函数是指在鼠标点击后得到的响应,'windowName'参数是指鼠标点击的窗口名,'onMouse',可以作为在得到响应后,需要进一步操作的函数。

第二个函数是指敲击了鼠标左键。想了解更多可以看下面这篇博客。

(71条消息) OpenCv——鼠标事件笔记_夏天是冰红茶的博客-CSDN博客icon-default.png?t=M7J4https://blog.csdn.net/m0_62919535/article/details/126411367?spm=1001.2014.3001.5501

(2)两线间角度

  • 有三个点的坐标,分别求出三条直线的斜率,k1,k2,k3
  • 两条斜率分别为k1,k2的直线,他们的夹角公式为:
  • L1与L2的夹角为θ,则tanθ=∣(k2- k1)/(1+ k1*k2)∣

 

 3,代码的展示与讲解

 

import cv2
import math

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


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])

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 = 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)

while True:

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

由我来讲解一下此代码,可以先看我的分析,再去看着代码,敲一遍就好了。


  • 首先,读入我们的图像,并建立一个空列表用来接收每次鼠标点击之后返回的坐标值。
  • 其次,(1)在mousePoints函数里面,用pointsList收集鼠标点击的坐标,并在点击处画点,而在连线处有个问题,那就是cv2.line是输入两点的坐标后画线,第二个点就保持鼠标点击得到的坐标,对于第一个点,那就是保持第一次点击的坐标,即pst1的坐标;(2)在gradient函数里面,作用就很简单了,即是求pst1与pst2,pst1与pst3之间的斜率;(3)在getAngle函数里面,则是根据公式求出角度值,并将其打印在合适的位置;
  • 最后,while True循环当中,就是对函数的调用,并且用点击键盘的'q',刷新图片和清空存储在pointsList的坐标,点击键盘的'w',退出循环。

 

 4,项目总结

        本次项目较为简单,没有太过困难的地方,在结尾处我会附加上图片素材,需用自取,但我不知道在上传后,图片大小是否会改变,原图片的大小为1392*818,在本次项目中我采用了其大小的75%,拿到图片后,先看图片的属性,再在此位置进行修改

 img=cv2.resize(img,(1044,614))

从使用体验上,我觉得新鲜感不够,但用于新入门的来说,就还不错吧。

 

 5,项目素材

 

相关文章:

  • OSPF —— 多区域部署 + ABR + ASBR + 路由重分发
  • 猿创征文|JVM之图解垃圾收集器2-Shenandoah和ZGC
  • springboot+安卓app电子阅览室系统毕业设计源码016514
  • 第04章 第04章 队列
  • 智慧工业+数字孪生,打造智慧设备运维最优解
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • 【java_wxid项目】【第七章】【Spring Cloud Alibaba Seata集成】
  • Devops全链路学习——docker docker-compose jenkins
  • 程序生成随机数的方法
  • 《nginx》一、nginx核心指令
  • Hadoop环境快速搭建《简单无脑步骤版》
  • TypeScript 高级类型
  • vulnhub BTRSys: v2.1
  • mysql使用小记--group_concat()、sum()
  • SpringBoot学习笔记(五)IOC
  • @jsonView过滤属性
  • [ JavaScript ] 数据结构与算法 —— 链表
  • idea + plantuml 画流程图
  • iOS 颜色设置看我就够了
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Javascript Math对象和Date对象常用方法详解
  • Java小白进阶笔记(3)-初级面向对象
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • python学习笔记 - ThreadLocal
  • 百度地图API标注+时间轴组件
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 创建一个Struts2项目maven 方式
  • 聊聊directory traversal attack
  • 什么软件可以剪辑音乐?
  • 数组的操作
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 我这样减少了26.5M Java内存!
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (分享)自己整理的一些简单awk实用语句
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (三)elasticsearch 源码之启动流程分析
  • (十八)SpringBoot之发送QQ邮件
  • (五)网络优化与超参数选择--九五小庞
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Linq学习笔记
  • .NET6实现破解Modbus poll点表配置文件
  • .net专家(高海东的专栏)
  • /dev/sda2 is mounted; will not make a filesystem here!
  • ::前边啥也没有
  • @ModelAttribute注解使用
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [AIGC] Spring Interceptor 拦截器详解
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [bzoj4240] 有趣的家庭菜园
  • [Codeforces] number theory (R1600) Part.11
  • [DL]深度学习_Feature Pyramid Network
  • [HAOI2016]食物链
  • [I2C]I2C通信协议详解(一) --- 什么是I2C