mengineer's blog

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

JAISDK 画像データの平均値を取得する

過去記事はこちらから。

前回は単に画像データを表示するだけでしたが、今回は中身を参照してみます。

前回のChildWindowSampleを改造します、最下部にlabelR、labelG、labelBを追加し、
そこにRGB各色の平均値を表示させてみましょう。

f:id:mengineer:20170807110114p:plain

NewImageDelegateの追加/削除

”NewImageDelegate”というデリゲートを使います、JAISDKのマニュアルを見ると、
画像取込毎に呼んでくれるようです、startボタンの処理に下記9行目を追加します。

stopボタンの方にも削除処理を追加します、下記10行目です。

あとは実際の画像データを参照する部分を、HandleImageの中に記述していきます。

画像データの参照(HandleImage内)

前準備として、平均値の取得エリアと画像変換用のバッファを定義しておきます、
下記17行目と20行目、最初にCCameraやCNodeを定義した後のところです。

次に、実際に画像データを取得する部分(HandleImage)です。

・6~9行目
平均値を取得したいエリアを指定します、ここでは例として画像の左上、
X=100, Y=100から、縦横100Pixelの正方形で指定しています。

・12行目
平均値取得用の変数Averageを定義します、Jai_FactoryWrapper.PixelValueは、
下記の構造体になっており、どの要素にどの画像データが入ってくるか?は、
カメラのPixelFormatにより決まります。(JAISDK.NET Wrapperマニュアル参照)

f:id:mengineer:20170809140740p:plain

今回は”10 Bit Bayer GR”なので、データはBGR48の中に入ってきます。

・14~22行目
データを取得している部分です、基本的な流れとしては、
 J_Image_Mallocで、バッファを定義
 J_Image_FromRawToImageで データを取得
 J_Image_GetAverageで、変数Averageの中に平均値を取得

各関数のパラメータや詳細はマニュアル参照して下さい、要は画像全体のうち、 m_MeasureRectで指定した矩形エリアの平均値を、Averageに取得しています。

・25~27行目
BGR48はuShortで、画像データは一色辺り16bit左詰めになっていますが、
今回のデータは10bitなので、下位6bitを消して右に6bitシフトしています。

この部分は、PixelFormatにより処理を変える必要が有るので注意して下さい。  

・32~34行目
データを文字列に変換して、ラベルに表示しています、別スレッドから
UIスレッドのラベルを更新するので、こういう処理にしています。
(もっと良い処理方法が有るのかも?)

実際に動作させると、こんな感じになりました。 f:id:mengineer:20170809133559p:plain