2

我正在阅读 O'Reilly 系列中的“Learning OpenCV”一书,并尝试执行一个精明的边缘检测示例。

我选择的任何灰度图像似乎都有 3 个通道,据我所知,canny 只适用于单通道图像,所以这总是失败。我什至在使用 OpenCV 提供的图像。

这是我的代码..

IplImage* doCanny(IplImage* in, double lowThresh, double highThresh, double aperture)
{
    if(in->nChannels != 1)
        return(0); //canny only handles gray scale images
    IplImage* out = cvCreateImage(cvSize(in->width, in->height), IPL_DEPTH_8U, 1);
    cvCanny(in, out, lowThresh, highThresh, aperture);
    return(out);
};

IplImage* img = cvLoadImage("someGrayscaleImage.jpg");
IplImage* out = doCanny(img, 10, 100, 3);

为什么这总是给我 3 通道图像?我该如何解决这个问题?

4

1 回答 1

2

您可以将此方法与另一个参数一起使用

IplImage* cvLoadImage(const char* filename, int iscolor=CV_LOAD_IMAGE_COLOR)

#define CV_LOAD_IMAGE_COLOR       1

#define CV_LOAD_IMAGE_GRAYSCALE   0

#define CV_LOAD_IMAGE_UNCHANGED  -1

默认参数是加载带颜色的图像。你要做的是用灰度加载它

这是一个例子

cvLoadImage("yourimage.jpg", CV_LOAD_IMAGE_GRAYSCALE);

这是该方法的详细说明。您可以在此处查看更多详细信息: Open CV 2.0 References

scolor - 加载图像的特定颜色类型:如果$ > 0 $,则加载的图像被强制为3通道彩色图像;如果为0,则加载的图像强制为灰度;如果 $ < 0 $,加载的图像将按原样加载(注意,在当前实现中,alpha 通道(如果有)将从输出图像中剥离,例如 4 通道 RGBA 图像将作为 RGB 加载)。

于 2010-05-10T02:15:03.407 回答