OpenCV canny;输出图像是纯灰色的

时间:2016-07-16 11:17:59

标签: c opencv

我正在学习opencv并阅读一本书和以下示例。这本书介绍了canny过滤器。但是我的输出存在一些问题。作为输入图像,我给出了512x512灰度图像,但滤镜输出是纯灰色图像。这是图像:

这是输入图像。

This is the input image.

这是输出图像。

enter image description here

以下是片段:

#include <opencv\cv.h>
#include <opencv2\highgui\highgui.hpp>
#include "Resources.h"

IplImage* doCanny(
    IplImage* in,
    double lowThresh,
    double highThresh,
    double aperture
) {
    if (in->nChannels !=  1)
    {
         return 0; // Canny only handle gray scale images.
    }

    IplImage* out = cvCreateImage(
        CvSize(cvGetSize(in)),
        IPL_DEPTH_8U,
        1
    );

    cvCanny(in, out, lowThresh, highThresh, aperture);
    return out;
}

int main(int argc, char** argv)
{
    IplImage* image = cvLoadImage(IMAGE_FRUIT);

    IplImage* output = doCanny(image, 200, 201, 1);

    cvNamedWindow("Canny", CV_WINDOW_AUTOSIZE);

    cvShowImage("Canny", output);
    cvWaitKey(0);

    cvReleaseImage(&output);
    cvDestroyWindow("Canny");

    return 0;
}

Visual Studio 2015,OpenCV版本2.4.13

1 个答案:

答案 0 :(得分:1)

我认为如果你单步执行代码,你会发现cvCanny函数永远不会被触发,doCanny返回的输出是一个空指针。

OpenCV的Canny边缘检测算法只接受灰度图像,这就是原始代码具有&#34; if(in-&gt; nChannels!= 1)&#34;检查,因此您需要先将输入图像转换为灰度图像。

// Convert to grayscale first
IplImage* gray_image = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
cvCvtColor(image, gray_image, CV_BGR2GRAY);

// Perform Canny
IplImage* output = doCanny(gray_image, 200, 201, 3);

另外,我认为你的&#34;光圈&#34; cvCanny的参数也无效,尝试使用默认值3(或5,7),您应该能够看到结果。

我还建议使用C ++接口而不是弃用的C接口。