Raspberry Pi でOpenCV を試す | たけおか ぼちぼち日記

たけおか ぼちぼち日記

思いついたらメモ

Raspberry Pi でOpenCV を試す

Raspi をロボットの中に入れたい人が多いらしい。
じゃ、画像の入力と、画像認識の初歩をやってみないと…

↓に、すでに行っている先哲がっ! そのまま、真似をさせて頂きます。
Raspberry Pi への OpenCV インストール.by いしわたむねお氏


顔認識もやりました。

これも先哲の成果を、ほぼそのままパクリさせて頂きました。
OpenCV本家の"cvHaarDetectObjects"の顔認識例

raspberrypi/OpenCVを使って顔認識しました by 竹本浩氏



カメラを接続する

あたくしは、手元にあった、安い Logitech の WebCam をつないでみた。
ロジクール Logicool QCAM-E2500 [USB接続 30万画素 Logicool Qcam E 2500](ヨドバシ)
たけおか ぼちぼち日記-Logitech-Webcam

-- 2013/JUL/06 追記--
Logicoolの 861200というWebカメラでも同様に使えた。
$たけおか ぼちぼち日記-QCAM 861200
--



% lsusb
:
Bus 001 Device 010: ID 046d:089d Logitech, Inc. QuickCam E2500 series


-- dmesg --

[ 134.201702] usb 1-1.2.1: new full-speed USB device number 9 using dwc_otg
[ 134.304615] usb 1-1.2.1: New USB device found, idVendor=046d, idProduct=089d
[ 134.304645] usb 1-1.2.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 134.387759] Linux media interface: v0.10
[ 134.419926] Linux video capture interface: v2.00
[ 134.430733] gspca_main: v2.14.0 registered
[ 134.443630] gspca_main: gspca_zc3xx-2.14.0 probing 046d:089d
[ 134.452089] input: gspca_zc3xx as /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.1/input/input3
[ 134.467547] usbcore: registered new interface driver gspca_zc3xx
[ 134.623279] usbcore: registered new interface driver snd-usb-audio

--

てな感じで、めでたく認識されて使えた。
挿すだけで使えたので、正直、大変驚いた。

ちなみに、Logitechの このWeb カメラは、安価だが、近接撮影ができ、
紙や基板やLSIに書かれた文字などを、撮影することが可能。
電話会議中に、そういうものの画像を送ることができて、非常に便利。
(電話会議で、自分の顔を送るようなことはしない)



OpenCVのインストール

BSDな人間なので、ソースから make したいが、Linuxだから、目をつむって楽をするぜ。

% sudo bash
# apt-get install libopencv-dev

以上


OpenCV な 画像取り込み & 表示アプリケーション

上記の いしわたむねお氏の Raspberry Pi への OpenCV インストール.by いしわたむねお にある Cソースを、まるまるコピペすると、OKです。

-- あたくしが書いた Makefile (当該のソースファイルは、「cam-view.c」とする)--

CXX = g++
LDFLAGS = -lopencv_legacy -lopencv_highgui -lopencv_core -lopencv_ml -lopencv_video -lopencv_imgproc -lopencv_calib3d -lopencv_objdetect -L/usr/lib
CPPFLAGS = -g -I/usr/include/opencv -I/usr/include/opencv2

all: cam-view

---

% make
して、うまくできたら、

% startx
として、X Window Systemを起動しておいて、

% ./cam-view
とすれば、数秒して、窓が開き、カメラからの入力が窓に表示される。

このアプリケーションは、真面目な X Window アプリケーションである。
ssh -X で入ってると、元の機械に窓が出て使える。
(最初、適当に、ssh -X している状態で起動したら、手元に機械にカメラの画像が出て、非常に驚き&喜んだ)


うーん。とても簡単だった。
Webカメラを発掘する時間も含めて、20分ぐらいだった。
いしわた氏と、OpenCV(Intel)とそれをパッケージしてくれてる人たちに感謝。



たぶん、電源が弱いせいだと思うが…
盛大に、このアプリケーションでWeb カメラを動かしていると、
Raspiのシステムが不安定になる。(Ehter I/Fが使えなくなったり)
僕は、Webカメラは、電源付きUSB Hubにつないでいるのだが…
Raspi で、監視カメラや、画像認識付きロボットをつくるには、もうちょっと、電源まわりの強化が必要かも知れない。


顔認識を試した。 (2013/JUN/23 17:00 加筆)

上記のカメラ入力部と、↓を組み合わせる。
OpenCV本家の"cvHaarDetectObjects"の顔認識例

すると、竹本浩氏が作られた↓になる。
raspberrypi/OpenCVを使って顔認識しました by 竹本浩氏

ソースコード中に C99 文法的な記述があったので、普通の C89的に修正した。


#include "cv.h"
#include "highgui.h"

char* cascade = "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml";

#define DISP_WIN "faceDetect"


CvSize minsiz ={0,0};

int
main( int argc, char** argv )
{
int i;
double w = 160;
double h = 120;
cvNamedWindow( DISP_WIN , CV_WINDOW_AUTOSIZE );
CvCapture* capture = NULL;
if (argc > 1){
capture = cvCreateFileCapture( argv[1] );
}else{
capture = cvCreateCameraCapture( 0 );
// (2)キャプチャサイズを設定する.
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
}
IplImage* frame;

// 正面顔検出器の読み込み
CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*)cvLoad(cascade, NULL,NULL,NULL);

// 検出に必要なメモリストレージを用意する
CvMemStorage* cvMStr = cvCreateMemStorage(0);
// 検出情報を受け取るためのシーケンスを用意する
CvSeq* face;
while(1) {
frame = cvQueryFrame( capture );
if( !frame ) break;
// 画像中から検出対象の情報を取得する

face = cvHaarDetectObjects(frame, cvHCC, cvMStr,
1.2, 2, CV_HAAR_DO_CANNY_PRUNING,
minsiz, minsiz);
// 1.1, 3, 0, minsiz, minsiz);

for(i = 0; i < face->total; i++) {
// 検出情報から顔の位置情報を取得
CvRect* faceRect = (CvRect*)cvGetSeqElem(face, i);
// 取得した顔の位置情報に基づき、矩形描画を行う
cvRectangle(frame,
cvPoint(faceRect->x, faceRect->y),
cvPoint(faceRect->x + faceRect->width,
faceRect->y + faceRect->height),
CV_RGB(255, 0 ,0),
2, CV_AA, 0);

}
cvShowImage( DISP_WIN, frame );
char c = cvWaitKey(1);
if( c == 27 ) break;
}
// 用意したメモリストレージを解放
cvReleaseMemStorage(&cvMStr);
// カスケード識別器の解放
cvReleaseHaarClassifierCascade(&cvHCC);
cvReleaseCapture( &capture );
cvDestroyWindow( DISP_WIN );
}




-- Makefile --

CXX = g++

CPPFLAGS = -mfpu=vfpv3 -O4 -I/usr/include/opencv -I/usr/include/opencv2

LDFLAGS = -lopencv_legacy -lopencv_highgui -lopencv_core -lopencv_ml -lopencv_video -lopencv_imgproc -lopencv_calib3d -lopencv_objdetect -L/usr/lib

all: facedetect


% make
して、コンパイルが終了したら、
% ./facedetect
で、X サーバに窓がでて、認識結果が表示される。
$たけおか ぼちぼち日記-認識結果

はっきり言って、超遅い。この遅さはロボットには使えない。監視カメラならありえるか???
もうちょっと速くなるはずなので、パラメータを調整するべきであろう。
-- 2013/JUL/06 追記: 使えないほど遅い、ということもないようだ。用途による。




今回の、僕のRaspiのLinux (自分で make やり直したkernelです)
% uname -a
Linux nanami 3.6.11+ #2 PREEMPT Fri Jun 21 09:49:19 JST 2013 armv6l GNU/Linux