0

高出力カメラ (Allied Vision Technologies Prosilica GT2750) でキャプチャした画像から 24 ビットマップ画像を作成しようとしています。これが私がこれまでに持っているものです:(VmbUInt32は「typedef unsigned __int32 VmbUint32_t;」として定義されており、VmbUchar_tは単なる符号なし文字であることに注意してください)

        VmbUint32_t imageSize = 0;
        pFrame->GetImageSize(imageSize); //imageSize = 6054400

        VmbUint32_t imageWidth = 0;
        pFrame->GetWidth(imageWidth);    //imageWidth = 2752
        VmbUint32_t imageHeight = 0;
        pFrame->GetHeight(imageHeight);  //imageHeight = 2200

        //////////////////////////////////////////////////////////////////////////
        //////////  Set Bitmap Settings   ////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////

        //file header
        BITMAPFILEHEADER* bf = new BITMAPFILEHEADER;
        bf->bfType              = 0x4d42;
        bf->bfSize              = imageSize + 40 + 14; //image size + infoheader size + fileheader size 
        bf->bfOffBits           = 54;

        //info header
        BITMAPINFOHEADER* bi = new BITMAPINFOHEADER;
        bi->biSize              = 40;
        bi->biWidth             = imageWidth;
        bi->biHeight            = imageHeight;
        bi->biPlanes            = 1;
        bi->biBitCount          = 24;
        bi->biCompression       = 0;
        bi->biSizeImage         = imageSize;
        bi->biXPelsPerMeter     = 2835;
        bi->biYPelsPerMeter     = 2835;
        bi->biClrUsed           = 0;
        bi->biClrImportant      = 0;


        //image data
        VmbUchar_t* imageData = new VmbUchar_t[imageSize];
        pFrame->GetImage(imageData);


        //////////////////////////////////////////////////////////////////////////
        //////////  Output File to .bmp   ////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////


        std::ofstream outFile;

        outFile.open("test.bmp", std::ios::binary|std::ios::out);

        outFile.write(reinterpret_cast<char *>(bf), sizeof(BITMAPFILEHEADER));
        outFile.write(reinterpret_cast<char *>(bi), sizeof(BITMAPINFOHEADER));
        outFile.write(reinterpret_cast<char *>(imageData), imageSize);

        outFile.close();

基本的に何が起こっているかというと、データは正しく test.bmp に書き込まれていますが、test.bmp は標準の画像ビューアーではまだ開くことができません。16 進エディタで test.bmp を見ると、すべて問題ないように見えます。imageData が適切に機能していることはわかっています。これは、ライトを最大に上げると、imageData は FF (白) の集まりにすぎず、ライトをオフにすると、imageData のすべてのピクセルが 00、01、または 02 になるためです。(別名黒または黒に近い)。したがって、ファイルの imageData 部分は正しく書き込まれています。提供されたソフトウェアを使用してカメラの画像を表示できるので、カメラが正常に動作することを確認できます (これは、光が白い画面になるのに十分な明るさ​​であり、黒い画面になるのに十分暗いことを確認するために使用したものでもあります)。ただし、ファイルヘッダーまたは情報ヘッダーのいずれか (または両方) に何か問題があるはずです。

ファイル ヘッダーと情報ヘッダーの 16 進数データは次のとおりです。

42 4D 36 62 5C 00 CD CD CD CD 36 00 00 00 28 00 00 00 C0 
0D 0A 00 00 98 08 00 00 01 00 18 00 00 00 00 00 00 62 5C 
00 13 0B 00 00 13 0B 00 00 00 00 00 00 00 00 00 00

imageSize、imageWidth、および imageHeight は、各実行で同じ (それぞれ 6054400、2752、2200) であり、それらを取得する関数はカメラの API からのものです。これらは適切に機能し、単に整数を返します (少なくとも、私の自動車で見ているものから)。

その他の情報: Visual Studio 2010 を使用しています。

TL;DR: ファイル ヘッダーや情報ヘッダーの何が問題になっていますか?

4

1 に答える 1