mengineer's blog

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

JAISDK PixelFormatを指定して平均値取得

過去記事はこちらから。

前回の画像データ取得から、更に下記の機能を追加してみます。

  1. カメラOpen時にPixelFormatのNode値(一覧)を取得
  2. PixelFormatの設定を変更出来るように
  3. 平均値のラベル更新をタイマーで廻すように

画面にcomboBox1を追加し、PixelFormatを選択出来るようにします。

f:id:mengineer:20170812130620p:plain

3.は前回の別スレッドから更新する処理だと、終了時にエラーが出たので、
他のサンプルを参考にして、タイマーで更新するようにしたものです。
(もっと良い方法が有るのかもしれません)

前準備

15行目 PixelFormat取得用でmyPixelFormatNodeを定義します。

17行目 ここで平均値用の変数定義しておきます、前回はfloatにしていましたが、
元々PixelValueのBGR48は符号無し16bitだったので、今回はintに変えています。

PixelFormatの一覧取得(カメラOpen時)

GetPixelFormat()を追加し、SearchButton_Clickの中で実行します。
(→カメラがOpen成功した後:カメラIDを表示した後あたり)

GetPixelFormat()の処理

10行目 PixelFormatのNodeを取得します。
14~20行目 myPixelFormatNode.EnumValuesで、PixelFormatの列挙体総数を
取得出来るので、有効な項目(IsAvailable)のみをcomboBox1に追加します。

ちなみにJAISDKでNodeInformationを見ると、下記のFormatが準備されていますが、
実際に選択出来るのは、下の5つだけのようです。(上5つは白黒カメラ用かな) f:id:mengineer:20170812141157p:plain

21~27行目 comboBox1の初期選択値を現在のPixelformatに合わせてます。
名称を文字列として比較していますが、これももっと良い方法が有るのかも?

PixelFormat変更

comboBox1でPixelFormatを変更出来るように、下記処理を追加します、
って、5行目でmyPixelFormatNode.Valueを書き換えているだけです。

あと6行目は、m_ConversionBuffer.ImageBufferをクリアしています、
当初この処理を入れておらず、PixelFormatを切り替えた後にstartすると、
エラーで落ちていました、追加したら直ったので、これが原因だったかなと。

HandleImageの処理変更

24~41行目 PixelFormatに合わせて処理を切り替えるように変更します。

前回の記事で、Average構造体のどの要素にデータが入ってくるか?は
PixelFormatにより変わる、と書きましたが、マニュアルに下記の記述を発見。

f:id:mengineer:20170812142929p:plain

これを見る限り常にBGR48に入るようなので、PixelFormatのbit設定に合わせて
マスクするbitと右シフト量を変えているだけです。

当初8bit時も同じ処理(→0xFF00でマスクして8bit右シフト)にしていましたが、
JAISDKの他のサンプルでは、そのままintにキャストしていたので合わせました。
(8bit時だけは、下位8bitにデータが入ってくるみたいですね)

タイマーからラベル更新

各ラベルを更新しているだけ、このtimerはstartボタンで有効、stopボタンで無効、
となるように各ボタンに処理を追加しています。(その部分のソースは割愛)

実行結果??

結論から言うと、PixelFormatが12bit Bayer GR Packedのみ、RedとGreenのデータが
おかしいです、下記はカメラ飽和状態ですがRedとGreenは飽和まで達してません。

ちなみにPackedで無い12bitBayerでは、RGBとも4095になります、また8bitは255、
10bitでは1023(Packedでも)となり、他のPixelFormatは問題無さそうです。

f:id:mengineer:20170815142909p:plain

4080→0xFF0、4087→0xFF7、下位4bitが一部bit落ちしてる?みたいです、
Packedで無い12bitではOKなのが不思議??、もう少し調べてみます。

次回へと続く