過去記事はこちらから。
前回の画像データ取得から、更に下記の機能を追加してみます。
- カメラOpen時にPixelFormatのNode値(一覧)を取得
- PixelFormatの設定を変更出来るように
- 平均値のラベル更新をタイマーで廻すように
画面にcomboBox1を追加し、PixelFormatを選択出来るようにします。
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つは白黒カメラ用かな)
21~27行目 comboBox1の初期選択値を現在のPixelformatに合わせてます。
名称を文字列として比較していますが、これももっと良い方法が有るのかも?
PixelFormat変更
comboBox1でPixelFormatを変更出来るように、下記処理を追加します、
って、5行目でmyPixelFormatNode.Valueを書き換えているだけです。
あと6行目は、m_ConversionBuffer.ImageBufferをクリアしています、
当初この処理を入れておらず、PixelFormatを切り替えた後にstartすると、
エラーで落ちていました、追加したら直ったので、これが原因だったかなと。
HandleImageの処理変更
24~41行目 PixelFormatに合わせて処理を切り替えるように変更します。
前回の記事で、Average構造体のどの要素にデータが入ってくるか?は
PixelFormatにより変わる、と書きましたが、マニュアルに下記の記述を発見。
これを見る限り常に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は問題無さそうです。
4080→0xFF0、4087→0xFF7、下位4bitが一部bit落ちしてる?みたいです、
Packedで無い12bitではOKなのが不思議??、もう少し調べてみます。
次回へと続く