#include <cv.h>
#include <highgui.h>
#include <math.h>
int main(int argc, char** argv)
{
IplImage* src;
if( argc == 2 && (src=cvLoadImage(argv[1], 0))!= 0)
{
IplImage* dst = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* color_dst = cvCreateImage( cvGetSize(src), 8, 3 );
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* lines = 0;
int i;
cvCanny( src, dst, 50, 200, 3 );
cvCvtColor( dst, color_dst, CV_GRAY2BGR );
#if 1
lines = cvHoughLines2( dst,
storage,
CV_HOUGH_STANDARD,
1,
CV_PI/180,
100,
0,
0 );
for( i = 0; i < MIN(lines->total,100); i++ )
{
float* line = (float*)cvGetSeqElem(lines,i);
float rho = line[0];
float theta = line[1];
CvPoint 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));
cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, 8 );
}
答案 0 :(得分:1)
Cos和Sin从-1到+1,因此Hough accumalator空间的原点是0,0。
假设您的显示器尺寸正确,则可以方便地将绘图的中心放在屏幕中间。
答案 1 :(得分:0)
也许他们想要在给定中心周围找到边界矩形?
答案 2 :(得分:0)
这是一个黑客攻击。
试试这个。按原样运行示例。删除1000的4个实例。您将获得点而不是线。 输入750而不是1000.你得到的结果与放入1000的结果相同。
1000是为了确保在图像上绘制线条。您也可以执行以下操作,即 好一点:
在调用HoughLines(...)之后,添加以下内容:
int h = src.rows;
int w = src.cols;
int factor = (int) (sqrt(h * h + w * w)); // diagonal length of the image, maximum line length
然后乘以因子而不是1000。如果您的图像大于1000x1000,则为原始图像 代码不起作用。
罗伊