C++ 代码背后的逻辑

C++ 代码背后的逻辑,c++,C++,这是从opencv霍夫线,有人能解释我,改变它后,笛卡尔 为什么他们加了a+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) {

这是从opencv霍夫线,有人能解释我,改变它后,笛卡尔 为什么他们加了a+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 );
        }
#包括
#包括
#包括
int main(int argc,字符**argv)
{
IplImage*src;
如果(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*行=0;
int i;
cvCanny(src,dst,50,200,3);
CVT颜色(dst、颜色dst、CV灰度2BGR);
#如果1
线条=cvHoughLines2(dst,
存储
CV_HOUGH_标准,
1.
CV_PI/180,
100,
0,
0 );
对于(i=0;i总数,100);i++)
{
float*行=(float*)cvgetsequelem(行,i);
float rho=直线[0];
浮点θ=线[1];
CVP点pt1、pt2;
双a=cos(θ),b=sin(θ);
双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(颜色测试,pt1,pt2,CV_RGB(255,0,0),3,8);
}

也许他们想得到给定中心周围的边界矩形的角?

因为Cos和Sin从-1到+1,所以Hough accumalator空间的原点是0,0

假设你的显示有正的大小,在屏幕中间有图的中心是很方便的。

< P>这是一个黑客。< /P> 试试这个。按原样运行示例。删除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,则为原始图像 代码不起作用


罗伊

我看不到答案,它是空白的,你能再给我发一份答案吗