4

フレーム グラバーからの画像データを OpenCV Mat 形式に解析する際に問題があります。EDT フレーム グラバーから unsigned char ポインターとして画像データを取得し、新しく作成した Mat に渡すことができますが、その過程で貴重なデータが失われ、修正方法がわかりません。

私のカメラは、12 ビット 320x256 ベイヤー画像を出力する赤外線カメラです。私は、EDT の API の使用が正しいと確信しています。EDT のソフトウェア「pdvshow」を使用すると、イメージ データは期待どおりに表示できますが、返されたフレームを EDT の API から OpenCV Mat に変換して表示すると、かなりの量のデータが失われます。マットを CV16UC1 に設定すると、フレームは黒に近くなり、マットを CV8UC1 に設定すると、フレームにほとんどのデータが表示されますが、非常に粗く見え、一部のスポットが完全に吹き飛ばされます。フレーム グラバーが各 12 ビット ピクセルを 2 バイトで格納し、データが MSB 詰めされていることはわかっています。GetStride は 0 を返します。

unsigned char *pdvImage;
pdvImage = pdv_image(pdv_p); 

cv::Mat freshFrame;
freshFrame = cv::Mat(GetHeight(), GetWidth(), CV_16UC1, pdvImage, GetStride()); //was CV_16UC1 but 8UC1 shows more data

return freshFrame.clone();
4

2 に答える 2

2

char* 画像を描画して OpenCV Mat に変換するコードを作成しました。

const int WIDTH = 800, HEIGHT = 600;

uchar *data = new uchar[WIDTH * HEIGHT * 3];

for (int i = 0; i < WIDTH*HEIGHT*3;i+=3)
{
    if (i < WIDTH*HEIGHT*3/2)
    {
        data[i + 0] = (uchar)0;
        data[i + 1] = (uchar)0;
        data[i + 2] = (uchar)255;
    }
    else
    {
        data[i + 0] = (uchar)255;
        data[i + 1] = (uchar)0;
        data[i + 2] = (uchar)0;
    }
}

cout << "May God be pleased with you, amen!\n";

Mat colorfrm = Mat(HEIGHT, WIDTH, CV_8UC3);
colorfrm.data = data;

while (1)
{
    imshow("Original Image", colorfrm);

    /////////

    int c = cvWaitKey(30);
    if (c == ' ')
    {
        break;
    }
    if (c == 'q' || c == 'Q' || c == 27)
    {
        return 0;
    }
}

これが役立つことを願っています!

于 2014-10-17T02:36:25.960 に答える
1

CV_16UC1 マットとして作成するfreshFrameと、12 ビットのデータは最下位ビットになります。データをスケーリングすると、結果の画像が黒すぎる問題が修正されます。だから代わりに

return freshFrame.clone();

あなたが必要

return freshFrame * 16;

の各ピクセルの 2 バイトのバイト順を確認する必要がある場合もありますpdvImage

CV_8UC1 に関しては、これは機能しません

freshFrame = cv::Mat(GetHeight(), GetWidth(), CV_8UC1, pdvImage, GetStride()); 

の最初の 2 バイトがpdvImage画像の最初のピクセルの値を構成しますが、freshFrame では 2 つの別個のピクセルになるためです。ただし、freshFrame上記の行のように作成すると、最初のバイトが最初のピクセルの値にfreshFrameなり、2 番目のバイトが 2 番目のピクセルの値になります。明らかにこれは間違っています。CV_8UC1 マットが本当に必要な場合は、CV_16UC1 マットを作成してから変換するのが最も簡単でしょう。

于 2013-10-04T02:15:18.937 に答える