2014年2月21日金曜日

Raspberry Pi + OpenCV 日経Linux の顔認識が動かない

日経Linux の 2013/8 や「電子工作入門」に掲載されている「専用カメラモジュールを活用“美女Linux”を顔認識」をやってみた。
その結果は、動かなかった。
まず、この記事で使用している「まなみん」だか「てるみん」という女性の顔写真が入手できない。しかたがないので、IMDb で適当な番組を検索して、その出演者の顔写真をダウンロードして使用した。
3/4 くらいは認識できなかった。
Wil Wheaton、Patrick Stewart、Naveen Andrews、Michael Emerson、Matthew Fox、LeVar Burton、Ken Leung、Josh Holloway、Jorge Garcia、Jonathan Frakes、Grace Park、Brent Spiner、Mayim Bialik、Simon Helberg、Johnny Galecki、Kunal Nayyar は認識できる顔写真だった。さらに探して20枚でやってみた。
で、実行すると・・・。
pi@raspberrypi /opt/vc/camcv $ ./camcv face.cfg 1 5000
start
(init) People initialized
(OK) csv=face.cfg
(init) 10 pictures read to train
(init) 10 pictures of Pierre (0) read to train
(init) 0 pictures of Natacha (1) read to train
(init) 0 pictures of Mona Lisa (2) read to train
(init) 0 pictures of Lisa (3) read to train
(OK) read CSV ok
(init) taille images ok
(init) start train images
(init) train images : ok
(init) Load modele : ok
Xlib:  extension "RANDR" missing on display ":1.0".
mmal: main: Failed to create preview component
mmal: Failed to run camera app. Please check for firmware updates

2668812741 seconds for 0 frames : FPS = 0.000000
pi@raspberrypi /opt/vc/camcv $ 

「mmal: main: Failed to create preview component」と言われてしまう。
このメッセージの出所を調べると、camcv_vid1.cpp の 764 行めあたりにあるこれ「else if (!raspipreview_create(&state.preview_parameters))」が、エラーの条件を判断しているところであることがわかった。
次に、「raspipreview_create()」が何を返しているかを調べてみた。
RaspiPreview.h で宣言されていて、MMAL_STATUS_T を返している。
それは、mmal_types.h に定義されている enum の値であった。
見ると、「MMAL_SUCCESS = 0」となっているではないか。
さきほどの「else if (!raspipreview_create()」は0でなければエラーとしている。
でも0なら MMAL_SUCCESS ということで、エラーの無い状態です。
逆なんです。というわけで 764 行めを次のように変更した。
else if (raspipreview_create(&state.preview_parameters) != MMAL_SUCCESS)
0でエラー、ではなく、0でなければエラー、にした。
これで一応なんとか動いているが、しばらくするとやっぱりエラーがでる。
pi@raspberrypi / $ /opt/vc/camcv/camcv /opt/vc/camcv/face.cfg 1 5000
start
(init) People initialized
(OK) csv=/opt/vc/camcv/face.cfg
(init) 10 pictures read to train
(init) 10 pictures of Pierre (0) read to train
(init) 0 pictures of Natacha (1) read to train
(init) 0 pictures of Mona Lisa (2) read to train
(init) 0 pictures of Lisa (3) read to train
(OK) read CSV ok
(init) taille images ok
(init) start train images
(init) train images : ok
(init) Load modele : ok
Xlib:  extension "RANDR" missing on display ":1.0".
mmal: Failed to run camera app. Please check for firmware updates

65 seconds for 208 frames : FPS = 3.200000
pi@raspberrypi / $ 

これって、そうしているようです。
同じソースファイル camcv_vid1.cpp の 233 行めにこれがありました。
state->timeout = 65000; // capture time : here 65 s
65秒で止まるようにしてありました。でも「Please check for firmware updates」は無いと思います。