2009年6月30日火曜日

大人の科学

大人の科学マガジン Vol.24 (4ビットマイコン)
買ってきました

小学生のころ欲しかったけど買えなくて、友達が持っていて頼んで1週間貸してもらった思い出があります

7セグ1つとLED7つしかなくて、メモリも少ないし何が出来るか非常になやみました
なつかしいな~

その後、マイコンがどうしても欲しくて、日本橋の共立電子で何か良く分からないまま、マイコンLSIだけ買ってデータシートを眺めてました。小学生の頃はデータシート見てもわかる分けもなく、ただマイコンに憧れたってだけでした。
結局大学生になってから、キーボードとLEDのくっついた似たような何かを作りました。

小学生の頃はお小遣いを貯めて、日本橋の電気街に行ってパーツを買うのが楽しみでした。結局そのままの興味を引きずって、大学は工学部へ行って、今の仕事に就いたから、なんとういかあの頃が人生を決めたような感じです。

自分のやりたいことが見つからないまま大人になる人が結構いますが、子供の頃からやりたいことを続けてこられたことは幸せなんだな~と思います

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

2009年6月16日火曜日

VirtualBoxで開発

星羽さんとこのエントリーを見て、Ubuntu上のVirtualBoxで仮想Windows7を走らせて、WindowsMobileアプリ開発をやってみました。

が、PentiumM 1.6GHzマシンではチョッと無理があったみたい。一応メモリは2GにしてWin7に1G割り当ててみたのだけど、やっぱり重い。
VisualStudio2008を起動してコーディングすることは何とか出来る。ちょっとレスポンスが悪いけど我慢できるかなぁ…うぅーーーん、ってぐらい(ニュアンスわかんないか)
でもWM5のデバイスエミュレータを起動して実行!ってすると、行ったきりなかなか帰ってこない。(もともと、ちょい重いプログラムだったのだけど)
お茶飲んでる間に、メモリエラーが出て終了!、コード書き換えて再実行!また帰ってこない。
歯を磨いて戻ってくるとまだ実行中。もう寝るか~、って感じで全然デバックすすまなかった。



仮想マシン上で更にエミュレータが動いている状況もアレですが、3日くらいやってみてメゲました。Core2だったら使えるくらいのレスポンスがあるのかな?

VirtualBox上で実機と接続できれば、もうすこしマシだと思うけど、まったく認識されなくなってしまったのでしかたないです(最初はデバイスの認識は出来ていたのに、一回デバイスを引っこ抜いたらLinux上で認識されなくなってしまった)

引退させたHPマシンを復活させるか…




2009年6月11日木曜日

cblsrv

Xilinxのデバイス書き込みはImpactを使うのだけど、cableserverを走らせたリモートPCとTCP接続してリモート制御ができます。TCPなんでパケット眺めたらケーブルサーバーの処理が判読できて自前のケーブルサーバが作れたりして、トラ技のおまけUSB-CPU基板がJTAGライタになったりするんじゃない?って考えていました。

が、トラ技6月号にそのものずばりの記事がありました。どうやらオープンソースのケーブルサーバcblsrvが存在するらしい。なんだ素晴しい!

トラ技のおまけ基板以外にも、cblsrv + FT2232 でimpactが使えるようにした人もいました。なひたふさんのところでJ-Writer完成ってあったので買っちゃうか?とか思いましたが、やっぱりImpactから直接使えた方が楽だよなぁって気もします

http://sourceforge.net/projects/xilprg

2009年6月9日火曜日

Opera10Beta

4年ほど前に購入したWindowsノートPCが調子悪いので、嫁さんからおさがりでもらったDELのINSPIRON9200にUbuntu9.04をインストールした物をしばらく使っています。

普通にWebを見たり、デジカメの写真を見たりするぐらいならLinuxだろうがWindowsだろうがOSXでも別に何でも良いわけで、これでMicrosoftとおさらばできるかもと思っています。

それでもやっぱりWindowsが必要な時もあってVirtualBoxをいれてみたりなんかしてる今日この頃です。

WebブラウザはWindowsでもLinuxでもOSXでもFirefoxを使っています。でも、さすがに5年前のPCではFirefoxはちょっと思いかなって気がするので、最近発表されたOpera10Betaを入れてみました。

OperaがFirefoxより軽いかというと、いまのところさほど実感はわかないです。起動はFireoxより早いと思いますが(Firefoxはプラグインをいくつか入れてるせいか起動が遅い)

それよりOperaの日本語表示が汚さが気になってしまう。一部の日本語は化けるし。あとキーボードの入力を受け付けなくなることがたまにあるみたい(ちょっと致命的だけど、beta版だからだろうか?)

日本語表示の汚さはココにも書いてましたが、

/usr/share/opera/defaults/font.ini

の日本語font指定の記述にVL*|IPA*フォントの指定を追加すると綺麗になりました

family:kochi*|VL*|IPA*=japanese good try-first

その他、メニューやメッセージを日本語化するには

http://www.opera.com/download/languagefiles/

より適当な言語設定ファイルをダウンロードして、ココを参考にして設定しました。


その他、スペードダイアルの検索をGoogleに変更する為に、設定->Web検索->編集->詳細画面でスピードダイアルにチェックを入れました


2009年6月7日日曜日

VirtualBoxその2

Ubuntu9.04上のVirtualBoxでUSBを使用するにはグループの設定が必要らしい
Ubuntu9.04にVirtualBoxをインストール 〜USBフラッシュメモリ〜 | 我が心のあれこれ

システム->システム管理->ユーザーとグループからグループの管理ボタンを押してvboxuserグループのプロパティ設定を開き、ユーザーにチェックを入れればOKでした
(一応起動しなおす)

Posted by Picasa


USBフラッシュは無事に認識して使用で来ました
WS011SHを接続して見たところドライバのインストールでエラーとなって使用で来ませんでした。その後システムから2度と認識されなくなってしまいました。謎...

VirtualBox

MacBookにVirtualBoxを使ってWindows7 RCを入れました - 星羽子猫日和を見て”その手があったか”と思って偽Mac風Ubuntuマシンに入れてみることにしました

SynapticパッケージマネージャからVirtualBoxをインストールして、仮想マシン上にWindows7RC版をインストール

順調にインストール完了。ここで仮想マシン上でUSBが使えないことに気がつきました。パッケージマネージャからインストールしたOSE判とやらではUSBは使えないらしい

OSEではないバイナリをダウンロードしてインストールしてみたら表示がおかしくなってしまいました。透明というか、加算合成のような画面でちょっと使えない



ぐぐってみると
env XLIB_SKIP_ARGB_VISUALS=1 VirtualBox
として起動するとよいらしいです

そんなこんなで手間取って、USBはまだ使えてません


Posted by Picasa

2009年6月3日水曜日

ポップコーンマシーン

今日が誕生日だったんだけど、昨日の話し


家に帰ったら子供からの誕生日プレゼントでポップコーンメーカが届いてました。このまえの「ちび丸子ちゃん」の影響です。
誕生日は明日なんだけどねぇと思いながら見たら、もう既に開封済みで、しかも使用後でした...
「おとうさんへのプレゼントなんでしょ?なんで先に使っちゃうかな~」と思いながらも賞味期限3年前の豆で作ったらしいポップコーンをおいしくいただきました。ありがとう。




これで毎日ポップコーンが食べれるね!
また太っちゃうよ~
Posted by Picasa

2009年6月1日月曜日

Androidとかjigletsとか

これすごいなー

ウィルコム「Advanced/W-ZERO3 [es]」でAndroidを動作させているムービー | memn0ck.com
[Android]アドエス(WS011SH)でAndroidを動かす ~第1回(動画) - .h2o2のお気楽日記

jigletsって何が出来るんだろ?ちょっと気になる
jig.jp、WILLCOM NS向け「jiglets」の開発キットを公開
jiglets for WS026T


近頃はWindowsMobile用の開発環境に関してちょっと残念というか
Visual Studio 2010 には WM開発環境はありません T-T
らしいし、Marketplaceは微妙な感じだし、週末プログラマには魅力的な話題が無いので、
Androidにチョー惹かれてます(実態は知らないけど)

ちょこっとコーディングしたらサクッ動いたみたいな感じで面白いアプリがつくれたらなぁーって思います