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

#RaspberryPi4を立ち上げる

###マイクロSDカード32GBを準備する
![SD32GB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/13dfa44e-613b-dcf4-362e-60ead0445626.jpeg)

クラス10を購入する
Gigastone 2枚セットで1480円でした（2020年8月11日）
[Amazon売り場](https://www.amazon.co.jp/gp/product/B07QS1R1D9/ref=ppx_yo_dt_b_asin_image_o00_s00?ie=UTF8&psc=1
)
購入品はすでにFAT32でフォーマットされていてWindows10 PCでディスクとして認識されます。
![Disc32GB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/2fd1ad7a-a13f-35af-edb9-cccf51719ecc.png)

###NOOBSをダウンロードする

[ダウンロードページ](https://www.raspberrypi.org/downloads/)

![NOOBS1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/33951d8a-657c-ebfa-d00a-4268538ebb42.png)
NOOBSのアイコンをクリックすると画面が次のように変わる
![NOOBS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/2adc4e65-e2b7-eb42-1a90-0ea9d29e1d1f.png)

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

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

###RaspberryPi4の設定

１．SDカードを挿す
２．小型HDMIコネクタのケーブルでディスプレイを接続する
３．無線マウス＆キーボードのUSBドングルをUSBポートに挿入する
４．５V電源をマイクロUSBコネクタに接続する（スイッチをONにする）

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

![raspbian.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/764f62ba-427f-5826-c9f0-f97f7a7be979.png)

###SSHとVNCの設定
参考ページ
[Raspberry Pi 4にSSHとVNCで接続してみた](https://dev.classmethod.jp/articles/raspberry-pi-4-ssh-vnc-remote/)

詳細は電子書籍を参照ください
![Book_Raspi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/92d47a78-5de9-88ad-8540-c1ccb3ce9cfb.jpeg)
[本のAmazon売り場](https://www.amazon.co.jp/gp/product/B08F74WBWS/ref=ppx_yo_dt_b_d_asin_title_o08?ie=UTF8&psc=1)

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

###OpenCVの組み込み

2019年12月11日掲載のQiita
[Raspberry Pi4 に OpenCV を楽に入れる](https://qiita.com/naoppy/items/8a2178383859178e6d7e)
の通りにします。

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/eb8f927e-03fe-3ec1-763b-a2536be912ef.png)
![Mu_Editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/c7d054fd-2cd5-a127-8d81-4adf8b9130cb.png)
muアイコンをクリックするとエディタが立ち上がります
![Mu1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/3783c08e-6930-108a-85e4-0e97ac262620.png)

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


###USBカメラを2台接続する
手持ちのUSBカメラ2種類2台をUSBコネクタに接続した
![IMG1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/40003db8-267c-0e86-e1bd-363562c0dab6.jpeg)

単純に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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/6ad1dd6f-972b-5062-937b-0c0ad64bf5e4.png)


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

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

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


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