从图像中检测出直线蛮有趣的。
最近研究了下hough transform,看别人写的原理以及代码。画出直线那有个地方不懂为啥,也没有找到解释。想了大半天才明白。
于是第一篇博客就记录下这个。
float rho = lines[i][0], theta = lines[i][1];
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));
对于opencv 自带的HoughLines(dstImage, lines, 1, CV_PI / 360, 200, 0, 0);得到检测的结果,可以得到极径和角度。
问题是求pt1 pt2时为啥会出现1000?
其实(x0,y0)是该直线经过的一点,1000作为线段的长度,1000*b就是线段长度在x轴的投影长度,而1000*a就是线段长度在Y轴上的投影。
线段的左上角的点为(x0 + 1000 * (-b),y0 + 1000 * (a)),而右下角的点为(x0 - 1000 * (-b),y0 - 1000 * (a))。
line(srcImage, pt1, pt2, Scalar(255, 100, 5), 2, CV_AA);
此函数就画出了一条直线。该直线的长度超过1000,单位是像素?
接下来,试着自己编写标准HoughLine函数。
本文深入探讨了Hough变换在图像处理中的应用,特别是如何从图像中检测直线。通过解析OpenCV中HoughLines函数的实现细节,作者详细解释了如何从极坐标系转换到笛卡尔坐标系来绘制直线,以及为什么在计算直线端点时会使用1000这个数值。
524

被折叠的 条评论
为什么被折叠?



