3

OpenCVを使用して画像を読み取ります。次に、Matlabを使用して同じ画像を読み込みます。次に、画像を表示します。OpenCVがロードされた画像の場合、画像は内部に画像がなく、灰色の平面のみです。Matlabでロードされた画像の場合、必要な画像が含まれています。画像のピクセル値は、0.0021のような非常に小さな浮動小数点データです。画像の読み込みに使用したコードは次のとおりです。

`Mat image(IMAGE_ROW, IMAGE_COL, CV_64FC3);
Mat  gray(IMAGE_ROW, IMAGE_COL, CV_64FC1);
image = imread(filespath, CV_LOAD_IMAGE_COLOR );// Read the file
cv::imshow("Image", image);
cvtColor( image, gray, CV_BGR2GRAY, 1);
cv::imshow("gray", gray);`

Matlabによってロードされたものと同じ画像を取得できないのはなぜですか?

4

4 に答える 4

8

前に述べたように、 imwrite()/imread() ではできません。

ただし、次のように、FileStorage を使用して浮動小数点マットを保存/ロードできます。

Mat fm = Mat::ones(3,3,CV_32FC3); // dummy data

FileStorage fs("my.yml", FileStorage::WRITE );
fs << "mat1" << fm;  //choose any key here, just be consistant with the one below

そして読み返します:

Mat fm;
FileStorage fs("my.yml", FileStorage::READ );
fs["mat1"] >> fm;
于 2013-03-08T09:26:39.667 に答える
2

cv::Matを呼び出す前に画像を明示的に初期化する必要はありませんcv::imread。読み取った画像のサイズと形式に従って画像を適切に初期化します。したがって、イメージを で初期化したかどうかは問題ではありません(IMAGE_ROW, IMAGE_COL, CV_64FC3)

OpenCV には、浮動小数点イメージを読み書きする機能がありません。cv::imwriteマニュアルから:

この関数を使用して保存できるのは、8 ビット (PNG、JPEG 2000、および TIFF の場合は 16 ビット) のシングル チャネルまたは 3 チャネル ('BGR' チャネル順) の画像のみです。

于 2013-03-08T08:16:01.427 に答える
0

@berak ソリューションを試してみましたが、「Missing , between elements」という例外が発生しました。このバグ レポートに記載されているように、書き込み操作の後に FileStorage オブジェクトを解放する必要があります。解放しないと、ファイルの書き込みが適切に終了せず、例外が発生します。次に、コードレットの修正バージョンは次のようになります。

Mat fm = Mat::ones(3,3,CV_32FC3); // dummy data
FileStorage fs("my.yml", FileStorage::WRITE );
fs << "mat1" << fm;  //choose any key here, just be consistant with the one below
fs.release(); //Release the file and finish the writing.
于 2015-07-01T14:15:27.637 に答える