从图像中检测出直线蛮有趣的。
最近研究了下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函数。