私は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に慣れていないので、ベテランが出てきて私のために説明することができますか?前もって感謝します。
好奇心から離れて、なぜあなたは 'imread'への1回の呼び出しで' 0'を、もう片方で 'CV_LOAD_IMAGE_GRAYSCALE'を使うのですか? ( 'CV_LOAD_IMAGE_GRAYSCALE == 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'はあなたのために正しいことを行います。 –
もう1つ - デバッガを使用しましたか?あるいは、例外は 'convertTo'への可視コールから来ていると仮定しましたか?ここでの私のテストに基づいているので、2チャンネルのIFIマトリックスが与えられているので、それを投げる 'imshow'です(あなたはデフォルトで複雑な結果を得ています)。 –