2016-07-16 19 views
0

私はopencvを勉強しており、本と次の例を読んでいます。本はキャニーフィルターを紹介した。しかし、私の出力にはいくつか問題があります。入力画像として私は512x512グレースケール画像を与えたが、フィルタ出力は純粋なグレー画像である。画像は次のとおりです。OpenCV canny;出力画像は純粋な灰色です

これは入力画像です。

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

私はあなたのコードをステップ実行すると、あなたはcvCanny機能を実現すると思いますdoCannyから返される出力はNULLポインタです。

OpenCVのCannyエッジ検出アルゴリズムはグレースケール画像しか受け付けないため、元のコードには「if(in nChannels!= 1)」チェックが付いているため、入力画像をグレースケール画像に変換する必要があります。

// 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); 

追加、私はcvCannyのためのあなたの「絞り」のパラメータも無効で、デフォルト値は3(または5、7)を使用しようと思うし、あなたは結果を見ることができるはずです。

廃止予定のCインターフェイスではなく、C++インターフェイスの使用をお勧めします。

+0

うん。私はコードをデバッグしましたが、実際にはイメージはグレースケールではありません。 'in-nChannels'の値は3であるため、呼び出されません。 – Bora

関連する問題