mengineer's blog

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

GenICam Harvester 使ってみる その3 画像表示

Harvesterネタが続きます、前回の下記ネタ

mengineer.hatenablog.com

に続いて、今回は実際に画像を表示させてみます。

ちなみに前回から、下記のチャットルームも活用させて頂いてます。 gitter.im

色々質問されてる中にソースも貼られており、非常に参考になりました。

Open CVのインストール

Harvesterのサイトには、速度を気にしないならHarvester CoreとMatplotlibがお奨め
みたいなことも書かれていましたが、今回はメジャーなOpenCVを使ってみます。

Anaconda Navigatorでgenicamに切替え、EnvironmentでOpenCVをインストール、
下記はインストール後の画面抜粋です。(こうなりました、ってだけですけど)
f:id:mengineer:20190507140131p:plain

画像の表示

前回のスクリプトを、先ほどのチャットルームなどを参考にして改造しました。

from harvesters.core import Harvester
import sys
import traceback
import cv2

def main():
    h = Harvester()
    h.add_cti_file('C:/Program Files/JAI/SDK/bin/JaiUSB3vTL.cti')
    h.update_device_info_list()
    ia = h.create_image_acquirer(0)
    ia.device.node_map.PixelFormat.value = 'BayerRG8'
    ia.device.node_map.TestPattern = 'HorizontalColorBar'    
    try:
        ia.start_image_acquisition()
        i = 0
        done = False
        while not done:
            with ia.fetch_buffer() as buffer:
                img = buffer.payload.components[0].data
                img = img.reshape(buffer.payload.components[0].height, buffer.payload.components[0].width)
                cv2.namedWindow("window", cv2.WINDOW_KEEPRATIO | cv2.WINDOW_NORMAL)
                cv2.imshow("window", img)
                if cv2.waitKey(10) == ord('q'):
                    done = True
                    print('break')
                i = i + 1
    except Exception as e:
        traceback.print_exc(file=sys.stdout)
    finally:
        ia.stop_image_acquisition()
        ia.destroy()
        cv2.destroyAllWindows()
        print('fin')
        h.reset()

if __name__ == "__main__":
    main()

img = buffer.payload.components[0].dataで、画像データそのものを取り出します。
(前回ネタのbuffer.payload.components[0]は、画像以外も含んだデータ一式)

imgは一次元配列なので、次のimg.reshapeで高さと幅を指定して二次元配列に変換、
それをOpenCVのcv2.imshowでウィンドウに表示させているだけです。

表示ウィンドウ内で”q”を押すと、Whileループを抜けてfinallyの処理に移ります、
画像取込停止/オブジェクト破棄後、表示ウィンドウを閉じて終了します。

実行すると、こんなウィンドウが表示されます、Bayer補間しない生データですね。 f:id:mengineer:20190507143552p:plain

次にBayer補間の処理を入れてみます、OpenCVにはBayer補間の関数も有るので、
rehapeの後に二行追加するだけです、更にcv2.imshowでBayer補間したimg_copyを
表示するように変更します、下記は変更部分のみ抜粋。

img_copy = img.copy()
img_copy = cv2.cvtColor(img, cv2.COLOR_BayerRG2RGB)
cv2.namedWindow("window", cv2.WINDOW_KEEPRATIO | cv2.WINDOW_NORMAL)
cv2.imshow("window", img_copy)

実行すると、今度は正常なカラーバーが表示されました、ひと安心。 f:id:mengineer:20190507144118p:plain

フレームレートの表示

チャットルームの記事で、フレームレートを表示させていたので真似してみます、
って、下記二行をwith ia.fetch_buffer() as buffer:のループ内に追加するだけです。

fps = ia.statistics.fps
print("FPS: ", fps)

実行すると、無事にフレームレートが表示されました。 f:id:mengineer:20190507144838p:plain

時々、FPSの数値が下がっている(ほとんど159程度→たまに79.XXX)のが
ちょっと気になりますが、取得すること自体は非常に簡単でした。

FPS以外にtimestampなども取れるようなので、色々便利かもしれません。

最終的なソースファイルはこれです、今回はここまで。
Harvester & OpenCV DisplayImage