MotoJapan's Tech-Memo

技術めも

【python】raspiでwebカメラとpicameraの両対応コードを実装

モチベーション

カメラをフラグ(PICAM = True )で切り替えられるようにしたい。

[カメラ初期化] cv2.VideoCaptureの置き換え

これはpicameraだと動かないはず。
カメラのイニシャライズをcap取得のwebカメラ、piカメラ両対応する関数を作成。

def initCamera():
    cap = None
    res = False
    while res is False:
        if PICAM:
            cap = picamera.PiCamera()
            # cap.start_preview()
            cap.resolution = (640, 480)
            cap.framerate = 33
            cv2.waitKey(1000)
            res = True
        else:
            cap = cv2.VideoCapture(DEVICE_ID)
            res, _ = cap.read()
            #pass
            cv2.waitKey(1000)
            print('retry ..')
    return cap

そしてcv2.VideoCaptureを置き換え。

cap = cv2.VideoCapture(device_id)
↓
cap = initCamera()

[画像取得] cap.readの置き換え

こちらもpicameraだと動かない気がする。
picameraはstreamから取ってくるので、次のようなwebカメラpiカメラ両対応の関数を作成する。

def getImage(cap):
    c_frame = None
    if PICAM:
        with picamera.array.PiRGBArray(cap, size=(640, 480)) as stream:
            c_frame = cap.capture(stream, 'bgr')
            c_frame = stream.array
            if c_frame is None:
                exit

    else:
        end_flag, c_frame = cap.read()
        if end_flag is False or c_frame is None:
            exit
    return c_frame


そして置き換え。

img = cap.read()
↓
img = getImage(cap)

以上。