Harvesterネタが続きます、前回の下記ネタ
に続いて、今回は実際に画像を表示させてみます。
ちなみに前回から、下記のチャットルームも活用させて頂いてます。 gitter.im
色々質問されてる中にソースも貼られており、非常に参考になりました。
Open CVのインストール
Harvesterのサイトには、速度を気にしないならHarvester CoreとMatplotlibがお奨め
みたいなことも書かれていましたが、今回はメジャーなOpenCVを使ってみます。
Anaconda Navigatorでgenicamに切替え、EnvironmentでOpenCVをインストール、
下記はインストール後の画面抜粋です。(こうなりました、ってだけですけど)
画像の表示
前回のスクリプトを、先ほどのチャットルームなどを参考にして改造しました。
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補間しない生データですね。
次に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)
実行すると、今度は正常なカラーバーが表示されました、ひと安心。
フレームレートの表示
チャットルームの記事で、フレームレートを表示させていたので真似してみます、
って、下記二行をwith ia.fetch_buffer() as buffer:のループ内に追加するだけです。
fps = ia.statistics.fps print("FPS: ", fps)
実行すると、無事にフレームレートが表示されました。
時々、FPSの数値が下がっている(ほとんど159程度→たまに79.XXX)のが
ちょっと気になりますが、取得すること自体は非常に簡単でした。
FPS以外にtimestampなども取れるようなので、色々便利かもしれません。
最終的なソースファイルはこれです、今回はここまで。
Harvester & OpenCV DisplayImage