2つのWEBカメラを使うと動作しない認識しない時の原因と対処法
Raspberry Piを1台使用して、複数のWebカメラを活用できると、
監視カメラや多視点撮影など、さまざまなケースに対応できます。
しかし、2台のWebカメラを同時に動作させる際にエラーが発生しました。
この記事では、その原因と対処方法について詳しく説明します。
![](https://www.makigadget.com/wp-content/uploads/2023/01/razipicam2600.jpg)
使用した機器
使用した機器
・Raspberry Pi 4 Model B
・Webカメラ(ロジクール C720、C920n)
2つのWebカメラから録画する
Raspberry Pi 4 Model BでPythonを使用して
2つのWebカメラから録画を行うためのコードを作成します。
これには、OpenCVライブラリを使用します。
OpenCVは、カメラのキャプチャと
動画ファイルへの書き込みをサポートしているため、非常に便利です。
OpenCVをインストール
Raspberry PiにOpenCVをインストールする必要があります。
以下のコマンドを実行してインストールします。
sudo apt update
sudo apt install python3-opencv
2つのWebカメラを同時に使用して録画するPythonコード
2つのWebカメラを同時に使用して録画するPythonコードを書きます。
このコードでは、2つのカメラデバイスを開き、
それぞれのフレームを取得し、動画ファイルに書き込みます。
import cv2
# WebカメラのデバイスIDを設定
camera_1_id = 0 # 1つ目のカメラ
camera_2_id = 1 # 2つ目のカメラ
# カメラキャプチャを初期化
cap1 = cv2.VideoCapture(camera_1_id)
cap2 = cv2.VideoCapture(camera_2_id)
# 録画のためのビデオライターを初期化
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out1 = cv2.VideoWriter('output1.avi', fourcc, 20.0, (640, 480))
out2 = cv2.VideoWriter('output2.avi', fourcc, 20.0, (640, 480))
while True:
# 1つ目のカメラからフレームを取得
ret1, frame1 = cap1.read()
# 2つ目のカメラからフレームを取得
ret2, frame2 = cap2.read()
if ret1:
# フレームを画面に表示(オプション)
cv2.imshow('Camera 1', frame1)
# フレームをビデオファイルに書き込み
out1.write(frame1)
if ret2:
# フレームを画面に表示(オプション)
cv2.imshow('Camera 2', frame2)
# フレームをビデオファイルに書き込み
out2.write(frame2)
# 'q'キーが押されたらループを終了
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# カメラキャプチャとビデオライターを解放
cap1.release()
cap2.release()
out1.release()
out2.release()
# ウィンドウを閉じる
cv2.destroyAllWindows()
このコードでは、以下の処理を行っています:
camera_1_idとcamera_2_idで2つのカメラのデバイスIDを指定します。
最初のカメラ:ID 0
2つ目のカメラ:ID 1
に割り付けています。
cv2.VideoCaptureを使用して、カメラキャプチャを初期化します。
cv2.VideoWriterを使用して、録画のため初期化します。
出力ファイルの名前は、
output1.aviとoutput2.aviに設定しています。
無限ループの中で、各カメラからフレームを取得し、
フレームを画面に表示し、ビデオファイルに書き込みます。
‘q’キーが押されたらループを終了します。
カメラキャプチャとビデオライターを解放しウィンドウを閉じます。
このコードは、2つのWebカメラから同時に録画を行うことができます。
発生したエラー
2つのWebカメラを同時に使用して録画するPythonコードを実行すると
エラーが出ました。
エラーメッセージ以下です。
[ WARN:0@0.382] global /tmp/pip-wheel-u79916uk
/opencv-python_ea2489746b3a43bfb3f2b5331b7ab47a
/opencv/modules/videoio/src/
cap_v4l.cpp (902) open VIDEOIO(V4L2:/dev/video1): can't open camera by index
エラーメッセージ
“can’t open camera by index” は、
指定したカメラデバイスが見つからないか、
使用できないことを示しています。
エラーの原因を探る
指定したカメラデバイスが見つからないか、
使用できないエラーの原因を探っていきます。
手順は次の通りです。
①接続されているカメラのデバイスIDを確認
ラズパイに接続されているカメラのデバイスIDを確認します。
ターミナルを開き、
以下のコマンドを実行して接続されているカメラデバイスをリスト表示します
ls /dev/video*
ターミナルで実行すると以下の実行結果が出ました。
![](https://www.makigadget.com/wp-content/uploads/2024/05/2CAM_IDLIST.png)
実行結果の解説
crw-rw—-+ 1 root video 81, 13 3月 26 11:37 /dev/video0
crw-rw—-+ 1 root video 81, 13 3月 26 11:37 /dev/video1
続いています。
ファイルタイプとアクセス権限
初めの赤字部分
crw-rw—-+ 1 root video 81, 13 3月 26 11:37 /dev/video0
ファイルタイプとアクセス権限を表します。
c:これはキャラクターデバイスファイルであることを示します。
rw-:所有者(root)のアクセス権限。
読み取り(r)と書き込み(w)が許可されています。
rw-:グループ(video)のアクセス権限。
読み取り(r)と書き込み(w)が許可されています。
—:その他のユーザーのアクセス権限。
アクセス権がありません。
+:ACL(アクセス制御リスト)が設定されていることを示します。
リンク数 (1)
デバイスファイルのリンク数です。通常は1です。
所有者 (root)
crw-rw—-+ 1 root video 81, 13 3月 26 11:37 /dev/video0
ファイルの所有者を示します。
この場合はrootユーザーが所有者です。
グループ (video)
ファイルが属するグループを示します。この場合はvideoグループです。
crw-rw—-+ 1 root video 81, 13 3月 26 11:37 /dev/video0
デバイスのメジャー番号とマイナー番号 (81, 0 および 81, 1)
メジャー番号(81):デバイスの種類を識別します。
マイナー番号(0、1):特定のデバイスを識別します。
この場合、/dev/video0 と /dev/video1 を示します。
crw-rw—-+ 1 root video 81, 13 3月 26 11:37 /dev/video0
最終更新日時 (3月 26 11:37)
ファイルの最終更新日時を示します。
ここでは、5月31日の午前9時に最終更新されています。
crw-rw—-+ 1 root video 81, 13 3月 26 11:37 /dev/video0
ファイル名 (/dev/video0 および /dev/video1)
デバイスファイルの名前です。
これらはそれぞれ異なるカメラデバイスを指します。
この環境で表示されているカメラデバイスの一覧を見ると、
複数のビデオデバイスが存在しています。
そのため、デバイスIDが正しいかどうかを再確認する必要があります。
確認と対処方法
正しいデバイスIDを確認するため、すべてのビデオデバイスを試します。
実際に動作するカメラデバイスIDを見つるため
コードを書きました。
以下のコードを使用して、どのデバイスが正しく動作するか確認します。
import cv2
# 試したいデバイスIDのリスト
device_ids = [0, 1, 2, 3, 13, 14, 15]
for device_id in device_ids:
cap = cv2.VideoCapture(device_id)
if cap.isOpened():
print(f"Device {device_id} is working")
ret, frame = cap.read()
if ret:
cv2.imshow(f'Camera {device_id}', frame)
cv2.waitKey(0) # キーが押されるまで表示
cap.release()
else:
print(f"Device {device_id} is not working")
cv2.destroyAllWindows()
このコードを実行すると以下の結果がでました。
![](https://www.makigadget.com/wp-content/uploads/2024/05/2CAM_ERRCODE.png)
結果は、
not working:Device 1,3,13,
working:Device 0,2,14,15
Device(ID): 0,2,14,15 が使用することができます。
WebカメラのデバイスIDを設定
初めに作成した、2つのWebカメラから録画を行うためのコードを修正します。
WebカメラのデバイスID設定を修正します。
<div class=”simple-box1″><p>
(旧)camera_2_id = 1# 2つ目のカメラ
(修正)camera_2_id = 2# 2つ目のカメラ
</p></div>
修正後のコードを実行します。
import cv2
# WebカメラのデバイスIDを設定
camera_1_id = 0 # 1つ目のカメラ
camera_2_id = 2 # 2つ目のカメラ
# カメラキャプチャを初期化
cap1 = cv2.VideoCapture(camera_1_id)
cap2 = cv2.VideoCapture(camera_2_id)
# 録画のためのビデオライターを初期化
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out1 = cv2.VideoWriter('output1.avi', fourcc, 20.0, (640, 480))
out2 = cv2.VideoWriter('output2.avi', fourcc, 20.0, (640, 480))
while True:
# 1つ目のカメラからフレームを取得
ret1, frame1 = cap1.read()
# 2つ目のカメラからフレームを取得
ret2, frame2 = cap2.read()
if ret1:
# フレームを画面に表示(オプション)
cv2.imshow('Camera 1', frame1)
# フレームをビデオファイルに書き込み
out1.write(frame1)
if ret2:
# フレームを画面に表示(オプション)
cv2.imshow('Camera 2', frame2)
# フレームをビデオファイルに書き込み
out2.write(frame2)
# 'q'キーが押されたらループを終了
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# カメラキャプチャとビデオライターを解放
cap1.release()
cap2.release()
out1.release()
out2.release()
# ウィンドウを閉じる
cv2.destroyAllWindows()
実行結果
2つのWEBカメラが正常に認識して動作しました。
![](https://www.makigadget.com/wp-content/uploads/2024/05/2CAM_hyouji01.jpg)
まとめ
今回紹介した手順を通じて、Raspberry Pi 4 Model Bで
2つのWebカメラを使用して録画を行う際のエラーを解決することができました。
①カメラデバイスの確認
ls -l /dev/video*
(CODE COPYできます)
コマンドを使用して、
システムに接続されているすべてのビデオデバイスを一覧表示しました。
それにより、システムに認識されているカメラデバイスのデバイスID
(例:/dev/video0, /dev/video1)を特定しました。
正しいデバイスIDの確認
複数のデバイスIDを試して、実際に動作するカメラデバイスIDを確認しました。
Pythonスクリプトを使用して、
各デバイスIDが正しく動作するかどうかをテストし、
正常に動作するカメラデバイスIDを特定しました。
コードの修正
特定した正しいデバイスIDを使用して、メインの録画コードを修正しました。
Raspberry Pi 4 Model Bに接続された2つのWebカメラから映像をキャプチャし、
それぞれの映像をウィンドウに表示します。
エラーなく動作するようになったため、安心して録画を行うことができます。
Raspberry Pi 4 Model Bで複数のWebカメラを使用する際には、
デバイスIDの確認と正しい設定が重要です。
適切なテストとデバッグを行うことで、エラーを回避し、
スムーズにカメラの映像をキャプチャできます。
どんどん、ラズパイを使って楽しんでいきましょう!!