OpenCV实战——角度测量
角度测量
1. OpenCV鼠标操作基本知识
链接:鼠标操作
对于这个项目而言,知道这么多已经够用了。
2. 获取鼠标点击得到的点坐标
import cv2
import math# 读入带有角度的图片
path = 'angle.png'
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)# 将位置坐标添加到列表中pointsList.append([x, y])print(pointsList)while True:cv2.imshow('Image', img)cv2.setMouseCallback('Image', mousePoints)# 我们设置当按下q时,进行清屏if cv2.waitKey(1) & 0xFF == ord('q'):pointsList = []img = cv2.imread(path)# 按下b时关闭窗口if cv2.waitKey(1) & 0xFF == ord('b'):break
cv2.destroyAllWindows()
结果展示:
原图像:
鼠标点击:
坐标返回:
3. 获取角度
角度计算方法:
其中m1, m2为两条直线的斜率/梯度,计算方法很简单,两点坐标即可求出
import cv2
import math# 读入带有角度的图片
path = 'angle.png'
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)# 将位置坐标添加到列表中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 + m1 * m2)))# 弧度转换为角度angD = round(math.degrees(angR))# 想在结果出看到角度,就打印出来print(angD)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)if cv2.waitKey(1) & 0xFF == ord('b'):break
cv2.destroyAllWindows()
4. 将得到的角度标记在图上
import cv2
import mathpath = 'angle.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:# 第一个点的下标计算round用于四舍五入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 = abs(math.atan((m2-m1)/(1+m1*m2)))angD = round(math.degrees(angR))# 将得到的角度写在图上cv2.putText(img, str(angD), (pt1[0], pt1[1]), cv2.FONT_HERSHEY_COMPLEX, 1.5, (0, 0, 255), 2)# print(angD)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)if cv2.waitKey(1) & 0xFF == ord('b'):break
cv2.destroyAllWindows()
结果展示:
由于图片是我截屏接下来的,所以空白处不多,显示不全
OpenCV实战——角度测量相关推荐
- opencv实战---角度测量
先放结论: 可以学到角度测量的公式. 可以学到如果按下鼠标时,就获取坐标点. 目录 相关库: 导入图片: 定义鼠标事件回调函数: 计算角度: 结果分析,发现原因: 完整代码: 接下来,就愉快地开始讲解 ...
- 使用opencv进行角度测量
这个项目很简单,要做的就是,在两条线之间形成一个角度,因此我们将使用以下方式定义这些线,我们将定义三个不同的点,这三个点将创建两条不同的线,我们测量出这两线之间的角度,第一个点为角度顶点,第二点和第三 ...
- OpenCV C++案例实战二十七《角度测量》
OpenCV C++案例实战二十七<角度测量> 前言 一.鼠标响应事件 1.1功能源码 1.2功能效果 二.计算直线角度 2.1 计算直线斜率 2.2计算直线角度 2.3功能源码 三.绘制 ...
- OpenCV学习笔记(六)之轮廓提取与角度测量
查找图像的轮廓在图像处理及应用中扮演着重要的角色.openCV 中的轮廓指的是由一系列点组成的点的集合,不同的轮廓可以有不同的点集.openCV中,轮廓是由STL风格的vector<> ...
- unity 知道2点计算线段选择角度_影像测量仪实战技巧之角度测量
如何提高角度测量精度,一直以来是二维测量仪器难以攻克的难关.现在市场上流行的二维测量仪器关于角度测量的方法基本有两种,一种是切线法,一种是采点计算法. 切线法是指人工旋转屏幕上或者镜头内刻线,分别对准 ...
- OpenCV实战(7)——OpenCV色彩空间转换
OpenCV实战(7)--OpenCV色彩空间转换 0. 前言 1. RGB 色彩空间 2. 色彩空间转换 2.1 CIE L*a*b* 色彩空间 2.2 其它色彩空间 3. 用色调.饱和度和亮度表示 ...
- OpenCV实战系列:高通滤波器及其应用
OpenCV实战系列:高通滤波器及其应用 0. 前言 1. 检测图像边缘 1.2 Sobel 滤波器 1.2 梯度算子 1.3 高斯导数 2. 图像拉普拉斯算子 2.1 拉普拉斯算子 2.2 使用拉普 ...
- Opencv实战 | 用摄像头自动化跟踪特定颜色物体
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:新机器视觉 1. 导语 在之前的某个教程里,我们探讨了如 ...
- Angle Finder(角度测量)
目录 一 前言 二 实现步骤 1 需要的第三方库 2 读取图像 3 获取鼠标点 (1)打印鼠标点击的位置(演示,不一定要实现) (2)创建列表存储坐标并将点击生成的点绘制出来 4 计算三个点组成的角的 ...
最新文章
- Go语言中字符串的查找方法小结
- Unity Package Manager Error的解决方案
- leetcode 575. 分糖果(Java版)
- java.util.ComparableTimSort中的sort()方法简单分析
- 【转】Mongodb 学习笔记
- Nutanix超融合基础架构和桌面虚拟化解决方案助力新松机器人加速数字化转型
- 为什么zookeeper集群中节点配置个数是奇数个?
- java native2ascii的用法介绍
- Vijos P1848 计数问题
- Jade平台的下载与原装
- 网站服务器怎么查ipv4,服务器的ipv4地址怎么查
- php中理解print EOT分界符和echo EOT的用法区别
- 【二维码】新浪开放平台和腾讯开放平台试水
- 点选识别DLL/滑块识别DLL/通用验证码识别DLL/图标点选/本地识别DLL
- JS 在线引入jQuery
- WEB API新增整理(三)
- (转)Kangle配置文件
- 首都师范大学计算机调剂被拒绝,首都师范大学考研调剂注意事项有哪些?
- sketch如何做设计稿交互_设计师用Sketch做设计稿时是用1倍图还是用2倍图做
- 计算机研究生生课题物信息学,华中农业大学信息学院研究生导师简介-李国亮...