1
#include <cv.h>
#include <highgui.h>
#include <math.h>

int main(int argc, char** argv)
{
    IplImage* src;
    if( argc == 2 && (src=cvLoadImage("qqqq.jpg", 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 );
        }
#else
        lines = cvHoughLines2( dst,
                               storage,
                               CV_HOUGH_PROBABILISTIC,
                               1,
                               CV_PI/180,
                               80,
                               30,
                               10 );
        for( i = 0; i < lines->total; i++ )
        {
            CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
            cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, 8 );
        }
#endif
        cvNamedWindow( "Source", 1 );
        cvShowImage( "Source", src );

        cvNamedWindow( "Hough", 1 );
        cvShowImage( "Hough", color_dst );

        cvWaitKey(0);
    }

}

我将此代码用于opencv中的“霍夫变换”来检测图像中的对象。并且程序运行没有任何错误。但结果只是一个控制台窗口快速出现并快速消失。我该怎么做。

4

1 回答 1

1

这是你在那里得到的一些糟糕的逻辑:

  • 第一:如果argc大于或小于 2,您的主代码将不会运行,也不会通知您。
  • 第二:如果由于任何原因cvLoadImage()失败,您也不会收到通知。

我怀疑这两种情况之一正在发生:要么您没有使用正确数量的参数调用程序,要么cvLoadImage()失败(无法找到文件或不支持文件类型)。

我建议您添加适当的调试(printf 调用)以查看实际情况。

编辑:

几点注意事项:

  • 如果您的图像正在加载"qqqq.jpg"并且如果您正在从 Visual Studio 中运行程序,则需要将图像放在与源代码文件相同的文件夹中(而不是放在 .exe 所在的文件夹中);
  • 如果您使用的是 Windows 并尝试使用完整路径加载图像,请不要忘记转义斜杠:C:\\folder\\qqqq.jpg
  • 仅供参考,argc == 2意味着您正在使用以下格式从命令行运行应用程序:app.exe param1
于 2012-06-04T02:08:25.260 回答