通过霍夫直线检测方式获取直线,自定义提取直线(提取出两条接近平行的直线),将直线进行拟合
由于项目的需要,需要使用霍夫直线检测进行处理图像。这里进行笔记记录,话不多说,先上代码:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{Mat img = imread("result1.png");Mat gray, canny, binaryImage;cvtColor(img, gray, CV_RGB2GRAY);threshold(gray, binaryImage, 100, 225, THRESH_BINARY);imshow("binaryImage", binaryImage);Canny(binaryImage, canny, 50, 120);vector<Vec4i> lines;HoughLinesP(canny, lines, 1, CV_PI / 180, 50, 200, 30);for (size_t i = 0; i < lines.size(); i++){Vec4i I = lines[i];double x1 = I[0];double y1 = I[1];double x2 = I[2];double y2 = I[3];//筛选满足条件的点if (abs(x1 - x2) + abs(y1 - y2) > 50){//将满足条件的点画出line(img, Point2d(x1, y1), Point2d(x2, y2), Scalar(0, 255, 255), 2);cout << " " << "(" << x1 << "," << y1 << ")" << " " << "(" << x2 << "," << y2 << ")" << endl;//line(canny, Point2d(x1, y1), Point2d(x2, y2), Scalar(0, 255, 255), 2);}}imshow("img2", img);imwrite("shuchu.png", img);waitKey(0);return 0;
}
上面的代码并没有进行什么滤波与二值化处理,是最简单的一种方式。
霍夫直线检测函数的使用
首先是对霍夫直线检测代码之中HoughLinesP函数进行解释:
void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )
第一个参数:InputArray image,表示输入的图像。
第二个参数:OutputArray lines,表示输出的量,其中包含有相应的输出的直线的坐标。
第三个参数:double rho, 以像素为单位的距离精度。
第四个参数:double theta,以弧度为单位的角度精度。
一般前四个参数是不用管的,主要是看后面的三个参数。
第五个参数:int threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。 大于阈值 threshold 的线段才可以被检测通过并返回到结果中。
第六个参数: double minLineLength,存在默认值0,表示可以显示的最低线段长度。
第七个参数:double maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。
这里每个参数的含义可以详见博客如下所示:
HoughLinesP参数设置(看完还不会你砍死我!!!)_无情的搬砖机器的博客-CSDN博客_houghlinesp一、我是个标题1、随便在PPt画个图如下(1602*750):2、测试代码#include<iostream>#include<opencv2/opencv.hpp>using namespace std;using namespace cv;int detect(cv::Mat img) {cv::Mat can_img, gray_img;cv::cvtColor(img, gray_img, CV_BGR2GRAY);cv::Mat ..https://blog.csdn.net/Li_haiyu/article/details/106397532?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166746636316800182746543%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166746636316800182746543&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-106397532-null-null.142%5Ev62%5Econtrol,201%5Ev3%5Eadd_ask,213%5Ev1%5Econtrol&utm_term=HoughLinesP&spm=1018.2226.3001.4187
自定义方式进行线段提取
网上只是给出了如何进行霍夫直线的提取,但是具体信息的提取过程,网上并没有,所以由于项目的需要,想了以下的方式可以进行对于可用信息的提取。
使用的图片是已经截取好的,因为实际的项目之中,背景的干扰是非常小的。由于此处进行的是模拟实验,我想到的办法只有是在不进行原有的像素改变的过程之中,对于图片内容的截取。具体的截取过程见我的另一篇博客:基于OpenCV使用鼠标在图片之中提取自己想要的信息进行显示_YllasdW的博客-CSDN博客基于OpenCV使用鼠标在图片之中圈出自己想要的信息进行显示https://blog.csdn.net/m0_47489229/article/details/126959813
上面写的代码的运行结果如下所示:
但是我需要进行提取的是在直板两端平行的线,由上面结果可知实际图像之中是存在五条线,那么这里如何进行提取两端的线呢?
我这个地方也是仔细想了一想,但是也是非常的简单,我的思路如下所示:
①两个直线之间的间距问题,既然是存在三条直线,提取两端的直线,那两端的直线的间距必然是相对而言比较大的。
②起始点和终止点之间的距离,这个地方只能是作为第二个条件存在,在判断出第一个条件之后,提取两边最长的线段(当然这个思路不是特别好,但是我这里想着这样其实也是可以的)。
③提取两边直线的斜率最为相近的两条直线(相比于条件②,这个更加靠谱一点)
代码思路,上面几个条件使用过程,我采用使用思路①和思路③进行结合的方式,所需要使用的信息是在输出结果之中,输出点之中起始点和终止点就是可以的。
在正式进行的过程,发现存在一个问题,就是思路①之中,直线可能并不是平行线,那么如何进行评价呢?所以对于思路①不如选定自己直线上面的同一纵坐标对应的横坐标进行比对,选取第一组的横坐标作为标准,依次进行相减,得到的数值取一个平均值,当数值大于这个数是一组,小于又是另外一组,进而可以分为左右两组直线。(发现自己好机智
通过霍夫直线检测方式获取直线,自定义提取直线(提取出两条接近平行的直线),将直线进行拟合相关推荐
- OpenCV_09 模版匹配和霍夫变换:霍夫线检测+霍夫圆检测
1 模板匹配 1.1 原理 所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最 ...
- 【opencv-python】霍夫圆检测
霍夫变换检测直线的原理是利用累加器找到最大的(ρ,θ)(ρ,θ)(ρ,θ)数对,如文章所述.圆形的数学表达式为(x−xcenter)2+(y−ycenter)2=r2(x-x_{center})^2+ ...
- OpenCV 霍夫圆检测
圆的表示式是: 其中aa和bb表示圆心坐标,rr表示圆半径,因此标准的霍夫圆检测就是在这三个参数组成的三维空间累加器上进行圆形检测,此时效率就会很低,所以OpenCV中使用霍夫梯度法进行圆形的检测. ...
- OpenCV中霍夫圆检测
OpenCV中霍夫圆检测 在直线检测中,变换后在r−θr-\thetar−θ空间内曲线交点,然后根据阈值来得到直线.在圆中需要有三个变量圆心坐标和半径,因此变换后的空间在三维空间,根据三维空间中的曲线 ...
- OpenCV基于Python霍夫圆检测—基于梯度的霍夫圆检测
基于梯度的霍夫圆检测 1. 回顾与目标 2. 基于梯度的霍夫圆检测 2.1 问题分析 2.2 基于梯度的霍夫圆检测步骤 3. 基于梯度的霍夫圆检测函数HoughCircles 3.1 函数HoughC ...
- OpenCV基于Python霍夫圆检测—标准霍夫圆检测
标准霍夫圆检测 1. 简介 2. 标准霍夫圆检测 2.1 情形一 2.2 情形二 2.3 情形三 3. 程序演示 4. 结尾 参考资料 1. 简介 1972年,R. D. Duda和P. E. Har ...
- Opencv 霍夫变换 霍夫圆检测
霍夫变换是一种特征提取术,在了解霍夫变换 霍夫检测之前 需要首先明白什么是霍夫空间:以圆形举例子,弄明白形状的原理,直线的变换与检测也就不难理解 霍夫空间,是一种三维空间,三个坐标分别为圆的横纵坐标, ...
- opencv c++ 霍夫圆检测
1.原理 a)对某点,以其为圆心的圆为无数(一圈圈的圆),将其从x-y平面坐标系上转换到r-θ极坐标系上后,则变成了以r.θ为自变量,为固定值,x.y为因变量的式子: b)其余点作同样操作,可以得到, ...
- OpenCV霍夫圈检测Hough Circle Detection的实例(附完整代码)
OpenCV霍夫圈检测Hough Circle Detection的实例 OpenCV霍夫圈检测Hough Circle Detection的实例 OpenCV霍夫圈检测Hough Circle De ...
最新文章
- AAAI 2020 | 自动化所:基于对抗视觉特征残差的零样本学习方法
- “上拉电阻与下拉电阻”通俗解读
- 如何压缩神经网络(将已经训练好的压缩)
- 基因突变不是随机的?!Nature最新论文挑战进化论
- Flutter 入门指北(Part 13)之网络
- Flume学习笔记(二)问题整理
- C语言试题十三之求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整书,并将他们放在a所指的数组中,通过n返回这些数的个数。
- tensorflow权重初始化
- python选择框格式_PyQt组合框选择性文本格式
- 长沙试水数字人民币:线下支持数字人民币支付的商家已达3404个
- java paint绘图添加组件不能显示_java – 为什么paintComponent没有在面板上绘图?
- 如何使用花生壳或ngork工具将web应用部署到公网上访问
- 八爪鱼采集器使用方法
- 百度研发工程师编程题——买帽子
- 金蝶标准版的服务器文件,金蝶标准版服务器设置
- 关于出现Merge remote-tracking branch ‘origin/develop‘ into develop这种commit记录的原因
- @RunWith注解的作用
- 网格交易法在交易中的应用
- 通信系统原理[郭宇春]——二元数字频带传输——课后习题答案
- 为了5G!首部强制性地方标准发布!
热门文章
- Excel聚类分析-人口统计模式下的分群算法
- 1.9万亿参数量,快手落地业界首个万亿参数推荐精排模型
- linux源码共享,Android之高仿飞鸽传书热点创建与共享源码
- Redis学习(List数据类型)
- 安全厂商中睿天下加入龙蜥社区
- The Forty-third Of Word-Day
- android手机系统怎么刷机包,怎么刷机安卓系统-安卓手机刷机包如何DIY让Android刷机包更好用...
- tensorflow读取jpg格式图片报错 ValueError: Only know how to handle extensions: ['png']; with Pillow installed
- MATLAB实现自编码器(六)——变分自编码器(VAE)官网代码的改进
- 轻量级的在线团队协作工具