12 | 2025/01 | 02 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
ブログは単なるメモ帳となる予定。
画像を他の画像の(x,y)を左上とする位置に合成する関数を作った。自分は使わないけど。
void combine(IplImage* img, IplImage* add, IplImage* mask, const int x, const int y){ assert( img != NULL && add != NULL && mask != NULL ); assert( add->width == mask->width && add->height == mask->height ); const int i_max( ((x+add->width ) > img->width ) ? img->width - x : add->width ); const int j_max( ((y+add->height) > img->height) ? img->height - y : add->height ); for(int j = 0; j < j_max; ++j){ for(int i = 0; i < i_max; ++i){ if( mask->imageData[ j*mask->widthStep + i ] != 0 ){ // imgの(x+i,y+j)をadd(i,j)で上書き copyat(img, x+i, y+j, add, i, j); } } } return; }
とりあえずYIQ表色系とHSV表色系を併用するやり方でやってみた。おお、意外とこれだけでもうまくいってる。これなら補間とラベリングの組み合わせで何とかなりそう…というかHSVの方が良い肌色検出が出来てる気がするな…
今は時間がないのでソースは後ほど。
肌色検出にはYIQ表色系がいいらしいのでそれを使って肌色検出プログラムを作ってみた。しかし、私の部屋では背景も検出されてしまって使い物にならない。まあ壁の色が悪いんですが。実際の演習は、カメラ固定ではないので背景差分を使うことも出来ないし…あーでも演習の背景は風景だからこれでもいいのか…。とりあえず他の表色系での検出を併用する、輪郭情報を利用するなど何か他の方法を考えないといけないかな…。
以下、プログラム抜粋
void FreshDetect(IplImage* img, IplImage* detect_img, int max, int min){ const int maxpx(img->width*img->height); unsigned char b, g, r, i; // BGR -> YIQ // Y = 0.2990 * R + 0.5870 * G + 0.1140 * B // I = 0.5959 * R - 0.2750 * G + 0.3210 * B // Q = 0.2065 * R - 0.4969 * G - 0.2904 * B for(int a = 0; a < maxpx; ++a){ b = static_cast<unsigned char>(img->imageData[a*3+0]); g = static_cast<unsigned char>(img->imageData[a*3+1]); r = static_cast<unsigned char>(img->imageData[a*3+2]); i = static_cast<unsigned char>(0.5959*r - 0.2750*g + 0.3210*b); if( min <= i && i <= max ){ detect_img->imageData[a*3+0] = b; detect_img->imageData[a*3+1] = g; detect_img->imageData[a*3+2] = r; }else{ detect_img->imageData[a*3+0] = 0; detect_img->imageData[a*3+1] = 0; detect_img->imageData[a*3+2] = 0; } } }
前のエントリで動作確認してたWebカメラがUSBケーブルを一度抜き差ししたら認識されなくなった。いや、cvCreateCameraCapture()関数で何か見つけてきてるんだけど、それがカメラではないらしく、cvQueryFrame()関数で取得した物を表示すると縞模様という状態。本当は昨日何かプログラムを書きたかったんだけど、そのせいで何も出来なかった...
ようやく認識されるようになったので、他に同じ症状の人がいたときのために残しておく。
USB接続がどっかおかしいのかなあと思って、AMCAPというWebカメラ付属ソフトで見ると映像が表示できているので接続は問題ない。ただ、そのAMCAPではデバイスを選択する欄があり、そこにはBWC-130H01の他にも、NEC 61153 Captureというデバイスがあり、それを選択すると砂嵐が表示される。ということはOpenCVはこのNEC 61153 Captureを拾ってきているのかな?
じゃあ消しちゃえばいいじゃん。ということでデバイススマネージャでNEC 61153 Captureを削除しようと思ったんだけど、見つからない。で、ぐぐってみたらWebカメラの選択が出来ません。というスレッドを見つけた。
> デバイスマネージャから、NEC 61153・・・タブを無効に設定し、メッセンジャーのファイアーウォールも外し、プロキシの設定をしないでやっと映像が映りました!!!
> このデスクにはTVチューナーが内臓されているので、やはりロジクール以外の映像デバイスが邪魔をしていたようです。
> 映像デバイスを無効にしたので、メッセンジャーの設定でカメラもロジクールを選択することが出来ました。
そういや、俺のパソコンもキャプチャ(GV-MVP/RX3)はいってるな、と思ってデバイスマネージャの『サウンド、ビデオ、およびゲームコントローラ』内のI-O DATA GV-MVP/RX3を無効にして再起動したら、OpenCVがまたカメラを認識してくれるようになった。
今日こそは何かプログラムを...
買ったのはBUFFALOのBWC130H01。
ソフマップで4280円だったんだけど、ソフマップカード新規入会でその場で1000円引き出来るというので、もちろん入会しました。まあ、VISAカード持ってなかったのでいいかな、と。おかけで予想以上に手こずって講義に遅れかけましたが。
製品の方はドライバ周りで少し手こずったけど無事完了。OpenCVでの動作も確認。ということで、1つプログラムを書いてみようかな。