Raspberry PiでPython版OpenCVによるカメラ画像を表示する方法

Python版OpenCVでカメラ画像を表示

2017年9月、Raspberry PiでPython版OpenCVを用いてUSBカメラ画像を簡単に表示することができました。使用したUSBカメラは、ELECOM社のUCAM-DLF30EWHです。

USBカメラ

USBカメラ

Raspberry PiにOpenCVとPython版OpenCVのパッケージをインストールし、簡単なPythonスクリプトを書いただけでカメラ画像を表示することができました。USBカメラのドライバーなどが必要かと思いましたが、接続するだけですぐ使用することができました。


Pythonのバージョンを確認します。

$ python
Python 2.7.13 (default, Jan 19 2017, 14:48:08) 
[GCC 6.3.0 20170124] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()

OSバージョンを調べます。

$ uname -a
Linux pi3 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.1 (stretch)
Release:        9.1
Codename:       stretch

パッケージのインストール

OpenCVとPython版OpenCV パッケージをインストールします。

$ sudo apt-get install libopencv-dev
$ sudo apt-get install python-opencv

カメラ画像表示のスクリプト

カメラ画像表示のスクリプトを下記に示します。OpenCV-Python チュートリアルのサンプルコードを参照しました。

OpenCV-Python Tutorials 1 documentation » OpenCV-Pythonチュートリアル » OpenCVのGUI機能 »

Raspberry Piとカメラ

Raspberry Piとカメラ

$ cat caminput.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import cv2
print(cv2.__version__)

cap = cv2.VideoCapture(0)

while( cap.isOpened() ):

    ret, frame = cap.read()
    cv2.imshow('Capture',frame)
    key = cv2.waitKey(1)
    #print( '%08X' % (key&0xFFFFFFFF) )
    if key & 0x00FF  == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

カメラ画像表示の説明

「print(cv2.__version__)」で、OpenCV のバージョンを表示します。OpenCVのバージョンは、2.4.9.1 となりました。

「cv2.VideoCapture(0)」で、VideoCaptureクラスをインスタンス化して、インスタンス cap を生成します。「cap.isOpened()」で、初期化の成功を確認して真の間ループします。

「cap.read()」で、キャプチャーデバイスから次のフレームを取得して、デコードします。戻り値はタプル型で、複数の戻り値があります。順に変数 ret と frame に代入します。retは、正常に画像を取得した場合は真、異常の場合は偽となります。本来なら、retの値の確認が必要ですがエラーチェックは省略しています。frameには、画像が格納されます。

「cv2.imshow(‘Capture’,frame)」で、ウインドウCaptureにframeの画像を表示します。

「 key = cv2.waitKey(1)」で、1ミリ秒間キーイベントを待ちます。戻り値は、キーが押された場合はそのキーコード、キーが押されないまま指定時間が経過した場合は -1 となります。
ドキュメントに明確な説明がありませんが、下位8ビットにキーコード、上位16ビットに CTRL/Shift/Altの状態が格納されます。
print文のコメントを外すと、キーコードをコンソールに出力するので確認できます。Pythonの print文 ‘%08X’は、2の補数表現のマイナス値を正しく表示できないので (key&0xFFFFFFFF)と手を加えています。

キー入力 キーコード
a(小文字) 0000 0061
A +Shift 0001 0041
A +CTRL 0004 0041
A +ALT 0008 0041

キーコードの下8ビットを「key & 0x00FF」で取得し、キー(q)のキーコードを「ord(‘q’)」で取得して、一致しているかチェックします。キー(q)を入力すると、ループを脱出します。

最後に、「cap.release()」でインスタンスcapを解放します。「cv2.destroyAllWindows()」で、すべてのウインドウを破壊して終わります。

カメラの画像表示

カメラの画像表示

まとめ

Raspberry PiにUSBカメラを接続して、カメラ画像を表示することができました。Pythonスクリプトを使用するとOpenCVを簡単に使用することができました。