0

32ビット浮動小数点画像のピクセル強度を印刷しようとしています。そして、これが私が使用しているコードです。画像には、MATLAB、NAN、およびフローティングポイントで未読で表示される2種類の値があります。プログラムは画像をロードしますが、実行しようとするとハングします。誰かが私に何が悪かったのか提案できますか?ご協力いただきありがとうございます。

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

void printIplImage(const IplImage* src)
{
    int row = 0,col = 0;
    for(row = 0; row < src->height; row++)
    {
        for(col = 0; col < src->width; col++)
        {       
            printf("%f, ", ((float*)(src->imageData + src->widthStep*row))[col]);
        }
        printf("\n");
    }
}

int main(int argc, char** argv)
{
    IplImage *t3 = cvLoadImage("divimages1.tiff",CV_LOAD_IMAGE_UNCHANGED);

    printIplImage(t3);

    cvReleaseImage (&t3);
    return 0;
}
4

2 に答える 2

0

画像データが 32 ビット float としてロードされていますか? here の説明に従って明示的に変換してみてください

于 2012-05-09T23:52:25.113 に答える
0

ロードしたイメージのデータ型を最初に確認するとよいでしょう。以下は、データ型を知るのに役立つコードです。そして、「フロート」形式でない場合は、まずピクセルの値を独自の形式で抽出し、後で型キャストを行います。私も以前に同様の問題に直面しましたが、それは私を助けました。

これは、実行時に opencv マトリックスを識別するのに役立つ便利な関数です。少なくともデバッグには便利だと思います。

string type2str(int type) {
  string r;

  uchar depth = type & CV_MAT_DEPTH_MASK;
  uchar chans = 1 + (type >> CV_CN_SHIFT);

  switch ( depth ) {
    case CV_8U:  r = "8U"; break;
    case CV_8S:  r = "8S"; break;
    case CV_16U: r = "16U"; break;
    case CV_16S: r = "16S"; break;
    case CV_32S: r = "32S"; break;
    case CV_32F: r = "32F"; break;
    case CV_64F: r = "64F"; break;
    default:     r = "User"; break;
  }

  r += "C";
  r += (chans+'0');

  return r;
}

Mタイプの var の場合は、次のMatように呼び出すことができます。

string ty =  type2str( M.type() );
printf("Matrix: %s %dx%d \n", ty.c_str(), M.cols, M.rows );

次のようなデータを出力します。

Matrix: 8UC3 640x480 
Matrix: 64FC1 3x2 
于 2014-02-10T20:38:36.770 に答える