霍夫变换检测直线 c语言,opencv之霍夫变换直线检测
霍夫变换检测
霍夫变换之直线检测霍夫变换直线检测
前提条件-边缘检测已经完成
平面空间到极坐标空间的转换(空间域向霍夫域的转换)
检测原理两点确定一条直线,通过一点可以确定无数条直线,极坐标直线公式
每个点通过角度取不同的值,都能在横坐标为角度值,纵坐标为ρ值的坐标系内确定一条曲线,只要角度值的精细度足够。ρ代表直线到原点的距离。对每个像素采取这样的操作,将会得出很多这样的曲线,这些曲线的交点证明,这些点所在的那个角度所通过的直线到原点距离相等,则证明这些点就在同一条直线上。从运算的复杂程度来看opencv不可能采取那样精细的角度范围。但大致原理基本如此。
对于任意一条直线上的所有点来说
变换到极坐标,从[0~360]空间,可以得到r的大小
属于同一条直线点在极坐标(r,theta)必然在一个点上有最强的信号出现,根据此反算到平面坐标中可以得到直线上各点的像素坐标。从而得到直线
参考链接:
相关API
标准的霍夫变换cv::HoughLines从平面坐标转换到霍夫空间,最终输出是(角度,极轴)表示极坐标空间
霍夫变换直线概率cv::HoughLinesP最终输出是直线的两个点(x0,y0,x1,y1)
函数API(不常用)
void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0, double min_theta = 0, double max_theta = CV_PI )
函数参数
第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
第二个参数,InputArray类型的lines,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量表示,其中,是离坐标原点((0,0)(也就是图像的左上角)的距离。 是弧度线条旋转角度(0~垂直线,π/2~水平线)。
第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。PS:Latex中/rho就表示 。
第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
第六个参数,double类型的srn,有默认值0。对于多尺度的霍夫变换,这是第三个参数进步尺寸rho的除数距离。粗略的累加器进步尺寸直接是第三个参数rho,而精确的累加器进步尺寸为rho/srn。
第七个参数,double类型的stn,有默认值0,对于多尺度霍夫变换,srn表示第四个参数进步尺寸的单位角度theta的除数距离。且如果srn和stn同时为0,就表示使用经典的霍夫变换。否则,这两个参数应该都为正数。
第八个参数,double类型的 min_theta,对于标准和多尺度Hough变换,检查线条的最小角度。必须介于0和max_theta之间。
第九个参数,double类型的 max_theta, 对于标准和多尺度Hough变换,检查线条的最大角度。必须介于min_theta和CV_PI之间.
函数API(常用)
void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )
参数介绍
第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
第二个参数,InputArray类型的lines,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量(x_1,y_1, x_2, y_2) 表示,其中,(x_1, y_1)和(x_2, y_2) 是是每个检测到的线段的结束点。
第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。
第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。
代码演示#include
#include
#include
#include
cv::Mat src;
cv::Mat gray_src;
int cur_val=240;
int max_val=255;
void canny_demo(int ,void *);
int main(void)
{
string pic = string(Pic_Path) + string(Pic_Name);
cout <
src = cv::imread(pic.c_str());
cv::namedWindow("原始图片",cv::WINDOW_AUTOSIZE);
cv::imshow("原始图片",src);
cv::cvtColor(src,gray_src,cv::COLOR_BGR2GRAY);
cv::namedWindow("边缘检测",cv::WINDOW_AUTOSIZE);
cv::createTrackbar("边缘阈值调整","边缘检测",&cur_val,max_val, canny_demo);
canny_demo(0,0);
cv::waitKey(0);
cv::destroyAllWindows();
}
void canny_demo(int ,void *)
{
cv::Mat canny_dst;
//边缘检测 使用动态的边缘检测范围 检测尺寸为3 使用非精确的近似算法
cv::Canny(gray_src,canny_dst,cur_val,cur_val*2,3,false);
cv::imshow("边缘检测",canny_dst);
vector<:vec4f> plines; //定义直线向量容器 可以理解为数组 存储所有的直线概率点集合
//直线检测 直线概率点 一个像素点为检测的步进检测步长 一度的检测角度 低于10个的直线点集合过滤
cv::HoughLinesP(canny_dst,plines,1,CV_PI/180.0,60,100,20);
cv::Mat dst = cv::Mat(canny_dst.size(),src.type());
//定义颜色
cv::Scalar color = cv::Scalar(39,0,235);
for(int i=0;i
{
//定义一个二维向量点元素 临时存储每个二维向量点
cv::Vec4f hline = plines[i];
//划线 定义线宽 去锯齿
cv::line(dst,cv::Point(hline[0],hline[1]),cv::Point(hline[2],hline[3]),color,2,cv::LINE_AA);
}
if(dst.empty())
{
cout <
return ;
}
cv::medianBlur(dst,dst,3);
//cv::namedWindow("直线检测",cv::WINDOW_AUTOSIZE);
//cv::imshow("直线检测",dst);
cv::Mat cacul;
cv::addWeighted(src,0.8,dst,1,0,cacul);
cv::namedWindow("检测叠加",cv::WINDOW_AUTOSIZE);
cv::imshow("检测叠加",cacul);
f
}
————————————————
版权声明:本文为CSDN博主「年纪青青」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。
收藏 | 0点赞 | 0打赏作者
霍夫变换检测直线 c语言,opencv之霍夫变换直线检测相关推荐
- python 检测直线 交点_Python+OpenCV图像处理——实现直线检测
简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线 ...
- 霍夫变换检测圆c 语言,c – 使用Hough变换检测圆
我正在尝试使用霍夫变换来检测圆圈. 使用我当前的代码,我可以检测到下面的代码 但我想在我发现的圆圈内找到黑洞. 然而,改变houghcircle方法的参数对我没有帮助.实际上它找到了不存在的圆圈. 此 ...
- python dlib人脸检测_使用Python+OpenCV+Dlib实现人脸检测与人脸特征关键点识别
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 今天,我们将学习如何检测图像中的人脸并提取面部特征,如眼睛.鼻子. ...
- 三相电检测电路c语言,三相电缺相检测电路
电流互感器 电流互感器是依据电磁感应原理将一次侧大电流转换成二次侧小电流来测量的仪器.电流互感器是由闭合的铁心和绕组组成.它的一次侧绕组匝数很少,串在需要测量的电流的线路中. 因此它经常有线路的全部电 ...
- OpenCV使用Laplace运算符检测边缘的实例(附完整代码)
OpenCV使用Laplace运算符检测边缘的实例 OpenCV使用Laplace运算符检测边缘的实例 OpenCV使用Laplace运算符检测边缘的实例 #include "opencv2 ...
- OpenCV使用Shi-Tomasi方法检测拐角的实例(附完整代码)
OpenCV使用Shi-Tomasi方法检测拐角的实例 OpenCV使用Shi-Tomasi方法检测拐角的实例 OpenCV使用Shi-Tomasi方法检测拐角的实例 #include "o ...
- RIKIBOT使用系列-基于Opencv HSV的色块检测
目录 一. 简介 二.查找色值 1.摄像头的角度调 2.启动检测与查找 三. 验证HSV色值 1.写入色值到文件 2.启动检测 四.交流方式 一. 简介 这里学习一下如何用摄像头检测HSV色值,Ope ...
- 霍夫变换检测圆c 语言,c++ 霍夫变换检测直线
通常这是一幅边缘图像,比如来自 Canny算子.cv:: Houghlines函数的输出是 cV::Vec2f向量,每个元素都是一对代表检测到的直线的浮点数(p,0).在下例中 我们首先应用 Cann ...
- 利用霍夫变换做直线检测的原理及OpenCV代码实现
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 霍夫变换的原理大家可以参考博文 霍夫变换_tie ...
最新文章
- 【重磅】Waymo无人车高层组团出走?CFO今日也走了!
- 理解 Azure 虚拟机的性能监视
- 成功解决object at 0x000002463192BAC8
- LeetCode 355. 设计推特(哈希map+set)
- 第十二届交博会正式启动 百度智慧交管解决方案助城市开启智能交通新纪元
- 剑指Offer面试题:1.实现单例模式
- 自定义Flume Sink:ElasticSearch Sink
- [Android]OkHttp的简单封装-辅助框架
- JSP实用教程(第三版 清华大学出版社)中遇到的问题和解释
- Archlinux电源管理
- 谷歌浏览器扩展程序_谷歌浏览器扩展程序现恶意软件,已被下载千万次
- 极客大学python进阶训练营_极客大学Python进阶训练营新版2.0
- Apache解析漏洞
- 山地车中轴进水表现_求山地自行车各部位上油的方法。特别是中轴和花鼓
- Vmware 和宿主机之间的网络互通
- 尝试导出Cities Skyline完整城市模型遇到的问题与解决
- lq99:分分巧克力
- NLPCC2019 - User-Characteristic Enhanced Model for Fake News Detection in Social Media
- 永恒之蓝实验 MS17-010
- 普洱市企业登记“区块链云签名”试点工作启动, 用户操作仅需5分钟!