昨年辺りから、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を押すと終了する。
なお、簡単に計測した所、フレームレートは以下のようであった。
1280x720 | 8fps |
640x480 | 17.5fps |
320x240 | 27fps |
コメント