代码背后的逻辑

时间:2010-07-08 15:55:02

标签: c++

这是来自opencv hough行,任何人都可以解释我,改变它后笛卡儿 为什么他们增加了+ 1000,-b * 1000

#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 );
        }

3 个答案:

答案 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,则为原始图像 代码不起作用。

罗伊