Python Raspberry Pi

raspberryPiで、
USBカメラが機能しないときの落とし穴

2021年12月28日

raspberryPiとPythonを使い、USBカメラを利用する実験を行いました。

参考にしたサイトや書籍の多くは、
「raspberry Piカメラモジュール」を使用したものでしたが、
USBカメラも基本的には使えるとのことで、特に気にせず家にあったUSBカメラを使用することにしました。

【環境について】
Raspberry Pi3 Model b+
Raspbian GNU/Linux 11 (bullseye)
Python3.9.2
カメラ:eMeet c960 USBカメラ

これがRaspberry Pi カメラモジュール

これが気に入っているWebカメラ

※今回使用する

まずは、超簡単に撮影して保存するプログラムを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

すると、選択画面が表示されるので、下記の手順で操作していきます。

3.Interface Optionsを選択
I1 Legacy Camera Enable/disable…を選択
<はい>を選択

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)

相談・質問を募集しています。

記事に関する相談・質問を募集しています。

是非この機会にどうぞ
コメントでの質問も大歓迎です!

ハヤぶろぐのLINE@登録はこちら


メールの方はこちら




-Python, Raspberry Pi