我正在学习opencv并阅读一本书和以下示例。这本书介绍了canny过滤器。但是我的输出存在一些问题。作为输入图像,我给出了512x512灰度图像,但滤镜输出是纯灰色图像。这是图像:
这是输入图像。
这是输出图像。
以下是片段:
#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
答案 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接口。