2009年6月27日土曜日

ハンバーグ

3日ほど前に、息子(小5)が「ハンバーグなら作れる」と言うので、「ほんなら作ってみいや」というやり取りをしたので、晩ご飯にハンバーグを作らせてみました(今日も嫁さんいないし)。お父さんは、手出しせず、ビデオで撮影に専念

ちなみに今まで息子は家で料理をしたこと無いです。ハンバーグも作ったこと無いはずですが、嫁さんが作っているのを横で見たことはあるらしい。

作り方は…インターネットで調べてました。今時の子供は…教えてもいないのに

泣きながら玉ねぎを切って
材料を用意して…


コネます。いやーお父さんだって、やったこと無いですよ


オィ!ハートは良いけど、ドーナツは止めとけ!


なんとか完成
おいしかったです
ありがとう

Posted by Picasa

WMで顔認識その4

恥ずかしいけど、顔認識プログラムのソースを公開しときます。

http://sites.google.com/site/windowsmobilesmile/

顔認識部分に関してはサンプルソースのほぼそのままです

フェイスマーク画像から、合成用のマスク画像を作成に以下の用にしました

bool LoadFaceImage(LPTSTR fpath, LPTSTR mpath)

{

if(fpath[0]!=0)

{

char cpath[MAX_PATH];

WideCharToMultiByte(CP_ACP,0,fpath,-1,cpath,sizeof(cpath),0,0);

face_img = cvLoadImage (cpath, CV_LOAD_IMAGE_COLOR);

if(mpath[0]!=0)

{

WideCharToMultiByte(CP_ACP,0,mpath,-1,cpath,sizeof(cpath),0,0);

mask_img = cvLoadImage (cpath, CV_LOAD_IMAGE_GRAYSCALE);

}



if(face_img && !mask_img)

{

IplImage *tmp = 0;

mask_img = cvCreateImage(cvGetSize(face_img),IPL_DEPTH_8U, 1);

#if 1

tmp = cvCreateImage(cvGetSize(face_img),IPL_DEPTH_8U, 3);

cvCvtColor (face_img, tmp, CV_BGR2HSV);

uchar sh = tmp->imageData[0];

uchar ss = tmp->imageData[1];

uchar sv = tmp->imageData[2];

CvScalar lower = { sh -16, ss -32, sv -32, 0},upper = { sh + 16, ss + 32, sv + 32 , 0};

cvInRangeS(tmp, lower, upper, mask_img);

cvReleaseImage(&tmp);

#else

uchar sb = face_img->imageData[0];

uchar sg = face_img->imageData[1];

uchar sr = face_img->imageData[2];

CvScalar lower = { sb -32, sg -32, sr -32, 0},upper = { sb + 32, sg + 32, sr + 32 , 0};

mask_img = cvCreateImage(cvGetSize(face_img),IPL_DEPTH_8U, 1);

cvInRangeS(face_img, lower, upper, mask_img);

#endif



tmp = cvCreateImage(cvGetSize(face_img),IPL_DEPTH_8U, 1);

cvNot(mask_img,tmp);

cvReleaseImage(&mask_img);

mask_img = tmp;



}

}

return true;

}




(1)フェイスマーク画像をRGBからHSVに変換
cvCvtColor (face_img, tmp, CV_BGR2HSV);

(2)左端の画素のHSV値を取得
uchar sh = tmp->imageData[0];
uchar ss = tmp->imageData[1];
uchar sv = tmp->imageData[2];

(3)誤差範囲を指定して左端の画素と同じ色の画素を0、その他を255とするマスク画像を作成
CvScalar lower = { sh -16, ss -32, sv -32, 0},upper = { sh + 16, ss + 32, sv + 32 , 0};
cvInRangeS(tmp, lower, upper, mask_img);
cvReleaseImage(&tmp);

RGBのまま処理をするばあいは(1)のHSV化を省略する。
誤差範囲を調整して抜け具合を調整する


フェイスマークを画像に合成するコード

bool DrawFaceMark(CvRect *r, int idx)

{

if(face_img==0)

{

CvPoint center;

int radius;

center.x = cvRound (r->x + r->width * 0.5);

center.y = cvRound (r->y + r->height * 0.5);

radius = cvRound ((r->width + r->height) * 0.25);

cvCircle (src_img, center, radius, colors[idx % 8],-1, 8, 0);

}

else

{

CvSize sz;

sz.width = r->width;

sz.height = r->height;

IplImage *rfimg = cvCreateImage(sz, IPL_DEPTH_8U, 3);

IplImage *rmimg = cvCreateImage(sz, IPL_DEPTH_8U, 1);

IplImage *trimg = cvCreateImage(sz, IPL_DEPTH_8U, 1);

cvResize(face_img, rfimg, 1);

cvResize(mask_img, rmimg, 1);

cvThreshold (rmimg, trimg, 90, 255, CV_THRESH_BINARY);

cvReleaseImage (&rmimg);

rmimg = trimg;





cvSetImageROI (src_img, *r);

cvCopy(rfimg,src_img,rmimg);



cvReleaseImage (&rfimg);

cvReleaseImage (&rmimg);

}

cvResetImageROI(src_img);



return true;

}


(1) r がフェイスマークの位置を示す構造体。rサイズの画像を3枚作る
CvSize sz;
sz.width = r->width;
sz.height = r->height;
IplImage *rfimg = cvCreateImage(sz, IPL_DEPTH_8U, 3);
IplImage *rmimg = cvCreateImage(sz, IPL_DEPTH_8U, 1);
IplImage *trimg = cvCreateImage(sz, IPL_DEPTH_8U, 1);

(2) フェイスマーク画像、マスク画像を(1)の画像にリサイズする
cvResize(face_img, rfimg, 1);
cvResize(mask_img, rmimg, 1);

(3)リサイズしたマスク画像を適当なしきい値で2値化する。(元のマスク画像は2値化されているけど、リサイズで境界部分に中間値ができる)
cvThreshold (rmimg, trimg, 90, 255, CV_THRESH_BINARY);
cvReleaseImage (&rmimg);
rmimg = trimg;

(3)元画像の置き換える部分を指定する
cvSetImageROI (src_img, *r);

(4)マスクを指定して元画像にリサイズしたフェイスマスク画像をコピーする
cvCopy(rfimg,src_img,rmimg);

(5)作った画像を開放して、(3)で指定した範囲を解除する
cvReleaseImage (&rfimg);
cvReleaseImage (&rmimg);
cvResetImageROI(src_img);

ROIを指定すると、画像の一部を書き換えることが出来る

2009年6月22日月曜日

旅行

嫁さんが旅行に行ってしまいました
毎度のことなんで、得に問題無しと思っていたら、今週は子供の社会科見学があって
お弁当を用意しなきゃいけない!!

どどどどどーする!弁当なんて作ったことないよ~

2009年6月21日日曜日

アイフィルタ

WZR-HP-G300NHはルーターモードで使用すると有害サイトのフィルタリングが出来るi-フィルターが60日お試しできます。

有害サイトフィルタはVistaのペアレンタルコントロールやNotonのペアレンタルコントロール等を試した事はありますが、結局継続して使用するには至りませんでした。
フィルタを有効にすると殆どのサイトがブロックされて、その度に解除するのが面倒になってフィルタリングを止めてしまいました

海外メーカーの作ったフィルタリングソフトだから日本のサイトは精度が悪いのかと思ってました。i-フィルタは国内メーカで使用実績もあるみたいなので興味がありました。WZR..ではルータ側でフィルタ機能を走らせているのでパソコン側での設定もいらず手軽に使えそうなので試してました

ルーター機能をONにするとi-フィルタの設定が出来るようになります。まずは無料お試しサービスを申し込みます。

i-フィルターの設定画面で設定パターンを選択します。子供が小学生なので"小学生向け"を選びます。自動的に禁止カテゴリーにチェックが付きますが、手動で変更するにチェックを入れると個別にチェックを付け外しできます

サイトに関する設定はこれだけで、後はフィルタリングを除外するPCを設定することが出来ます。

この状態で試してみると
Googleカレンダー/Youtube等が表示できなくなりました。
その場でフィルタリングを解除することは出来るのですが、なんと解除してしまうと全てのサイトがフィルタリングされなくなります。
フィルタリングの設定は上記画面のカテゴリー別のOn/Off設定か、PC全体でのOn/Offしかできません。
これではブロックされるサイトが多すぎて我が家では使えなさそうです。PCを家族で共有している場合はユーザ毎のブロック設定も出来ないので、ブロックは最低限のカテゴリーにしておくしかなさそうです

暫く使ってみましたが、やたらと下の画面が出るようになって家族には不評です。picasaでのブログアップロードも出来なくなりました。


というわけでi-フィルタも1日で解除することになりました。

子供達は勝手にサイト検索してYoutubeで動画を見たりするので心配ですが、かといってサイト検索を禁止するのもツマラナイと思います。
ペアレンタルコントロールはなかなか難しいです。



Posted by Picasa

WMで顔認識その3

先週からはじめたOPenCVをWM用にビルドして顔認識を動かす試みですが、あっという間に1週間たってしまいました。OpenCVの(部分的な)移植自体は大した手間も無く出来たのですが、WMアプリとして仕上げるのにやたら時間がかかってしました。
日ごろはC#ばかり使っているのでWin32を使ってアプリを作るのは非常に骨が折れるというか、途中で気力が折れてしまいました。改めて他のアプリ作者さんには頭が下がる思いです。そんなこんなでGUIとしては完成半ばな感じですが、とりあえず終了することにしました。当初の目的は顔認識を動かすことだったので、よしとします。


そんな事より問題はGUI以前に処理時間が非常にかかるという事で、画像変換処理にだいたい1分ぐらいかかります(1分かけて顔をきちんと認識できていないときはがっかりします)。PCで動かしたことが無いので比較は出来ませんが、携帯端末の処理能力ではこんなものなのか?良く分かりません

一分もかかるなら、画像をサーバーにアップロードしてサーバーで処理させたほうが良いような(そういうサイトもあるみたい)気もします。
実用度としては、あまりなさそうですが、可能性というか、面白いと思う人は試してみてください(環境によって、ちゃんと動くかどうかも怪しいです)

動作環境
WS011SHでしかためしてません

ダウンロード
ファイル

インストール
インストーラはありません。
本体上の適当なフォルダに展開して置いてください。
OpenCVのライブラリ(*.dllファイル)を含みます。OpenCVのファイルに関してのライセンスは添付license.txtファイルに従います。このプログラムを使用することによって生じたいかなる結果にも責任は負いません。

使用方法
起動時にオプションを指定して実行します
wmsmile.exe -i 入力画像ファイル.jpg -o 出力画像ファイル.jpg -f フェイスマーク画像.jpg -m フェイスマークマスク画像.jpg -h 学習ファイル -q -s

すべてのオプションは省略できます
-i 入力画像を指定します。jpgファイルを指定できます。省略した場合は画像選択ダイアログを開きます
-o 出力画像を指定します。jpgファイルを指定できます。省略した場合は入力画像ファイルを上書きします。元のファイルは入力画像_.jpgファイルとしてバックアップします
-f フェイスマーク画像を指定します。jpgファイルを指定できます。省略した場合はface.jpgファイルを使用します
-m フェイスマークマスク画像を指定します。jpgファイルを指定できます。省略した場合はmask.jpgファイルを使用します。mask.jpgファイルが存在しない場合はフェイスマーク画像より自動生成します。(左上画素カラーを透明色とします)
-h 顔認識の基準ファイルを指定します。xmlファイルを指定できます。省略した場合はhaarcascade_frontalface_alt.xmlファイルを使用します
-q 変換後にプログラムを自動終了します
-s 出力画像のサイズを320pixelにします。していない場合は640ピクセルです

起動直後の画面:xmlファイルの読み込みに10秒くらいかかります


変換完了画面:画像を指定してから1分くらい処理に時間がかかります。処理中はUIの反応はありません


変換完了画面:もうひとつ。顔の大きさにあわせてフェイスマークのサイズもかわります


添付したフェイスマーク画像は、上で見せているものと違います(上の画像はネットから拾ったものを使ったので、添付は控えました)
適当に自分で作った画像を入れてください


Posted by Picasa

2009年6月18日木曜日

WMで顔認識その2

顔認識プログラムをコマンドラインのアプリとして作ったら、Gsfinderで起動すると実行中なのか終了したのか?判断が出来ないので、実行中はダイアログを出すようにしようと思い作業してます。
でも、メイン処理は行ったきりなので、ダイアログ側の処理も止まってしまってリペイントも何も無い状態になります。
実行中のプログレスバーみたいなのを出したいだけなんだけどねー

それにしてもネイティブアプリの開発ってメンドクサイ。ウィンドウを出すのにも四苦八苦してます。.NETなら楽に出来るのにって思います

2009年6月17日水曜日

WMで顔認識

画像処理ライブラリのOpenCVをWindowsMobile用ビルドして、顔認識するプログラムを作ってみました。
写真中の人物の顔を認識してフィスマークに置き換えます。いわゆる笑い男なんちゃらみたいなかんじです。
プログラム自体はWeb上にあるOpenCVのサンプルプログラムをほぼコピペしたものです。

とりあえずコマンドラインで動くものを作って、フロントエンドみたいなのを後付するかと思ってやってみたけど、アドエスで実行したら処理完了までに40秒くらいかかった。最初に顔認識の学習データ(xmlファイル)を読み込ませるのだけど、これにチョー時間かかるみたいです。

ためしに何枚か写真を変換してみたけど、子供の顔は認識に失敗することが多いみたい、帽子をかぶった顔とか、顔の大きさとかでも認識精度に影響があるのかも、あと横顔もだめだと思う



処理時間とか、実行中のメッセージが何もないとか色々問題あるので、もうちょっと手を加えたらら公開しようと思ってますが、OpenCVってバイナリ公開とかしていいのかな?

OpenCVの移植は
cv.dll と cxcore.dll と highgui.dllの一部で、WM向けに場当たり的な修正をしたのでチョイ不安あり。highguiはjpegの読み書きだけに使ってます。WMのAPIだけでjpegファイルは処理するつもりでしたが、jpegファイルの保存の仕方が分からなくってlibjpgもビルドしてhighgui経由でjpegファイルのアクセスをするようにしました。(無駄ですが)

jpegファイルはサイズが大きいと実行中にメモリエラーを起こすので、小さめにリサイズします。リサイズ処理なんかはOpenCVでサクッと記述できるので楽チンでした
Posted by Picasa