2017-05-02 18 views
1

私はOpenCVへの新規採用です。なぜそれが発生したのか、わからないというエラーが発生しました。それを解決する。OpenCVでグレースケール画像の種類をCV_32Fに変換する際、MatのconvertTo関数がアサートエラーを返す

コードがあります。

#include <iostream> 
#include <opencv2/opencv.hpp> 

using namespace cv; 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
    Mat I = imread("water.jpg", 0); 
    Mat W = imread("laosiji.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
    cout << I.channels() << endl; 
    Mat CI(I.rows,I.cols,CV_32FC); 
    I.convertTo(CI, CV_32FC); 
    Mat FI; 
    Mat IFI; 

    dft(CI,FI,DFT_COMPLEX_OUTPUT | DFT_SCALE); 
    idft(FI,IFI); 
    imshow("water.jpg after idft transformation",IFI); 

    return 0; 
} 

私はプログラムを実行している間、それは私にエラーを与えた:

OpenCV Error: Bad number of channels (Source image must have 1, 3 or 4 channels) in cvConvertImage, file /var/tmp/portage/media-libs/opencv-3.1.0-r7/work/opencv-3.1.0/modules/imgcodecs/src/utils.cpp, line 611 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /var/tmp/portage/media-libs/opencv-3.1.0-r7/work/opencv-3.1.0/modules/imgcodecs/src/utils.cpp:611: error: (-15) Source image must have 1, 3 or 4 channels in function cvConvertImage 

私はいじるするためしかし、上記のコードから、プログラムによって出力チャネルは1.Itのは難しいですこの問題はOpenCVに慣れていないので、ベテランが出てきて私のために説明することができますか?前もって感謝します。

+0

好奇心から離れて、なぜあなたは 'imread'への1回の呼び出しで' 0'を、もう片方で 'CV_LOAD_IMAGE_GRAYSCALE'を使うのですか? ( 'CV_LOAD_IMAGE_GRAYSCALE == 0'より) –

+0

さらに、私はこれがどのようにコンパイルされるのかよく分かりません。なぜなら[' CV_32FC'](https://github.com/opencv/opencv/blob/3.1.0/modules/ core/include/opencv2/core/cvdef.h#L413)マクロはパラメータ(チャネル数)をとります。これは簡単に犯人になる可能性があり、暗黙のうちにいくつかの奇数のチャンネルを与えます。あなたは警告をエラーとして扱わないと思いますか? :) |とにかくそれらは1チャンネルの画像なので、なぜCV_32FC1ではないのですか?最後に、 'Mat CI(I.rows、I.cols、CV_32FC);の初期化は冗長です。デフォルトのままにしておけば、' convertTo'はあなたのために正しいことを行います。 –

+0

もう1つ - デバッガを使用しましたか?あるいは、例外は 'convertTo'への可視コールから来ていると仮定しましたか?ここでの私のテストに基づいているので、2チャンネルのIFIマトリックスが与えられているので、それを投げる 'imshow'です(あなたはデフォルトで複雑な結果を得ています)。 –

答えて

0

この回答は@DanMašekによって書かれています。しかし、私は数日間待っていて応答がありません。その結果、私は自分でそれに答える必要があります。    まず、エラーの要点はconvertTo()の明示的な呼び出しではありません。それ以外の場合は、imshow()関数の暗黙の呼び出しによって発生します。私のコードから、私はidft()の後にimshow()を呼び出します。しかし、idft()は、2つのチャネルを持つ行列を返します。 convertToの暗黙的な呼び出しには、1,3、または5チャネルの引数を持つ行列が必要です。エラーが発生しました。

関連する問題