mengineer's blog

ニッチなネタばかりですが。

eBUS SDK 使ってみる その3 画像表示

かなり間が空いてしまいましたが、下記ネタの続きです。

mengineer.hatenablog.com

この時は取得した画像のTimeStamp情報を表示させただけだったので、
今回は実際の画像を表示させてみます。

まずは、前回のソフト(上記リンク先参照)のForm上に、
PvGUIDotNetのPvDisplayControl を配置します、下記グレー部分。
f:id:mengineer:20190417115229p:plain

表示させるだけなら、とても簡単

あとは取込スレッド内に一行追加するだけです。
(// Display Imageの次行)

コントロールの名称を”displayControl"としています、
displayControl.Displayに、取込バッファ(lbuffer)を指定するだけ。

// Operation result of buffer is OK, display.
if (lOperationResult.IsOK)
{
    lThis.label3.Text = lBuffer.Timestamp.ToString(); 

     // Display Image
    lThis.displayControl.Display(lBuffer);                      
}

カメラをカラーバー表示にしておくと、こんな感じで無事成功。
f:id:mengineer:20190417115036p:plain

バッファ内を参照してみる

実際は表示だけで無く、画像データを参照する場合が多いはずです、
lBufferのDataPointerというプロパティが有りbyte*で返すようなので、
例によってunsafeでポインタアクセスしてみます。
(以前のJAISDKネタと同じやり方ですね)

画像の先頭行ですが、 今回は8bitのカラー画像なので幅の3倍、
あらかじめ定義しておいたStringBuilder sbにデータを入れます、
RGBの順に並んでる前提で、3つ毎に改行を入れます。

取込停止で、クリップボードにsbの文字列をコピーします、
以下はunsafeの部分だけのソース。

// Operation result of buffer is OK, display.
if (lOperationResult.IsOK)
{
    // Get TimeStamp
    lThis.label3.Text = lBuffer.Timestamp.ToString();

    // Display Image
    lThis.displayControl.Display(lBuffer);

    // Get Raw Data
    unsafe
    {
        lThis.sb.Clear();
        byte* pArray = lBuffer.DataPointer;
        for (int i = 0; i < lBuffer.Image.Width * 3; i+=3)
        {
            lThis.sb.Append(pArray[i].ToString());
            lThis.sb.Append("\t");
            lThis.sb.Append(pArray[i + 1].ToString());
            lThis.sb.Append("\t");
            lThis.sb.Append(pArray[i + 2].ToString());
            lThis.sb.Append("\r\n");
        }
    }
}

クリップボードからExcelに貼るとこんな感じに
f:id:mengineer:20190417145114p:plain

カラーバーの先頭列は白なので、RGBとも222で合ってそう、
と思ったのですが、後半データがズレて来ました。

そもそも並び順が先頭行からRGBの順で合っているのか?
というところから、再度調べる予定、次回へ続く。