Raspberry Pi 2にUSBカメラを接続

昨年辺りから、Raspberry Piにカメラを付けて、Deep Learningさせたニューラルネットワークを使って物体認識させるのが流行ってるというか、今年の夏にTensorFlowが公式にRaspberry Piをサポートしたことで、定番から基本になりつつあるようだ。
近い内にAIを勉強しようと思っており(思い始めてからだいぶ経つが)、かつ、Raspberry Piを所有している身としては、一度やっておかないといけないと思っていた。

しかし、Raspberry Piのカメラモジュールは4,000円くらいするので、二の足を踏んでいた。筆者は貧乏性で、確実に元が取れると思えない限りはお金を使わない、よくそれで損をするタイプなのである。
そんな折、昔Skype英会話用に買ったUSBカメラが10回くらい使っただけで眠っているのを思い出した。2010年に買った、Logicool HD Webcam C270というやつである。思い出してからも、どうせ消費電力的に無理だろうと思っていたが、先月ふと思い立って繋いだら動いて、今の所特に電源異常は起こっていない。少し調べた限りでは、このカメラの消費電力が1.0WくらいでRaspberry Pi 2の消費電力が最大4.5W、使用しているACアダプターの出力が9.0Wなので、大丈夫のようだ。

PythonとCでOpenCVを使って動かしたが、安定的に動かすまでには結構試行錯誤したので、それなりに動くようになったコードを貼っておく。

●Pythonのサンプルコード

#!/usr/bin/python
import cv2

WINNAME = "Capture"
FRAME_INTERVAL = 30 # msec

CAPTURE_WIDTH = 1280
CAPTURE_HEIGHT = 720

ret = False
while ret == False:
	cap = cv2.VideoCapture(0)
	cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, CAPTURE_WIDTH)
	cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, CAPTURE_HEIGHT)
	ret, img = cap.read()

key = 0
while key != ord('q'):
	ret, img = cap.read()
	cv2.imshow(WINNAME, img)
	cv2.moveWindow(WINNAME, 0, 0)
	key = cv2.waitKey(FRAME_INTERVAL)
	if key == ord('s'):
		cv2.imwrite('capture.jpg', img)

cap.release()
cv2.destroyAllWindows()

実行する前に、

sudo apt install python-opencv
などとしてaptでpython-opencvをインストールしておく。

なお、Python3でも動かそうと思ったが、aptにpython3-opencvが無く、代わりにaptでpython3-pipをインストールして

sudo pip3 install opencv-python
とすれば良いと思うのだが、下のようなエラーになったので、今回は諦めた。
(pip3 install --upgrade pipとしてpip3を最新にしても同じ結果だった)
Could not find any downloads that satisfy the requirement opencv-python
Cleaning up...
No distributions at all found for opencv-python

●Cのサンプルコード

#include <cv.h>
#include <highgui.h>

#define WINNAME "Capture"
#define FRAME_INTERVAL 30 /* msec. */

#define CAPTURE_WIDTH 1280
#define CAPTURE_HEIGHT 720

int main(int argc, char *argv[])
{
	CvCapture *capture = NULL;
	IplImage *frame = NULL;
	int key;

	while (!capture)
	    capture = cvCreateCameraCapture(0);

	cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, CAPTURE_WIDTH);
	cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, CAPTURE_HEIGHT);

	cvNamedWindow(WINNAME, CV_WINDOW_AUTOSIZE);
	cvMoveWindow(WINNAME, 0, 0);

	do {
		frame = cvQueryFrame(capture);
		cvShowImage(WINNAME, frame);
		key = cvWaitKey(FRAME_INTERVAL);
		if (key == 's')
			cvSaveImage("capture.jpg", frame, NULL);
	} while (key != 'q');

	cvDestroyWindow (WINNAME);
	cvReleaseCapture(&capture);
	return 0;
}

コンパイルする前に、

sudo apt install libopencv-dev
などとしてaptでlibopencv-devをインストールしておく。

コンパイルは、次のコマンドで行った。

gcc camera_test.c `pkg-config --cflags --libs opencv` -lm -o camera_test

いずれも、sを押すとカメラ画像がcapture.jpgに保存され、qを押すと終了する。


なお、簡単に計測した所、フレームレートは以下のようであった。

1280x7208fps
640x48017.5fps
320x24027fps