0

次のコードがあるとします。

#include "stdafx.h"
#include "opencv\highgui.h"
#include "opencv2\imgproc\imgproc.hpp"
#include "opencv2\core\core.hpp"
#include "opencv\cv.h"

using namespace cv;


IplImage* doPyrDown(IplImage*,int );
IplImage* doCanny(IplImage*,double,double,double);

int main()
{
    const char*a ="D:\\s.jpg" ;
    IplImage* in = cvLoadImage(a);
    IplImage* img1 = doPyrDown( in, IPL_GAUSSIAN_5x5 );
    IplImage* img2 = doPyrDown( img1, IPL_GAUSSIAN_5x5 );
    IplImage* img3 = doCanny( img2, 10, 100, 3 );
    cvNamedWindow("in",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("img1",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("img2",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("img3",CV_WINDOW_AUTOSIZE);
    cvShowImage("in",in);
    cvShowImage("img1",img1);
    cvShowImage("img2",img2);
    cvShowImage("img3",img3);
    cvWaitKey(0);
    cvReleaseImage( &in );
    cvReleaseImage( &img1 );
    cvReleaseImage( &img2 );
    cvReleaseImage( &img3 );
    cvDestroyWindow("in");
    cvDestroyWindow("img1");
    cvDestroyWindow("img2");
    cvDestroyWindow("img3");
    return 0;
}




//Using cvPyrDown() to create a new image that is half the width and height of the input
//image
IplImage* doPyrDown(IplImage* in,int filter = CV_GAUSSIAN_5x5)
{
// Best to make sure input image is divisible by two.
    //
    assert( in->width%2 == 0 && in->height%2 == 0 );
    IplImage* out = cvCreateImage(cvSize( in->width/2, in->height/2 ),in->depth,in->nChannels);
    cvPyrDown( in, out );
    return( out );
}

 //The Canny edge detector writes its output to a single channel (grayscale) image
 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(cvGetSize(in),IPL_DEPTH_8U,1);
    cvCanny( in, out, lowThresh, highThresh, aperture );
    return( out );
  }  

このコードにはコンパイル エラーはありません。問題は、ウィンドウに画像が表示されないことです。これはimg3、私が提供するすべての画像を非単一チャネル画像として識別し 、コンピューターで見つかったすべてのグレースケール画像を試してネットを検索しif(in->nChannels != 1)たコードを入力して実行するためです。return(0);
単一チャネルの画像の場合ですが、すべてにこの問題があります。私はブレークポイントを置き、私が与えたすべての画像に対してコードを段階的に試しました??!!!!
openCV ライブラリのシングル チャネル イメージとして知られているイメージの種類を教えてください。また、上記のコードで動作するようなイメージへのリンクを教えてください。

4

1 に答える 1

3

こちらのドキュメントをご覧ください。

画像の読み込みに使用する関数の定義は次のとおり IplImage* cvLoadImage(const char* filename, int iscolor=CV_LOAD_IMAGE_COLOR)です。

がデフォルトで使用されることを意味しCV_LOAD_IMAGE_COLORます。画像をグレースケールでロードする場合CV_LOAD_IMAGE_GRAYSCALEは、コメントで提案されているように を使用します。

IplImage* in = cvLoadImage(a,CV_LOAD_IMAGE_GRAYSCALE);

要約すると、画像をカラー画像としてロードするか、グレースケール画像としてロードするかを OpenCV に指示する必要がありますカラー画像をグレースケール画像として開くように要求すると、OpenCV は単純にそれを変換します。

于 2013-07-08T14:12:06.517 に答える