2

このコンストラクターを使用して、メモリに割り当てたデータから Mat オブジェクトを作成しようとしています。

C++: Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)

私は C++ にかなり慣れていないので、どこかで初歩的なエラーを起こしている場合は注意してください。基本的に私がやろうとしているのは、生のビデオファイルから画像を表示することです。これを行うために、ファイルからデータを読み取り、メモリに割り当てました。

struct videoFrame{
    float frameTime;
    unsigned short int year, day, msec;
    unsigned char hour, min, sec;
    unsigned short int mFrame[SIZE];
};

...

//seek to first frame
vfs.seekg(2560, ios_base::beg);
int pos;
for(pos=0; pos<SIZE;pos++){
    vfs.read( (char*) &mVideoFrame1->mFrame[pos], sizeof(short));
}
Mat mImage1( Size(WIDTH, HEIGHT), CV_16UC1, mVideoFrame1->mFrame, HEIGHT * 2);
namedWindow("Frame 1", CV_WINDOW_AUTOSIZE);
imshow("Frame 1", mImage1);
waitKey(0);

フレームビデオヘッダーなど、ファイルからデータを読み取ることができました。コンストラクターがどのように機能するかについて明確ではないかもしれないと思います。誰かが素晴らしい洞察を提供できれば。namedWindowでフレームを表示すると、すべて黒になります。

ところで...

const int HEIGHT = 512;
const int WIDTH = 640;
const int SIZE = HEIGHT * WIDTH * 2;

最初のフレームの生データは 512x640 16 ビットの符号なしリトル エンディアン バイト順の白黒です。

4

2 に答える 2

2

stepは、以上の画像ストライドのサイズですsizeof(_PIXELTYPE) * Width。あなたはあなたの問題を特定していませんが、間違って step を に等しくしたことに注意してください2*HEIGHT。それ以外の場合、コンストラクターの使用は問題ないようです。

編集:もちろん、デフォルトのストライドを計算する自動ステップを使用してください。

于 2013-04-26T13:56:36.510 に答える
2

問題が見つかりました... ファイル内のデータは 16 ビット符号なしですが、各ピクセルの範囲は 12 ビットのみです。それが、ウィンドウが黒く表示されていた理由です。

OpenCV は 12 ビットの符号なしデータの表示をサポートしていないと思われるため、表示するには 8 ビットの符号なしデータに変換する必要がありました。はい、ループではなく、すべてのピクセルデータをブロックで読み取る方がはるかに効率的です。

vfs.read( (char*) &mVideoFrame1->mFrame, sizeof(mVideoFrame1->mFrame));

Mat mImage1(HEIGHT, WIDTH, CV_16UC1, mVideoFrame1->mFrame, Mat::AUTO_STEP);
Mat mine(Size(640,512), CV_8UC1);
mImage1.convertTo(mine, CV_8UC1, 255.0/4095.0);
namedWindow("Frame 1", CV_WINDOW_AUTOSIZE);
imshow("Frame 1", mine);
waitKey(0);

そうそう、難しくなかった笑

于 2013-04-28T03:33:44.447 に答える