RaspberryPi4にUSBカメラ2台を接続する


RaspberryPi4を立ち上げる

マイクロSDカード32GBを準備する

クラス10を購入する
Gigastone 2枚セットで1480円でした(2020年8月11日)
Amazon売り場
購入品はすでにFAT32でフォーマットされていてWindows10 PCでディスクとして認識されます。

NOOBSをダウンロードする

ダウンロードページ


NOOBSのアイコンをクリックすると画面が次のように変わる

「NOOBS」の「Download ZIP」のラベルをクリックしてZIPファイルをダウンロードする。

ダウンロードされたファイル「NOOBS_v3_4_0.zip (2,379,232KB)」を解凍して中のファイルとホルダをSDカードのリムーバルディスクへ移動する。

RaspberryPi4の設定

1.SDカードを挿す
2.小型HDMIコネクタのケーブルでディスプレイを接続する
3.無線マウス&キーボードのUSBドングルをUSBポートに挿入する
4.5V電源をマイクロUSBコネクタに接続する(スイッチをONにする)

「日本語」を選択し、OSを「Raspbian」選んでインストールを進めるとRasbianが立ち上がります。

SSHとVNCの設定

参考ページ
Raspberry Pi 4にSSHとVNCで接続してみた

詳細は電子書籍を参照ください

本のAmazon売り場

Windows10 PCのWiFi経由で
1.SSHでコマンド操作する方法
2.VNCでディスプレイをつながないで画面表示させる方法
を優しく図入りで解説してます。

OpenCVの組み込み

2019年12月11日掲載のQiita
Raspberry Pi4 に OpenCV を楽に入れる
の通りにします。

2020年8月15日にインストールを行いましたが準備されてるバージョンは上記Qiitaと同じだったので
Ver 4.1.0.25をインストールしました。

pip3 install opencv-contrib-python==4.1.0.25

pythonプログラムの実行

Raspbianの最新にはMuエディタが組み込まれてるのでこのエディタでpythonプログラムを実行させる


muアイコンをクリックするとエディタが立ち上がります

Muエディタの操作方法は次のHPを参照してください
https://codewith.mu/

USBカメラを2台接続する

手持ちのUSBカメラ2種類2台をUSBコネクタに接続した

単純に2台のキャプチャーはエラーが発生しました。そこで画面サイズやFPSを変えることにしました。
参考にさせてもらったHPはここ
https://dev.classmethod.jp/articles/opencv-webcam-setting/

画面サイズを800×600画素にし
15FPSはエラーが発生したりマウスが動かなかったりしてRasPi4の能力を超えてる感じです
10Fpsでカスカス連続運転できてます
5FPSで2台のカメラ画面表示は10時間してもエラーが発生しませんでした

最終的に長時間画面表示できたコードです

#===============================
# Raspi4 conect to two USBCam
#
# Ver1 2020/08/16    T.F.
#===============================
# -*- coding: utf-8 -*-
import cv2

#-------------------------------
# Webカメラ
#-------------------------------
WIDTH = 800
HEIGHT = 600
#ID:0  FPS:5,7.5,10,15  //20
#ID:2  FPS:5    ,10,15      //20
FPS = 5

#-------------------------------
#
#-------------------------------
def cam_set(DEVICE_ID,WIDTH,HEIGHT,FPS):
    # video capture
    cap = cv2.VideoCapture(DEVICE_ID)

    # フォーマット・解像度・FPSの設定
    #cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G'))
    cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('Y','U','Y','V'))
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
    cap.set(cv2.CAP_PROP_FPS, FPS)

    # フォーマット・解像度・FPSの取得
    fourcc = decode_fourcc(cap.get(cv2.CAP_PROP_FOURCC))
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    fps = cap.get(cv2.CAP_PROP_FPS)
    print("ID:{} fourcc:{} fps:{} width:{} height:{}".format(DEVICE_ID, fourcc, fps, width, height))

    return cap

#-------------------------------
#
#-------------------------------
def decode_fourcc(v):
        v = int(v)
        return "".join([chr((v >> 8 * i) & 0xFF) for i in range(4)])

#-------------------------------
#
#-------------------------------
def main():
    #--------------------------------------
    DEVICE_ID = 0
    cap1=cam_set(DEVICE_ID,WIDTH,HEIGHT,FPS)

    #--------------------------------------
    DEVICE_ID = 2
    cap2=cam_set(DEVICE_ID,WIDTH,HEIGHT,FPS)

    #--------------------------------------
    while True:
        #-----------------------
        # カメラ画像取得
        ret1, frame1 = cap1.read()
        if(frame1 is None):
            continue

        #-----------------------
        # カメラ画像取得
        ret2, frame2 = cap2.read()
        if(frame2 is None):
            continue

        #---------------------------
        im_h=cv2.hconcat([frame1,frame2])

        #---------------------------
        # 画像表示
        cv2.imshow('frame1', im_h)

        #--------------------------------------
        # キュー入力判定(1msの待機)
        # waitKeyがないと、imshow()は表示できない
        # 'q'をタイプされたらループから抜ける
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    #------------------------------
    # VideoCaptureオブジェクト破棄
    cap1.release()
    cap2.release()
    cv2.destroyAllWindows()

#-------------------------------
if __name__ == '__main__':
    main()

表示された画面

次のコードでカメラ画像を水平に並べて合成しひとつのフレームに表示しました

im_h=cv2.hconcat([frame1,frame2])

今後の発展

安価なUSBカメラ2台を使ってステレオカメラを構成し、「物体検出」した位置のずれから物体までの距離を計算してロボットアームの制御の目として使います。

次は、RasPi4に載る、軽い「物体検出」プログラムを検討します