raspberryPiとPythonを使い、USBカメラを利用する実験を行いました。
参考にしたサイトや書籍の多くは、
「raspberry Piカメラモジュール」を使用したものでしたが、
USBカメラも基本的には使えるとのことで、特に気にせず家にあったUSBカメラを使用することにしました。
【環境について】
Raspberry Pi3 Model b+
Raspbian GNU/Linux 11 (bullseye)
Python3.9.2
カメラ:eMeet c960 USBカメラ
まずは、超簡単に撮影して保存するプログラムをpythonで記述!
import picamera picamera.PiCamera().capture('image.jpg')
実行!!!
おや、、。
picamera.exc.PiCameraError: Camera is not enabled. Try running 'sudo raspi-config'and ensure that the camera has been enabled.
と表示されます。
カメラが使えない…。
ここから2時間の葛藤が始まったので、解決までの道筋を記録しておこうと思います。
解決までの無駄なプロセスもありますが、
遠回りしたおかげで知ったことも記述したので順番に読み進めていただくことをオススメします。
解決の結論だけ知りたい方は、結論までスキップしてください♪
目次
sudo raspi-configを実行する
とりあえずエラー文に言われた通りに、LXTerminalで実行。
$ sudo raspi-config
すると、選択画面が表示されるので、下記の手順で操作していきます。
Terminalの入力画面に自動的に戻るので、下記を実行。
$ vcgencmd get_camera
supported=1 dected=0と表示されます。
supportedは、Raspberry Pi 本体のインターフェース設定でカメラが有効化されているかどうかを表しています。
0→無効 1→有効
detectedはそのまま、カメラを検知しているかどうかを表します。
検知していない…
$ sudo reboot
で再起動しても、同じ結果に、、。
補足
その時の僕は知らなかったのですが、$ vcgencmd get_cameraで supported=0 dected=0 であっても正常に動作したことからUSBカメラには関係のない設定・確認だったようです。
カメラモジュールを使用する際には必要です。
Pythonではなく、raspberryPiのTerminalからカメラを動かしてみる
ダメもとで、
Pythonのプログラムではなく、Raspberry Pi本体でカメラを動かしてみることにしました。
これでダメだったら、諦めてカメラモジュールを購入すると誓って(笑)
fswebcamをインストール
$ sudo apt-get install fswebcam
そして以下を実行。
$ fswebcam image.jpg
画像が保存された!!
どうやらRaspberry Piではなく、Python側の問題であることが発覚!!
補足
基本設定を変えていなければ、保存先はデスクトップではありません。
多くの場合、ホームディレクトリの「/home/pi」に保存されるはずです。
結論:picameraライブラリはUSBカメラでは使えない
この長いエラー解消の旅は、あまりにも簡単なことで締めくくられました。
PiCameraライブラリはUSBカメラでは使えない。
「ラズパイではUSBカメラも使えますが、今回RaspberryPiカメラモジュールを使います!」
という記事をそのまま実行すると、USBカメラ民は詰まるかもしれません。
(断っておきますが、記事や書籍の著者の方は何も悪くないです!笑)
ということで…
Picameraを使わずに、Pythonでカメラを実行してみます。
OpenCVのインストール
$ sudo pip3 install opencv-python $ sudo apt-get install libatlas3-base
import cv2 if __name__ == '__main__': try: capture = cv2.VideoCapture(0) while(capture.isOpened()): retval, image = capture.read() if retval is False: raise IOError text = 'WIDTH={:.0f} HEIGHT={:.0f} FPS={:.0f}'.format(capture.get(cv2.CAP_PROP_FRAME_WIDTH),capture.get(cv2.CAP_PROP_FRAME_HEIGHT),capture.get(cv2.CAP_PROP_FPS)) # 元Image,文字列,位置,フォント,サイズ(スケール係数),色,太さ,ラインの種類 cv2.putText(image, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1, 4) cv2.imshow('Frame', image) # 表示 cv2.waitKey(1) # 1ミリ秒キーボードの入力を待ち受ける except KeyboardInterrupt: pass finally: capture.release () # VideoCaptureのClose cv2.destroyAllWindows() # Window削除
PiCameraの仕様については、公式に記述があるので、興味がある人は参考にしてみてください。
5.7 Can I use picamera with a USB webcam?
No.The picamera library relies on libmmal which is specific to the Pi's camera module.
RaspberryPi PiCamera(FAQ)