LoginSignup
8
14

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-08-17

RaspberryPi4を立ち上げる

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

SD32GB.jpg

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

NOOBSをダウンロードする

ダウンロードページ

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

「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が立ち上がります。

raspbian.png

SSHとVNCの設定

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

詳細は電子書籍を参照ください
Book_Raspi.jpg
本の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_icon.png
Mu_Editor.png
muアイコンをクリックするとエディタが立ち上がります
Mu1.png

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

USBカメラを2台接続する

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

単純に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()

表示された画面

cam1.png

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

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

今後の発展

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

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

8
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
14