霍夫变换的原理 及 一种参数迭代的自适应寻找最佳霍夫直线的代码(在条码识别中的应用)
来源:互联网 发布:js转换日期格式 编辑:程序博客网 时间:2024/05/08 05:07
霍夫变换(Hough Transform)是一种识别几何形状的方法!霍夫变换的基本原理是利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。霍夫变换于1962年由Paul Hough 首次提出,后于1972年由Richard Duda和Peter Hart推广使用,经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。
1、霍夫线变化
设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。我们知道,直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一族直线。方程y0=kx0+b在参数k--b平面上是一条直线,(你也可以是方程b=-x0*k+y0对应的直线)。这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设图像上的直线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(2,2)。可以求出,过A点的直线的参数要满足方程b=0, 过B点的直线的参数要满足方程1=k+b, 过C点的直线的参数要满足方程2=2k+b, 这三个方程就对应着参数平面上的三条直线,而这三条直线会相交于一点(k=1,b=0)。 同理,原图像上直线y=x上的其它点(如(3,3),(4,4)等) 对应参数平面上的直线也会通过点(k=1,b=0)。这个性质就为我们解决问题提供了方法,就是把图像平面上的点对应到参数平面上的线,最后通过统计特性来解决问题。假如图像平面上有两条直线,那么最终在参数平面上就会看到两个峰值点,依此类推。
对于看了上述概念描述还没有头绪的可以学习这个PPT
https://wenku.baidu.com/view/18787c768e9951e79b89270e.html?from=search:
下面截了几张图帮助理解:
1)对于空间坐标中的一条直线,相当于是Hough坐标中的一个点
2)对于空间坐标中的一个点,相当于是Hough坐标中的一条线
3)Hough坐标中两条线的交点用来表示过点(x0,y0)和点(x1,y1)的直线
2、OpenCv霍夫变换---在条码识别中的应用
霍夫变换在OpenCV中的函数名称为HoughLines,其中最为关键的是设置其第三个参数rho,对于傅里叶变换后的图像要拟合霍夫直线,如果rho的值取得很大会导致所拟合的直线满天飞,而rho的值如果取得很小则拟合不出直线。如何设计代码得到最为精确的拟合直线是关键技术。以下方法是:通过逐渐扩大rho的值,而从达到寻找最佳霍夫直线的要求。(通过参数迭代的方式达到自适应寻找直线的效果)
条码识别的HoughLines可设计为如下代码:
void HoughAngle(Mat FourierImage, Mat &Linemat, float &angelD) {// HoughLines查找傅里叶频谱的直线,该直线跟原图的一维码方向相互垂直vector<Vec2f> lines;float pi180 = (float)CV_PI / 180;// 取最佳霍夫直线double HoughLineRho = 0.1;HoughLines(FourierImage, lines, HoughLineRho, pi180, 100, 0, 0);while (!lines.size() && HoughLineRho < 20){HoughLineRho = HoughLineRho + 0.1;HoughLines(FourierImage, lines, HoughLineRho, pi180, 100, 0, 0);}cout << "霍夫直线为: " << lines.size() << endl;Linemat = FourierImage.clone();// 计算霍夫直线 float theta = 0; // 最终theta的取值问题直接影响结果 // 绘制霍夫直线,若没有将霍夫直线拟合出来,则不进行绘制for (int l = 0; l < lines.size(); l++) {float rho = lines[l][0];theta = lines[l][1];float aa = (theta / CV_PI) * 180;Point pt1, pt2;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(Linemat, pt1, pt2, Scalar(255, 0, 0), 3, 8, 0); // 原图上绘制霍夫变换的曲线} //计算霍夫直线的角度,最终theta的取值问题直接影响结果if (lines.size()) {theta = lines[0][1];}angelD = 180 * theta / CV_PI - 90;}
- 霍夫变换的原理 及 一种参数迭代的自适应寻找最佳霍夫直线的代码(在条码识别中的应用)
- 霍夫变换在图像处理中的应用(寻找图像中的直线)
- 计算机视觉中经常需要识别或者定位某些几何图形,比如直线、圆、椭圆,还有其他一些图形。检测直线的霍夫变换提供了在图像中寻找直线的一种算法,是最简单的一种情形,后来发展到检测圆、椭圆、还有一般图形的霍夫变
- 利用霍夫变换做直线检测的原理及OpenCV代码实现
- 霍夫线变换是一种用来寻找直线的方法.
- 霍夫线变换是一种用来寻找直线的方法
- 霍夫变换的直线检测原理和注意事项
- 对霍夫直线变换返回的直线参数进行遍历
- 霍夫变换的原理及实例
- 图像识别中距离变换的原理及作用详解,并附用OpenCV中的distanceTransform实现距离变换的代码!
- 霍夫变换直线检测及原理理解
- 霍夫变换检测直线及openCV代码
- opencv霍夫变换检测圆cvHoughCircles和直线cvHoughLines2的应用
- 霍夫变换检测直线原理分析
- 霍夫变换直线检测houghlines及opencv的实现分析
- 霍夫变换直线检测houghlines及opencv的实现分析
- 霍夫变换直线检测houghlines及opencv的实现分析
- [转发]霍夫变换直线检测的基本原理
- IAR编译CC2640常见错误及解决方法
- InnoDB行锁的实现方式
- MySQL之innodb_flush_log_at_trx_commit和sync_binlog参数详解
- HTML (二)—— 图片标签
- java_继承中的构造方法
- 霍夫变换的原理 及 一种参数迭代的自适应寻找最佳霍夫直线的代码(在条码识别中的应用)
- python生成验证码
- zookeeper安装教程(伪分布式和分布式)
- 好玩的CMD命令行
- leetcode 28. Implement strStr()
- 2184: 不是防AK题
- 内存管理--程序的装载
- 前端<ul>分页实现
- SQLi-Labs 练习总结 Page-1 Less-1