OpenCV3图像处理——霍夫曼变换直线检测
前言
1.直线检测在好多实现应用中能用到到,我之前做过扫描件检测时用直线检测来处理判断页面是否水平,还有在辅助驾驶中的车道偏离预警系统也有过应用。
2.我的编程环境是Windows 7 64位,IDE是VS2015,配置了OpenCV3.3与OpenCV_Contrib,实现语言是C++。是于如果配置以上的环境,可以看我之前写的博文。
一、概述
1.直线检测的原理介绍
(1)对于直角坐标系中的任意一点A(x0,y0),经过点A的直线满足Y0=kX0+b.(k是斜率,b是截距)。
(2)那么在X-Y平面过点A(x0,y0)的直线簇可以用Y0=kX0+b表示,但对于垂直于X轴的直线斜率是无穷大的则无法表示。因此将直角坐标系转换到极坐标系就能解决该特殊情况。
(3)在极坐标系中表示直线的方程为ρ=xCosθ+ySinθ(ρ为原点到直线的距离)。
(4)对于任意一条直线上的所有点来说,变换到极坐标中,从[0~360]空间,可以得到r的大小,属于同一条直线上点在极坐标空(r, theta)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标。从而得到直线。
2.OpenCV封装有直线检测的函数,HoughLines()和HoughLinesP(),它们都能实现直线检测,差别是:HoughLines()函数使用标准的Hough变换HoughLinesP()函数使用概率Hough变换,即只通过分析点的子集并估计这些点都属于一条直线的概率,这在计算速度上更快。
(1)HoughLines()函数说明:
HoughLines(
InputArray src, // 输入图像,必须8-bit的灰度图像
OutputArray lines, // 输出的极坐标来表示直线
double rho, // 生成极坐标时候的像素扫描步长
double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180
int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线
double srn = 0;// 是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
double stn = 0;//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
double min_theta = 0; // 表示角度扫描范围 0 ~180之间, 默认即可
double max_theta = CV_PI
)
(2)HoughLinesP()函数说明:
HoughLinesP(
InputArray src, // 输入图像,必须8-bit的灰度图像
OutputArray lines, // 输出的极坐标来表示直线
double rho, // 生成极坐标时候的像素扫描步长
double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180
int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线
double minLineLength = 0;// 最小直线长度
double maxLineGap = 0;// 最大间隔
)
二、代码演示
1.传入一张图像,把所有直线画出来。
void lineDetection(string image_path)
{Mat src, src_gray, dst;src = imread(image_path);if (!src.data) {std::cerr << "无法打开图像文件!" << endl;return;}namedWindow("input image", CV_WINDOW_AUTOSIZE);namedWindow("hough-line-detection", CV_WINDOW_AUTOSIZE);imshow("input image", src);//边缘检测Canny(src, src_gray, 150, 200);//灰度化cvtColor(src_gray, dst, CV_GRAY2BGR);vector<Vec2f> lines;//霍夫曼直线检测Point pt1, pt2;HoughLines(src_gray, lines, 1, CV_PI / 180, 150, 0, 0);for (size_t i = 0; i < lines.size(); i++){// 极坐标中的r长度float rho = lines[i][0]; // 极坐标中的角度float theta = lines[i][1]; double a = cos(theta), b = sin(theta);double x0 = a*rho, y0 = b*rho;// 转换为平面坐标的四个点pt1.x = cvRound(x0 + 1000 * (-b));pt1.y = cvRound(y0 + 1000 * (a));pt2.x = cvRound(x0 - 1000 * (-b));pt2.y = cvRound(y0 - 1000 * (a));line(dst, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA);}imshow("matt", src);imshow("hough-line-detection", dst);waitKey(0);
}
2.运行结果
结语
1.例子很简单,没有什么难度,但应用时肯定要按自己的数据去做相关参数的设定。
2.关于工程的源码,运行程序时的bug,都可以加这个群(487350510)互相讨论学习。
OpenCV3图像处理——霍夫曼变换直线检测相关推荐
- GHT(广义霍夫曼变换)
转载自:https://blog.csdn.net/weixin_40955254/article/details/83655703 研一的生活真的是精彩而又充实忙的跟狗一样,每天在学新的东西,忙的不 ...
- Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示
Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示 第一章:霍夫变换检测圆 ① 实例演示1 ② 实例演示2 ③ 霍夫变换函数解析 第二章:Python + openc ...
- 图像处理—霍夫曼编码
图像压缩编码是专门研究图像数据压缩的技术,就是尽量减少表示数据图像所需要的数据量. 本章主要介绍图像压缩编码的基础知识,重点讲解常用的图像压缩编码方法,如霍夫曼编码.香农编码.算术编码.行程编码和预测 ...
- opencv 霍夫曼变换 直线提取
import cv2 import numpy as np img = cv2.imread("hd.jpeg", 0)img = cv2.GaussianBlur(img,(3, ...
- 直线检测——对比M-LSD直线检测(基于深度学习)与霍夫曼直线检测
前言 1.直线检测在好多实现应用中能用到到,比如文档扫描,辅助驾驶中的车道线检测,传统的算法用的最多应该属于霍夫曼直线检测,但传统算法都有一个痛苦的调参过程和只能对优化过的使用场景有较好的结果,换个场 ...
- LSD直线检测和霍夫线变换的学习建议
最近笔者学习霍夫线变换和LSD直线检测算法,有一些学习建议,希望可以给予大家一些帮助. 学习霍夫变换的感想 每个人理解的霍夫变换或许略有差异,但是最主要的是笛卡尔坐标系跟极坐标系的相互转换. 霍夫变 ...
- python 霍夫直线变换_OpenCV-Python 霍夫线变换 | 三十二
目标 在这一章当中, 我们将了解霍夫变换的概念. 我们将看到如何使用它来检测图像中的线条. 我们将看到以下函数:cv.HoughLines(),cv.HoughLinesP() 理论 如果可以用数学形 ...
- OpenCV-Python 霍夫线变换 | 三十二
目标 在这一章当中, 我们将了解霍夫变换的概念. 我们将看到如何使用它来检测图像中的线条. 我们将看到以下函数:cv.HoughLines(),cv.HoughLinesP() 理论 如果可以用数学形 ...
- OpenCV系列之霍夫线变换 | 三十二
目标 在这一章当中, 我们将了解霍夫变换的概念. 我们将看到如何使用它来检测图像中的线条. 我们将看到以下函数:cv.HoughLines(),cv.HoughLinesP() 理论 如果可以用数学形 ...
最新文章
- 微软正式提供Visual Studio 2013正式版下载(附直接链接汇总)
- Hulu直播服务难点解析(二):系统设计与实现
- STM32F1笔记(七)WWDG窗口看门狗
- 分析师视角:2018年的数据中心3大预测
- Nat Genet | 杨俊/岳峰团队合作揭示GATA3的遗传性非编码变异增加儿童急性淋巴细胞白血病风险的新机制...
- Python_爬虫_BeautifulSoup网页解析库
- Intellij idea创建maven项目并配置tomcat
- Codeblocks中文乱码解决方法。
- python之简易飞机大战
- Photoshop教程实例讲解
- 库卡c2机器人编程语言,有一篇文章知道库卡-C2机器人的内部结构
- 计算机考完试后感想,期中考试后的感想(精选10篇)
- python调用浏览器内核_python做个谷歌内核浏览器
- android布局 哪个控件在最上层_Android 在最上层添加悬浮View(兼容Android 8.0)
- mumu安卓模拟器使用教程
- NPOI导出Excel自动计算公式问题
- 编写SPI DAC驱动程序
- PHP empty()函数的使用
- 【数据结构】队列(链队列、循环队列)的存储结构及基本运算(C语言)
- 超市奖票兑换(pta-java)