无法使用 cv CornerHarris() 获得输出结果

Posted

技术标签:

【中文标题】无法使用 cv CornerHarris() 获得输出结果【英文标题】:Cant get output result using cvCornerHarris() 【发布时间】:2011-06-28 01:37:52 【问题描述】:

我只是想试试openCV的功能——cvCornerHarris。这是我的 C++ 代码:

//image file
    char imagePath[256] = "./images/lena512color.tiff";
    printf("%s\n", imagePath);

    IplImage* srcImg = cvLoadImage(imagePath, 1);
    if(NULL == srcImg)
        printf("Can not open image file(s).\n");
        return -1;
    
    IplImage* srcImgGry = cvCreateImage(cvGetSize(srcImg), IPL_DEPTH_8U, 1);
    cvCvtColor(srcImg, srcImgGry, CV_RGB2GRAY);
    // Canny and Harris expect grayscale  (8-bit) input.
    // And output of harris image must be 32-bit float .
    IplImage* harrisImg = cvCreateImage(cvGetSize(srcImg), IPL_DEPTH_32F, 1);
    IplImage* cannyImg = cvCreateImage(cvGetSize(srcImg), IPL_DEPTH_8U, 1);

    //// Corner detection using Harris-corner
    cvCornerHarris(srcImgGry, harrisImg, 5, 5, 0.04);
    cvCanny(srcImgGry, cannyImg, 50, 100, 3);

    // (5)Display the result
    cvNamedWindow ("Img", CV_WINDOW_AUTOSIZE);
    cvShowImage ("Img", srcImgGry);
    cvNamedWindow ("Harris", CV_WINDOW_AUTOSIZE);
    cvShowImage ("Harris", harrisImg);
    cvNamedWindow ("Canny", CV_WINDOW_AUTOSIZE);
    cvShowImage ("Canny", cannyImg);
    cvWaitKey (0);

    cvDestroyWindow ("Harris");
    cvDestroyWindow ("Img");
    cvReleaseImage (&srcImg);
    cvReleaseImage (&srcImgGry);
    cvReleaseImage (&harrisImg);
    cvReleaseImage (&cannyImg);

我可以获得cvCanny (cannyImg) 的预期输出图像,但cvCornerHarris (harrisImg) 的输出图像是黑色图像,上面没有任何内容。 请帮助解释如何使用此功能cvCornerHarris。谢谢!

【问题讨论】:

我们在哪里可以找到您用于测试的图像? 您似乎正在使用一个您以前从未使用过的函数 (cvCornerHarris),因此不要将它放在代码中间并期望它开箱即用。这是一个提示,好吗?不要生气。仅这种做法就可以为您节省大量编码时间。因此,将来,将您的问题隔离为一个最小的示例,不要害怕使用它并测试其他参数。如果你这样做了,你最终会找到一组适合你的参数。 【参考方案1】:

一切都与参数有关!人们倾向于相信有一些神奇的参数适用于所有类型的图像和场景。不幸的是,这在现实世界中不会发生。

用于处理一个图像的参数在应用于其他类型的图像时可能不会产生相同级别的结果。现在,考虑以下代码:

IplImage* colored = cvLoadImage("house.jpg", CV_LOAD_IMAGE_UNCHANGED);
if (!colored)

    printf("Can not open image file(s).\n");
    return -1;


IplImage* gray = cvCreateImage(cvGetSize(colored), IPL_DEPTH_8U, 1);
cvCvtColor(colored, gray, CV_RGB2GRAY);

IplImage* harris = cvCreateImage(cvGetSize(colored), IPL_DEPTH_32F, 1);
cvCornerHarris(gray, harris, 3, 11, 0.07);

cvNamedWindow("Harris", CV_WINDOW_AUTOSIZE);
cvShowImage ("Harris", harris);

正如您在下面看到的,这些参数产生了一个不错的结果(在我看来)。但是,请记住,它们可能不适合您。正如您在测试中观察到的那样,错误的参数会产生黑色图像(即不会检测到任何东西)。

答案是:查看文档以了解这些参数的含义以及它们如何影响结果。最重要的是,与他们一起玩,直到他们制作出满足您需求的图像。

输入图片:

(来源:123desenhosparacolorir.com)

输出

【讨论】:

非常感谢!我终于有结果了。我试图找出 cvCornerHarris 和 cvGoodFeaturesToTrack 之间的区别。我认为结果将是角落而不是边缘的位置。而且至少我知道我误解了 cvCornerHarris 的功能。 您熟悉我们的工作方式吗?查看您的所有问题并接受帮助您解决问题的答案。如果本帖有任何问题,请点击答案旁边的复选框,将其选为本题的官方答案。

以上是关于无法使用 cv CornerHarris() 获得输出结果的主要内容,如果未能解决你的问题,请参考以下文章

cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

将八度矩阵转换为 oct 文件中的 cv::Mat

无法获得所需的掩码检测输出

OpenCV中的Harris角点检测

使用 sklearn 嵌套交叉验证获得最佳参数

opencv亚像素级角点检测