1

現在、Pleora SDK で提供されているサンプル (具体的には画像処理サンプル) から派生した C++ コードを使用して、Basler acA1280 カラー カメラから画像を保存しようとしています。現在保存できる画像のいくつかの問題を修正したいと思います。

  1. 青いです
  2. 画像が2枚あります
  3. 画像の下に大きな灰色のバーがあります

これらの問題に関するアドバイスをいただければ幸いです。これまでは、正しいピクセル タイプによって画像がより多くの色を扱えるようになることを期待していたので、主に色の問題に焦点を当ててきましたが、これはうまくいきませんでした。

具体的な質問は次のとおりです。

  1. 指定したバッファのピクセル タイプが間違っているか、一部のデータが削除されているため、画像が青くなっていますか?
  2. BMPファイルの位置合わせがずれているため、画像が2つありますか?
  3. ImagingBuffer の仕様が関連していないため、灰色のバーは画像のサイズが正しくないためですか?

EDIT 1 下の灰色のバーについて、lHeightを2で割ると、

lBuffer->GetImage()->Alloc(lWidth, lHeight/2, PvPixelRGBa8);

その後、灰色のバーが削除されます。したがって、割り当てられたサイズが大きすぎる可能性があります。2 重の画像は単に画像の複製であり、スペースを埋めることができるのでしょうか、それとも位置合わせの問題で 2 倍になる可能性がありますか?

Pleora コードを使用して、カメラに接続し、ストリーミングを開始できます。コードのこのセクション内で、バッファを bmp ファイルに書き込もうとしましたが、結果はまちまちです。添付の画像は、取得した出力の例です。 ここに画像の説明を入力

この画像を取得するために 32 ビット RGB ピクセル タイプを使用しています。カメラからの出力を切り替えると、BGR に戻すこともできますが、他のピクセル仕様では出力として一定のグレーの画像が得られるか、線の多い白黒の幽霊のような 3 重画像が得られます。

ストリームとバッファがどのように作成されたかを理解するのに関連すると思われるコードと、保存された画像を以下に示します (問題を理解するためにコードの別のセクションが必要な場合はお知らせください)。「元の画像を保存」というコメントで保存する部分を強調表示します。

    // Acquire images until the user instructs us to stop.
cout << "<press a key to stop streaming>" << endl;

// allocate image
//AlignedImageBufferAllocator
PvFlushKb();
while ( !PvKbHit() )
{
PvBuffer *lBuffer = NULL;
PvResult lOperationResult;
PvBufferWriter lBufferWriter;
int lConvertedBufferIndex = 0;
PvBufferConverter lBufferConverter;
SimpleImagingLib::ImagingContrastFilter lContrastFilter;

// Retrieve next buffer
//PvResult lResult = lStream->RetrieveBuffer( &lBuffer, &lOperationResult, 1000 );
PvResult lResult = lStream->RetrieveBuffer(&lBuffer, &lOperationResult, 1000);
if ( lResult.IsOK() )
{
    if (lOperationResult.IsOK())
    {
        //
        // We now have a valid buffer. This is where you would typically process the buffer.
        // -----------------------------------------------------------------------------------------
        // ...

        lBlockCount->GetValue( lBlockCountVal );
        lFrameRate->GetValue( lFrameRateVal );
        lBandwidth->GetValue( lBandwidthVal );

        // Retrieve the imaging buffer based on the buffer's custom ID
        SimpleImagingLib::ImagingBuffer *lImagingBuffer = gImagingBuffers + lBuffer->GetID();

        // Retrieve our image based on buffer ID - which has been set to the index of the array
        lContrastFilter.Apply( lImagingBuffer );

        uint32_t lHeight = lImagingBuffer->GetHeight();
        uint32_t lWidth = lImagingBuffer->GetWidth();

        cout << fixed << setprecision( 1 );
        cout << lDoodle[ lDoodleIndex ];
        cout << " BlockID: " << uppercase << hex << setfill('0') << setw(16) << lBuffer->GetBlockID() << " W: " << dec << lWidth << " H: "
            << lHeight << " " << lFrameRateVal << " FPS " << ( lBandwidthVal / 1000000.0 ) << " Mb/s  \r";

        //Save original image
        lBuffer->GetImage()->Alloc(lWidth, lHeight, PvPixelRGBa8);
        lBufferWriter.Store(lBuffer, "C:\\Users\\Public\\Pictures\\ImageOriginal.bmp", PvBufferFormatBMP);
    }

    // Re-queue the buffer in the stream object.
    lStream->QueueBuffer( lBuffer );

    }
    else
    {
    // Timeout
    cout << lDoodle[ lDoodleIndex ] << " Timeout\r";
    }

++lDoodleIndex %= 6;

}

編集 2 ピクセル タイプを PvPixelRGBa8 から PvPixelBGRa8 に切り替え、lHeightを半分に分割すると、下の画像が得られます。これは、RGB のインデックスが混同されていることを示している可能性があります。これはまだ青が多すぎますが、問題はそれほど顕著ではありません。

やや改善された画像

編集 3 @dkz のアドバイスに従って、ピクセル タイプを RGB8 に変更しようとしました。これにより、下の緑色の画像が得られました。彼のコードを使用してピクセル タイプを取得すると、書き込み前の時点でのピクセル タイプは実際には UYVY であると信じるようになりました。現在の写真には、画像が1つしかないという良い点があります。これは、16ビット画像が32ビット画像として誤って扱われ、倍増につながるという@dkzのポイントを確認しているようです。 ここに画像の説明を入力

4

2 に答える 2

0

問題の原因を見つけました。この行は、 lImagingBuffer に適用されているにもかかわらず、 lBuffer をフィルタリングまし

lContrastFilter.Apply( lImagingBuffer );

@dkz のコメントは役に立ちました。これにより、ピクセル タイプとフィルターに再び焦点を合わせることができ、最終的に修正につながりました。

于 2015-07-21T13:55:04.300 に答える