2023年10月11日

CS/EGシリーズカメラのPythonサンプルプログラムでOpenCVを使いたい件(ベイヤーの場合)

CS/EGシリーズカメラのPythonサンプルプログラムはOpenCVで使えるようにはコーディングされていません。

これは、特定のライブラリに依存させない、一般的なコードとなっているためです。

 

以下「GrabImage.py」を例に説明します。

 

Python-OpenCVはnumpyを利用しており、画像データはnumpy配列として取り扱われます。

GrabImage.pyはwork_thread()中のMV_CC_GetOneFrameTimeout()で画像を取得しており、画像データはpDataで引き渡されますが、これはC言語で言うところのポインタで、このままではOpenCVで使用できません。

このpDataをnumpy配列に変換します。

 

 

1)以下の2行のimportを追加します。

 

  • import numpy as np
  • import cv2

 

 

2)__main__のret = cam.MV_CC_StartGrabbing()行の前に、カメラから出力される画像データ形式をベイヤーに設定する以下の行を追加します。

 

  • ret = cam.MV_CC_SetEnumValueByString(“PixelFormat”,”BayerRG8“)

 

BayerRG8の部分はカメラによって異なります。

MVSを開きカメラを接続後Feature Tree → Image Fromat Control → Pixel Format

に選択できる文字を下記表から探して対応する文字列を入れてください。

 

MVSでの表示 対応する文字列
 Bayer RG 8

 BayerRG8

 Bayer GR 8

 BayerGR8

 Bayer BG 8

 BayerBG8

 Bayer GB 8

 BayerGB8

 

PythonサンプルプログラムでOpenCVを使いたい件01

 

 

3)work_thread()にpDataをnumpy配列に変換するコードに書き換えます。

(画像の確認が出来るようにcv2.imshow()とcv2.waitKey()の2行を入れています。)

 

 

 

 

def work_thread(cam=0, pData=0, nDataSize=0):

    stFrameInfo = MV_FRAME_OUT_INFO_EX()

    memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))

    while True :

        ret = cam.MV_CC_GetOneFrameTimeout(pData, nDataSize, stFrameInfo, 1000)

        if ret == 0:

            print (“get one frame: Width[%d], Height[%d], nFrameNum[%d]”  % (stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nFrameNum))

            image = np.asarray(pData._obj)

            image = image.reshape((stFrameInfo.nHeight, stFrameInfo.nWidth))

            image = cv2.cvtColor(image, cv2.COLOR_BayerBG2BGR)

            cv2.imshow(“show”, image)

            cv2.waitKey(1)

        else:

            print (“no data[0x%x]” % ret)

        if g_bExit == True:

            break

 

 

 

cv2.COLOR_BayerBG2BGRの部分に先ほど入力した文字列に対応した文字列を入力してください。

 

  対応する文字列
 BayerRG8

 cv2.COLOR_BayerBG2BGR

 BayerGR8

 cv2.COLOR_BayerGB2BGR

 BayerBG8

 cv2.COLOR_BayerRG2BGR

 BayerGB8

 cv2.COLOR_BayerGR2BGR

 

cv2.cvtColor()の第2引数の表記は、直感的なベイヤーの並びと合っていません。

これはOpenCVの仕様です。

 

仕様は下記場所に記載されています。

https://docs.opencv.org/3.4/d8/d01/group__imgproc__color__conversions.html#gga4e0972be5de079fed4e3a10e24ef5ef0a19f573b2970b16e6b8d8e87f02c297f4

 

PythonサンプルプログラムでOpenCVを使いたい件02

 

 

映像の色味が正しくない場合にはcv2.cvtColor()の第2引数を間違えている場合があります。

 

 

 

 

松電舎テクニカルサポートデスク

 

お問い合わせはこちらから