2010/12/30

冬休みの工作@Android

今年も残すところあと1日。
私も短いですが冬休みに入っています。

冬休み中にAndroidでちょっとしたアプリを作ろうと画策しています。

作るのは、簡易追跡プログラムです。
どうしてこれを作るのかというと、1月にママリャリのレースがあって、レースのコースをチームで交代交代走るのですが、前のメンバーが拠点に戻ってくるまで自分のチームがコース上のどこにいるのかかがわからないという問題があります。


ここでAndroid端末の出番です。
GPSセンサー搭載、3G回線搭載、バッテリー搭載、かつプログラムも自由に作れるという利点を生かし、自転車の前カゴに発信器側を取り付け、拠点内のもう一台の端末に現在地点の情報を送信するというものです。

今のところ考えている機器構成は下記の通りです。
送信側:IS01+ポータブル充電器(IS03を買ったときにおまけでもらいました)
受信側:IS03+エネループのUSB給電機能付きのもの
備考:IS01とIS03は家族割りの契約にしているので、端末間のCメールは無料

ソフトの機能は下記の通りです。
送信側:
起動して、「送信開始」ボタンを押すとサービスモードに移行し、1分置きにGPSセンサーを起動して現在地点の座標を取得します。
座標を取得したら、座標の情報と精度の情報を通知先の携帯電話(IS03)にCメールで送信します。サービスモードで動作させるので、端末のフタを閉じても動作し続けることができます。受信側から即時更新メールを受信した場合は、即時GPS情報を取得して返信し、停止メールがきた場合は、1分置きにメールを送る機能を停止します。

受信側:
起動して「受信開始」ボタンを押すと、Cメールの着信を監視するようになり、送信側からきたCメールの内容を解析してデータベースに蓄積していきます。蓄積したデータは、KML方式などにして出力し、OruxMapsなどの地図アプリで読み込めるようにします。

GPSとCメールの実験は終わったので、あとはサービスモードの実験を行ってから
実際のアプリ作成に入りたいと思います。

うまくいってもいかなくても、何かしら結果は記録しておきたいと思います。

ではまた。

2010/12/18

OpenCV 2.2+Qt の環境構築

モンハンが一段落したのでこっちを更新。

OpenCV2.2からはQtがサポートされました。
今までちょっと品不足だったボタンなどのGUIコントロールが、これによって拡充されることでしょう。

というわけで、今回はOpenCV2.2とQtを使うための設定を行ってみました。


Qtのインストールの方法はここを参考にしました。
1.まずはQt 4.7 SDKをNokiaからダウンロードします。
2.展開して ./configure を実行します。
3.make と入力してEnterを押します。
4.2時間ぐらいかかるので、何か別の作業をして待ちます。
5. sudo make install を実行すると、インストールされます。
6./usr/local/Trolltech/Qt-4.7.1/bin/ にインストールされていたので、PATHに追加しておきます。

7.OpenCVを再度ビルド。CMakeでQtとQtOpenGLにチェックを入れて、Configureを押します。
8.Qt executableが無い!と怒られたら、/usr/loca/Trolltech/Qt-4.7.1/binを指定すると大人しくなりました。
9.Generateを押してEclipse用のプロジェクトを作ってもらいます。
10.Eclipseでビルド。30分ぐらいかかるのでお茶でも飲んで待ちます。


11.設定はここまで。前回の記事と同じように、OpenCV用プロジェクトの設定をします。
12.ビルドします。
13.ライブラリのフォルダと、ライブラリファイルをプロジェクトに登録しても、 error while loading shared libraries: libopencv_ml.so.2.2:  というメッセージが出ました。
14. LD_LIBRARY_PATHにライブラリのパスを追加すればよいらしいので、プロジェクトを右クリックしてRun As->Run Configurations -> Environmentに
LD_LIBRARY_PATH=/home/kouji/opencv/lib
と追加するとエラーが出なくなりました。

サンプルをビルドしたものを実行すると、以下のようなウィンドウが出てきました。










おお!
ボタンとかが出てきてる!

チェックボックスを作れたり、文字をオーバレイでかけるらしいです。
詳しくはリファレンスの方を参照ください。

これでOpenCVを使ったアプリケーションも見栄えがよくなるはず!

ではまた。



------------OpenCV 2.2 + Qt Setup--------------------------
1. Download Qt4.7 SDK from nokia.
2. Extract SDK
3. Run ./configure
4. Run make ( it takes about 2 hour)
5. Run sudo make install    to install Qt.
6. Add /usr/local/Trolltech/Qt-4.7.1/bin/  to $PATH.
7. Build OpenCV2.2 with Qt and QtOpenGL option.
8. If "Qt executable not found" message shown, set
/usr/loca/Trolltech/Qt-4.7.1/bin to executable path.
9. Click "Generate" to create project.
10. Build OpenCV with Eclipse.
11. Create OpenCV project and write your code.

2010/12/07

OpenCV 2.2 + Ubuntu10.4 + eclipseの環境構築方法

2日前にOpenCV2.2がリリースされました。
ソースにAndroidというフォルダがあり、ワクワクしながら資料を読むと、
「Ubuntuでやってね」
的な文言がありました。Windowsじゃだめか。。。

というわけでUbuntu10.4をインストールしてからの格闘ログです。
(一応動いたけど、正しい方法かは分かりません。。。)
Ubuntu10.4を最新の状態に更新。

OpenCV2.2.0.tar.bz2をダウンロードして~/opencv2.2 に解凍。
システム->システム管理->SynapticパッケージマネージャでCMakeおよび依存するパッケージを取得。
cmake-qt-guiも取得。

GCC4.3以降も必要なので取得しようと思ったら、最初から入っていたようなのでそのまま続行。

libgtk2.0-devおよび依存するパッケージを取得。


アプリケーション->プログラミング->CMAKE を起動。

ソースとビルド先に/home/ユーザ名/opencv2.2と指定。
左下のConfigureをクリック。

Eclipseで開発するので、「Eclipse CDT4」を選択。コンパイラはデフォルトのまま。
2回ぐらいConfigureをクリックして、Generateを押す。

なんかファイルがいろいろとできているので、Eclipseを開いてフォルダからプロジェクトをインポートし、ビルド。
20分ぐらい放置。

を参考に、

EclipseのProject ->properties ->C/C++ General->Paths and Symbolsの
IncludesにあるGNU C(C言語で開発するので)のInclude directoriesに、
/home/ユーザ名/opencv2.2/include
を追加。

Librariesタブに
opencv_core
opencv_imgproc
opencv_highgui
opencv_ml
opencv_video
opencv_features2d
opencv_calib3d
opencv_objdetect
opencv_contrib
opencv_legacy
を1個ずつ追加。

Library Pathsに
/home/ユーザ名/opencv2.2/lib
を追加。

プロジェクトをビルド。
"opencv2/video/***.hpp"がありません とエラーが出た。。
/home/ユーザ名/opencv2.2/include/opencv2 を確認。
確かに何もない。。。。

/home/ユーザ名/opencv2.2/modulesのフォルダに、それっぽいものを発見。
/home/ユーザ名/opencv2.2/modules/core のincludeフォルダのを、
/home/ユーザ名/opencv2.2/にコピー。 マージしますか?と聞かれるのでマージする。
/home/ユーザ名/opencv2.2/include/opencv2/core フォルダができる。
modulesフォルダの中にあるその他のフォルダも同じようにコピーする。


再度ビルド。












表示できた!

ライブラリとインクルードパスはプロジェクトごとに指定しないとダメみたいです。
いい方法はないかなぁ。。。

ではまた。


----------------------------------------------------------------------------
How to install OpenCV2.2 on Unbuntu10.4+Eclipse

Download OpenCV2.2.0.tar.bz2 
Extract to ~/opencv2.2

install cmake(and other packages)
install cmake-qt-gui
install gcc4.3 (or higher version)
install libgtk2.0-dev and others.

Run application->programing->cmake

source :  /home/your user name/opencv2.2
build to: /home/your user name/opencv2.2

Click "Configure" button.
Select "Eclipse CDT4" .
Click "Configure" button.

Click "Generate" button.

Close cmake.

Run Eclipse and import & build project.

For Next, please see below page.




2010/12/05

OpenCV 2.2がリリースされました

本日、OpenCV2.2がリリースされた模様です。

OpenCV Wiki

新機能のところで気になったのが下記の点です。
・highguiのバックエンドとしてQtが試験的に採用されたようです。
   これでもっとGUIが高機能になるのかな?

・GPUサポート  NVidiaのCUDAをサポートしたようです。

・Androidでも使えるようになったそうです。ただし、手順が複雑そうなので私が手をつけるのは結構先になりそうな気がします。



AndroidでOpenCVを使うためには、開発環境にUbuntuが必要とのことなので、
Ubuntu10.4 TLSをインストールしてみました。
昔よりも使いやすくなっています。SSDにインストールすると10秒ぐらいで起動するとの噂も。

無線LANのドライバインストールで時間がかかりましたが、なんとか稼働するようになっています。やっぱりLinux系はドライバで苦労するみたいですね。。。


EclipseとADTもインストール済み。
あとはOpenCV2.2を入れるぐらいです。

明日か明後日に公式Wikiを見ながらインストールしてみたいと思います。
インストールがうまくいったら、手順をまとめて記事にしようかな。

ではまた。

2010/12/04

Android端末を入手

先日、IS01を入手しました。
目的はAndroid端末に搭載されている各種センサー(GPS、加速度、磁気、もちろんカメラも)で遊ぶためです。

まずは書籍やWebサイトを参考にしてAndroidの開発環境を整えました。
Windows7にEclipse IDE for Java Developersという組み合わせです。


まずは買った書籍の紹介でも。

初めてのAndroid(オライリー)
Androidアプリの開発の基本が順序だてて書かれているのでわかりやすいです。
現在はこれを読みながら練習作品を作成中。この書籍は絶版となっているみたいですが、
そのうちAndroid2.1か2.2に対応したものがまた新しく出版されるのではないでしょうか。

ANDROID HACKS(オライリー)
GPSの使い方や、サービスの登録方法など、初めてのAndroidの後に読むとよさそうなTIPS集です。
最後のほうにデバッグについて書かれているので、今のところこの部分を重宝してます。


Android Developer's Cookbook
Kindleで初めて買った書籍。2000円ぐらいだったので買いました。
全部英語なのでちょっと抵抗はありましたが、結構サクサク読めました。
端末の比較も載っていて面白かったです。値段も電子版は安いので結構オススメです。
初めてのAndroidよりも内容が濃い感じがしました。  日本語版があればなぁ。。。。。


まずはセンサを使ったアプリを作ってみようと思います。


ではまた。

2010/12/01

ジオラマ風加工プログラム 遅いことが判明

一週間ぶりの更新。


前回作ったジオラマ風加工プログラムですが、実は1回の処理に80msぐらいかかっていることが
わかりました。

実行時間の計測は、以下のようなコードで行っているのですが、

double t = (double)cvGetTickCount();
//ここで何らかの処理をする
t= (double)cvGetTickCount() - t;
double freq=cvGetTickFrequency();
printf( "処理時間: %gms\n", t/(freq*1000.) );

測定する範囲を間違えており、10msと間違った結果になっていた模様です。


実際の実行時間は下記の通りでした。
・画像のサイズ:800x600ピクセルのカラー画像

ぼかし処理:15msから20ms
RGB空間からHSV空間への変換&H,S,Vへの分離 10ms~15ms
彩度(Saltation)の調整 1ms以下
HSV空間からRGB空間への変換  25ms~30ms

ぼかし処理はいいとして、色空間の変換に時間がかかっているようです。


ん~、 変換のアルゴリズムを調べて自分で書いたほうがいいのかなぁ。。


ではまた。

2010/11/22

OpenCVで普通の写真をジオラマ風に

今日はジオラマ風のエフェクトをかけるプログラムを書いていました。
特に難しいことはしておらず、
1.画像をY方向に分割
2.それぞれに平滑化フィルタをかける
3.RGBからHSVに変換し、彩度(S)を50%増しぐらいにする
4.HSVからRGBに戻して終わり
といった感じです。


とりあえず、現状でのフィルタの能力は下記の通りです。


元の写真

ジオラマエフェクトをかけた写真



































現状のジオラマエフェクトにかかる時間は10msぐらいなので、
Webカメラの画像をリアルタイムでジオラマ化するのは無理な話ではなさそうです。

現在は画像の中心が焦点になっていますが、焦点を上下させる機能もつけてみたいと思います。

ではまた。

2010/11/19

いつもの風景をジオラマ風にしてしまおう

安いデジタルカメラを探していて、カメラの機能で面白いものを見つけました。
CanonのIXY 30sに、「ジオラマ風」と「ワンポイントカラー」の撮影ができるモードがあるみたいです。

CANON IXY 30S 「ジオラマ風」が使える@Digital Life Innovator
FAKE MODEL PHOTOGRAPHY

「ジオラマ風」モードは、通常の風景画像がおもちゃっぽく見えるモードです。
中心部のみにピントを合わせて、画像の彩度を上げるとできるそうな。
Photoshopでの作り方が載っていたので、それを参考に作ってみたいです。

「ワンポイントカラー」モードのほうは、特定の色だけカラーで、ほかがグレイスケールになるモードです。(プレミアムモルツのCMみたいな感じです)

どちらも面白そうなテーマなので、OpenCVを使ってそのうちやってみたいと思います。
最初は静止画像で実装して、その次はカメラからのキャプチャ画像をリアルタイムで処理できるようになればいいな。

ではまた。

電子書籍自炊用マシン BookLiberatorの感想

さて、今回作ったBookLiberatorの使用後の感想と製作にあたっての反省を書いていきます。

1.アクリル板の厚さは2mmでは足りない。 5mmぐらいはほしい
今回はアクリル板を垂直に並べただけで、接着剤などでの固定はしていません。
そのため、中央付近を押すと、アクリル板が若干曲がってしまうことがあります。
アクリル板同士を接着剤で固定すれば解消するかもしれませんが、
とりあえず次の作品では5mmの厚さのものを使いたいと思います。

2.金属フレームはやめておこう
アルミの素材はやっぱり木よりも高いです。
加工も金属用のこぎりが必要なので大変でした。
まぁ、その分出来上がりは頑丈になるのですが。。。
次は木材を切り出してネジで固定する感じにしていきたいと思います。


3.素材の購入と選定は計画的に
私の場合はちょっと特殊な形状の金属板を使おうと思っていたのですが、
素材を買いに行った店にはありませんでした。
仕方なくその場で使えそうな素材に変更したのですが、あまりこの作戦は好ましくありません。
なので、どこにでも売っているような標準的な素材を使うことにしたいと思います。

4.誤差は出るもんだ
これも当たり前の話ではありますが、金属などをハンドドリルで穴あけしたりする場合は
ある程度の加工誤差を考えて設計するようにしたいです。(M3のネジを通すところは3.5mmのドリルで穴あけするなど)

5.C型クランプは日曜大工の強い味方
工具店に100円で売っていた小型のC型クランプが今回大活躍しました。
ハンドドリルで穴あけするときに、素材を固定するのに重宝しました。

6.カメラは2個同じものを用意しましょう
当然といえば当然の話なのですが、左右の画像で解像度が違うと
処理がちょっと面倒になります。
外部シャッターつきで安いのがあればいいのですが。。



※Webカメラからキャプチャした画像を切り出して
グレースケールで保存する簡単なプログラムを書いて別館のほうにおいてあります。
現在はまだ1つのカメラだけですが、もう1つC910を買ったときに
2つのカメラで撮影できるように変更したいと思います。

ではまた。

2010/11/18

BookLiberatorにWebカメラを搭載

先日作ったBookLiberatorにLogicool C910をつけてみました。

Webカメラなのでパソコンにつないで使うのですが、
OpenCVで撮影範囲を指定でき、ディスプレイを見ながら撮影できるので
デジカメよりは楽です。
ただ、デジカメよりも画像素子が小さいので、画質はデジカメよりも荒いものになってしまいます。
まぁ、Webカメラはこういった目的のために作られていないので仕方ところです。


C910は固定しにくい・・・

c910での撮影サンプル
















読めないほどではないので、C910をもう1個買って反対側にも取り付ければ
ボタン1個で左右同時に撮影することができるようになると思います。

C910の増設はちょっと考えます。。。1個1万円するしなぁ。。。。

ではまた。

2010/11/13

本を分解せずに電子化できる装置、BookLiberatorを作りました

今日はホームセンターに行って、BookLiberatorの材料を買ってきました。
最初は300mm x 500mm x 2mmのアクリル板を2枚にしようと思ったのですが、
1枚1700円もしたので、小さいやつに変更しました。
購入したのは180mm x 320mm x 2mmのもの。 1枚700円。これでも高いとは思いましたが、
とりあえず作るために必要なので買いました。

アクリルを囲うためのアルミフレームを買おうと金属材料コーナーに行ったところ、
狙っていた材料がありませんでした。仕方が無いので、テトリスのS字ブロックのような形のアルミ棒を買ってみました。ねじとかを買うと材料費で4000円。さらにハンドドリルなども買ったので結局7000円弱かかりました。



んで、そのあと数時間の作業で出来上がりました。

Pic1. BookLiberator











デジカメは1個しか持っていないのでつけれるところは1箇所のみ。
取っ手がなくてもよさそうだったので取っ手もなし。


というわけでA5版の書籍で撮影テスト。
撮影台はまだ作っていないので床置き。

Pic2 撮影テスト




撮影した画像をScanTailorで処理して、
Kindleで表示すると以下のような感じに。

Pic 3 Kindleで表示












文字もちゃんと読めるので問題なし。
ちょっとゆがんでますが、これはデジカメのレンズの歪みの影響だと思います。
これならA5サイズの本までなら電子化できそうです。

あとは撮影台を作るぐらいかな。

ではまた。




---I made BookLiberator-----------------------------------------------------------------------------
Today, I went to home center to buy materials.
I bought 2 acrylic plate, 3 alminium plate, some nut and bolt.

In my home, I assembled BookLiberator.(pic1)
It takes 4 hours to assemble.

Result is pretty good.(Pic3)

BookLiberator is very good tool for 'Book Scanning'.




2010/11/12

BookLiberator スケッチ作成

ホームセンターに下見してきて、フレームとして使えそうな素材があったので、
そのデータを元にBookLiberatorのスケッチを作りました。
(Googleスケッチアップって便利ですね)


デジカメは1個しかないので、ひとまず片方につけるような感じで書いてみました。

本家のものは木製フレームですが、なるべく加工をしないで済みそうな材料を探したところ、ホームセンターの金属材料コーナーに下図のような形のアルミ棒がありました。

アルミ棒。本来は何に使うのやら











このアルミ棒を切ってL字金具で固定するだけでBookLiberatorが作れそうです。このアルミ棒が1本1m300円ぐらいで売ってたので、3本あれば間に合うでしょう。
アクリルも300x300x2が2枚あればよいので、2000円ぐらいで買えるでしょう。
デジカメを支えるスタッドも100円ぐらい・・・かな?
というわけで材料費は3000円ぐらい。
ネジとナットのみで固定する予定なので、分解して持ち運びも可能かもしれません。


明日ホームセンターに行って、実際に材料を買って来たいと思います。

ではまた。





2010/11/09

自炊キット(BookLiberator)の試作品

昨日みつけた自炊キット、BookLiberatorの実力はどんなもんかと、
簡易モデルを作ってみました。

アクリル板をいきなり買うのは危ないなと思ったので、
100円ショップに売っているカードケース(硬質)とCDのケースで作ってみました。





Pic.1 試作品



















かなり適当に作っていますが、まぁ何とかなるでしょう。




Pic.2 文庫本サイズ

















実験は本物の文庫本でやったのですが、Webに掲載するとアレなので
このブログを印刷して、文庫本の間に挟んだもので試してみます。



Pic.3 撮影結果

















これをScan Tailorにかけると、以下のような結果に。



なかなかいい感じ。

というわけで、近々BookLiberatorを作ってみたいと思います。

まずはアクリルを発注せねば。


ではまた。


---------------------------------------------------------------------------------
I made small and cheap (200 yen) "BookLiberator" with CD case,and Card Case. (Pic.1)
Sample photo took with cheap "BookLiberator".(Pic.3)
Processed photo by "Scan Tailor". It is good for eBook Reader. (Pic.4)
Prototype was good, so I will try to make "BookLiberator".
----------------------------------------------------------------------------------



2010/11/08

自炊用器具と高性能な自炊画像処理ソフト

今日もまた自炊について調べてました。

GoogleでBook Scanningと検索すると、一眼レフカメラを2台使った
手作りスキャン装置が数多くヒットします。(DIY Book Scanning  http://www.diybookscanner.org/ )

このような大型の装置となると、狭い我が家には設置できないのでほかに無いかな~と探していると、以下のようなスキャン装置がありました。


コンパクトなスキャン装置













http://bookliberator.org/doku.php


おお~ これはなかなかいい感じ。
組み立てキットを120ドルぐらいで販売する予定があるとか無いとか。
オープンソースのハードウェアなので、自分で作ってもよいそうです。
 (設計図とかもありました)


あと、撮影した後の画像処理にぴったりのソフトも見つけました。
Scan Tailorという画像補正ソフト(オープンソース)です。
http://scantailor.sourceforge.net/



このソフトを使うと、下記のような光の当たり方にムラのある画像でも、



元画像


ここまでできます。
処理後


すばらしい!
ありがとう作者のJosephさん。


このソフトを使えば、現状の照明でも何とかなりそうな気がします。
上のスキャン装置も作ってみたいな~。。



2010/11/03

書籍紹介

以前紹介した、Computer Vision: Algorithms and Applicationsという本の書籍版が
先月の末に発売されたようです。

 Amazonで書籍版を買うと7000円ぐらいです。
PDFでもよい場合は、http://szeliski.org/Book/ からダウンロードすることができます。
個人使用目的であれば無料でダウンロード可能で、再配布はダメ とのことです。

書籍版とPDF版だと、中身は同じですが、ページのレイアウトが若干変わっているようです。
(書籍版だと812ページ,PDFだと979ページ)

書籍の内容は、

・イメージプロセッシング
・物体検出とマッチング
・分割
・特徴に基づくアライメント
・SFM(動画からの再構築?)
・動きの推定
・イメージステッチング
・3Dの再構築
・画像の理解(顔検出、特定の物体検出)
といった感じになっています。

ではまた。

自炊プロジェクト その後

自炊プロジェクトの続き。

前回は5本の赤色LEDで何とかなりそう!というところまでいったので、
実際に赤色LED(今回は10本)を基板につけて、撮影テストをしてみました。

今回作った光源の明るさは、白色LED18本のときよりも明るいです(直視すると目が痛くなってきます)

また、光源を市販のポータブル書画カメラのように照明をカメラのレンズと同一平面上に
置いてみました。
pic 1 ガムテープと割り箸で固定

その結果、下記のような画像が得られました。
それなりの質にはなっていると思いますが、やはり光のムラはできてしまうようです。


pic 2 撮影テスト












マシンビジョンの本には、「半円形の枠の内側に均等に光源を配置すると
均一な光が得られる」というようなことが書いてありましたが、
自宅でちょっと遊ぶ程度だと、残念ながらそこまではできません。。

pic 3 光源の理想図












光源をもう2個ぐらい作ってもう一度やってみたいと思います。





-------------------------------------------------------------------
I tested book scanning with 10 Red LED.
It was little good, but brightness is uneven yet.
I would like to try again with more LEDs.

2010/10/26

自炊時の画像処理(書籍の見開き対策)

自炊プロジェクトで行う画像処理でアイデアを思いついたので書いておきます。

フラットベッドスキャナで書籍をスキャンするときは、スキャナのガラス面に押し付けるのでページ全体にピントが合っている画像が得られます。

Webカメラを使って自炊するときはこの方法が使えず、
ページが山なりの状態で撮影することになるのでどうしてもピントが合うところと合わないところが出てきてしまいます。
(ページの上にアクリルの板を置く方法もあるようですが、面倒なので却下しました)

この問題を解決する手段として、全焦点画像が使えるんじゃないかな~と考えています。
全焦点画像は、同じ物体を同じ距離から焦点を変えて複数枚撮影し、
複数の画像の中の各ピクセルにおいて一番ピントが合っている(ハッキリ写っている)画像のデータを使用することで
すべての点においてピントが合っている画像のことです。
(なんかの本で見たんですが、どの本かは忘れてしまいました。。ちょっと探してみます。)

ではまた。

2010/10/18

自炊プロジェクト 続報 (Book scanner with WebCam)

ちょっと前回から時間がたちましたが、自炊プロジェクトをちょっと進めたので
記録を残しておきます。

(Summary is at the end of post.) 

前回作った白色LEDのライトを照明として自炊のテストをしてみましたが、
残念な結果になりました。
照射する距離とかを変えてみたのですが、結果は下記の写真のような感じに。。
Pic.1 放射状のムラが取れない。。。


このプロジェクトを中止しようかと若干思いましたが、
ダメもとで赤色LEDで実験してみました。





なんということでしょう


あんなに白色LEDで難しかったムラの無い照明が
適当に組んだ赤色LEDの回路でできそうではありませんか


Webカメラのコントラストとかをちょいといじると下記のような画像ができました
Pic.2  赤色LED5本で実現

ためしにKindleでも表示してみました
Pic.3    Kindleでもばっちり












何で赤色LEDだとできるんだろう・・・?

適当に予想してみると、、、
・白色LEDは、赤、青、緑の波長を均等に含んでいるから白く見えるが、それぞれの光の強度はそんなに強くない→コントラストが強くない画像が出来上がる

・赤色LEDは、赤の波長がほとんどで、WebカメラのCCD素子の赤担当部分に強く入力される→コントラストが強い画像ができる

ということがいえるのかな。。。。

とりあえず、基板に赤色LEDをたっぷり実装して自炊用照明を
作ってみたいと思います。

ではまた。



--- Summary ---------------------------------------------------------


I tried to scan book using White LED light(18 LED).
But, result was not good.(Pic.1)
Contrast of picture was low, so it was not suitably for e-book.

Next, I tried to use Red LED light(5 LED).
This result is pretty good  :)
I got high contrast image. (Pic.2)
Also displaying to kindle was good quality.(Pic.3)

I will try scanning book  with 30  Red LEDs.
I am expecting the image of the high contrast to be obtained.

-------------------------------------------------------------------------




2010/10/05

書画カメラ 2万円以下の市販品もあるみたい

先週、髪の毛を切ってきたのですが、そのときに美容室にあった雑誌に
Simply Scan というものが載っていました。
折りたたみ可能な書画カメラで、1万5千円ぐらいのものでした。

サンプル画像を見てみましたが、やはり光の当たり具合にムラがある模様。

ん~
やっぱ自作したほうがよさそう。。。




とりあえず半田付けまでは終えたので、
これを照明にして自炊をしてみたいと思います。

ではまた。

2010/09/28

書籍の自炊作戦開始

自分の持っている書籍を電子化してKindleに移したくなったので、
自炊作戦を実行することにしました


たいてい自炊をする場合、本を裁断してからスキャナで取り込むのですが、
裁断したくないけど電子化したい書籍もあったり(我が家の本棚のオライリーシリーズもそのひとつ)


今回は、裁断したくない本を”比較的”楽に電子化することを目指します。
東大とDNPが開発したパラパラめくるだけで電子化できる装置のようなものを作れればいいのですが、まぁ無理なので現実的な方向で行きたいと思います。

裁断したくない本を電子化する手段としては、フラットベッドスキャナを使う方法が一般的です。
ただ、フラットベッドの場合だと1ページごとに
「セット」→「スキャナの蓋を閉じる」→「スキャン開始ボタンを押す」→「蓋を開ける」→「ページをめくる」→「セット」・・・・
という作業が必要となります。

さすがに数百ページある本をやるのは心が折れるのと、スキャナは持っていないので、
Webカメラ固定して、「セット」→「キーボードの撮影キーを押す」の2工程でできるようにしたいと思います。

また、画像の品質については「ストレス無く読めればいいや」的な感じなので、多少ゆがんでも気にしないことに。


準備するもの
・300万画素以上のWebカメラ(今回はC910を使います)
・LEDラインライト
・コンピュータ
・カメラを固定するもの

今現在考えている手順
1.Webカメラを固定し、1箇所を常に写している状態にします。
2.Webカメラの真下に書籍を開いて置き、見開きの左側もしくは右側全体がカメラに写るようにします。
3.LEDを書籍の斜め上から照射し、光が均一に当たるようにします。
4.OpenCVでWebカメラの画像を取り込み、カラー → グレースケール → 16階調と減色します。
5.スペースキーなどを押すと画像に番号をつけて保存できるようにします。
6.あとは「ページをめくる」→「撮影する」を繰り返します。
7.画像をPDFに変換し、Kindleへ移します。


今回はソフトの中身よりも、光源関係が難しそうな感じです。


ではまた。

2010/09/19

Webカメラで書画カメラ計画 その3

LED 実験レポート その2

今日は1WのハイパワーLED「OSW4XME1C1S-100」の点灯実験を行いました。
LED本体に20 x 20 x 3mm程度の放熱板がついていて、値段は300円でした。(@秋月電子通商にて)
このLEDは5mmの砲弾型LEDよりも放熱に気を配らないとダメということなので、
25mm x 25mmのヒートシンクと、同じぐらいの大きさの小型ファンをくっつけてみました。
あと、光拡散用のレンズもくっつけてあります。














接着の方法は、ホットボンドを使用しています。

構成は以下のような感じです。
[ファン][ヒートシンク][1W LED][拡散レンズ]
そのほかに、電流制限用として5Ω5Wのものを2個つけています。

今回はLEDに170mAを流して実験。
結果の画像は無いのですが、前回造ったものと比べると、
 明るさ→ハイパワーLEDのほうが明るい(直視すると「目がぁぁ~」となります)
 拡散具合→レンズである程度広がるものの、5mm+拡散キャップ x 20本のほうが均等に広がる
 温度→10分程度の点灯では、ヒートシンクの温度はほとんど変化なし(放熱がうまくいっている・・?)
ということがわかりました。

ハイパワーLEDは、レンズによって拡散しているものの、やはり前回のものに比べると光が集中している感じがしました。(前回のはLEDを横一列に並べているので、比較しても仕方ない気はしますが)
ただ、明るさは問題ないので、ハイパワーLEDを複数並べれば実用的なものができるかも知れません。

今はレンズが2つ(1つは接着済み)しかないので実験できませんが、今度追加で買おうと思います。

ではまた。

2010/09/15

Webカメラで書画カメラ計画 その2

書画カメラ計画の続き。


実際に秋月電子からLEDを購入して実験してみました。
書類全体に均等に光を当てたいので、指向性の高くないLEDを選びました。
LEDルームランプは計画が失敗したときに流用しづらいので、5mmの砲弾型LEDに変更しました。

今回はOSPW5161P 12~18cd 60° 10個入り(700円)というのを2個と、LEDにかぶせる光拡散キャップ(50個入り200円)を買いました。
その他電源アダプタやブレッドボード、テスタを購入したら、結構な額になりました。
まぁ、実験にお金がかかるのはいつものことです。

届いたパーツを整理して、とりあえず点灯実験を。
1個あたり100mAまで流せるようですが、30mA程度に抑えています。
10個でテスト
光拡散キャップがうまい具合に光を拡散しているようです。

まとめて20個並べてみました。

LED照明を使いつつ、LEDについてきた書類を撮影してみました。
書類に対して45度ぐらいの角度で光を当てています。


上の画像は、Webカメラのコントロールソフトで、色の強さやコントラストをいじって、白黒イメージになるように設定して撮影しています。
書類が折りたたまれていたので凸凹による影は多少見受けられますが、
卓上スタンドを使ったときのような明るさのバラつきは減少しているようです。

これなら簡易書画カメラとして十分やっていけそうです。
OpenCVでROIを設定しつつ書類を取り込めば、Kindle用の自炊ツールとして活躍してくれるはず。

ほかにも1Wと3WのハイパワーLEDを買っているので、そのうち実験したいと思います。

ではまた。

2010/09/12

Webカメラで書画カメラっぽいものを作る(計画段階)

C910でいろいろ遊んでいて、書画カメラの代わりになるんではないか?と思って
実験してみました。

市販の書画カメラを調べてみると、価格は10万円~30万円とやけに高価で、カメラの性能は130万画素~200万画素と普通なスペックです。

C910も一応500万画素になっているのでカメラのスペックとしては問題なし。

というわけで、書画カメラでよく写すであろう、A4サイズの書類を写してみました。
(書類との距離は30cmぐらいです)


文字は難なく読めることがわかりました。

もう一個撮影サンプル。
今度は5000円札を至近距離(3cmぐらい)から撮影してみました。



「国立印刷局製造」と書かれている部分ですが、1文字の横幅が2mm以下です。
また、漢字もくっきりと見えるので、0.1mm程度のものまで識別できるようです。

カメラの性能は問題ないことがわかったので、あとは光源です。
通常書画カメラには、書類の真上からの光が当てられますが、Webカメラにはもちろん
光源がついていないので、何かしら準備する必要があります。

スタンドの光をあててみたのですが、光のムラが大きいので使い物にはなりませんでした。

指向性が低くて明るい照明が必要となってきますが、
ちょうど秋月電子で白色LEDルームランプというのが売っていたので、これを買ってカメラの上下左右に配置すれば
書画カメラっぽい照明ができるんじゃないかな~と考えています。


ではまた。







ジグソーパズルプログラム 路線変更

今日、ご飯を食べつつふと思ったのですが、
現在やっているジグソーパズルプログラムは、コンピュータの中でパズルが完成しても、現実のパズルはバラバラのままである、という根本的かつ致命的な問題を抱えています。

だめじゃん。

というわけで、計画の練り直しをすることに。

名称:ジグソーパズルサポートプログラム

最終目標:
 どこに置いたらよいかわからないパズルのピースをWebカメラで撮影すると、どこに置けばよいのかをコンピュータが教えてくれる

必要なこと:
・カメラで撮影したピースのサイズと、完成画像内のピースのサイズを一致させること
・完成画像内の特徴と、ピースの特徴をマッチングさせること

必要な機材:
・接写ができるWebカメラ
・スキャナー(完成画像を取り込むため)
・キャリブレーション用パターン

手順
・キャリブレーションパターンを作る。
 →レンズのゆがみ補正用ではなく、Webカメラで撮影した画像と、スキャナから取り込んだ画像とのサイズあわせに使用するため。
 →とりあえず20mm四方の塗りつぶした正方形をキャリブレーションパターンとして作ることにした。

・完成画像(パズルのふたに書いてある絵)とキャリブレーションパターンをスキャナで取り込む
・パズルのピースをWebカメラで撮影して、テンプレートマッチングをかける。
 →ピースが斜めになっているといろいろと処理が面倒なので、Webカメラに撮影するときにはガイドか何かを使って傾かないようにする。


とりあえず今度はこれで作ってみることにしました。

以前もっていたWebカメラだと接写が無理だったけれど、C910を使えば接写問題も解決するはずです。

ではまた。

2010/09/09

ジグソーパズルプログラム ピースの形の認識

まだジグソーパズルのやつをやってます。
今日はタブの切り取りだけ実装しました。
前回まででモルフォロジー処理によって、ピースの4角の座標が求められたので、
それを元にタブ部分を切り取ってみました。



この後はcvMatchContoursとかで比較すればいいのかな~。。。
今週、来週中にはそこそこできそうな感じです。
ではまた。

2010/08/31

新しいWebカメラを買いました(Logicool C910)

私が持っているWebカメラは120万画素と30万画素のものなのですが、もうちょっと解像度よいカメラが欲しくなったので、電器店に行ってみました。

電器店のWebカメラコーナーで物色したところ、Logicool HD Pro Webcam C910を発見しました。
値段が1万円ぐらいするのでちょっとためらいましたが、
・CMOSの画素数が500万画素もある(私の持っているデジカメに匹敵する解像度)
・カールツァイス社が開発した光学レンズつきる
・フォーカスの動作距離が7cm~となっているので、接写に強そう
遊び研究に金がかかるのはいつものこと
という理由から、即決で買ってしまいました。

んで、OpenCVで実際にキャプチャしてみたのが下の画像です。
撮影した条件は下記の通りです。
・カメラと対象物との距離は約50mm(フォーカスをマクロ側いっぱいに設定すると、対象物まで30mmあればボケずに写せました)
・解像度:800x600
・30fps


上記の画像の通り、かなり細かいところまで撮影でき、かつ接写にも強いということがわかります。(今持っているデジカメだと、同じ距離から撮影してもボケてしまい、ここまでの接写はできませんでした)

このカメラには、カメラのコントロールソフトがついていて、カメラを使うアプリケーションを起動したときに、自動的にコントロールソフトも起動します。
コントロールソフトでフォーカスや明るさ調整が調整できるので、なかなか便利です。

デジタル一眼レフカメラとかだとPCからの撮影やフォーカス調整ができるものが多いので
便利だな~とは思ってたのですが、Webカメラでも同じようなことができるようになったので、とても嬉しいです。

その他、付属ソフトに動体検知モードというのがあり、定点観測中、設定した閾値よりも大
きく画像が変化した場合に動画ファイルに保存する、という機能がありました。
録画した動画の右下には録画した時刻も記録できるので、防犯カメラとしても使えそうな感じです。

ではまた。

2010/08/28

ジグソーパズルプログラム ピース情報の取得方法

パズルプログラムの実験を継続中です。


ジグソーパズルを解くためには、1ピースごとの形状を把握しなければなりません。
輪郭抽出でピースの外周の情報は得られるのですが、マッチングに使用する際は外周の輪郭情報を上下左右の4区画に分かれていなければ使い物になりません。
4区画に分けるには、ピースの4つの角を検出しなければならないので、角を検出するところからやっていきます。

外周の輪郭情報から直角を抽出すればいいのではと考え、輪郭の数点に直線を割り当てたり、ハフ変換で画像内の直線を検出したりしましたが、ノイズが多かったり検出されるべき角が検出されなかったりと、結果はあまりよいものではありませんでした。

んで、OpenCV本をめくって何かいい方法が無いかを探したところ、モルフォロジー演算というのが使えそうでした。

モルフォロジー演算のクロージング処理は下方向(暗い点)のアウトライヤーを除去し、オープニング処理は上方向(明るい点)のアウトライヤーを除去してくれるようです。

実際にピースの画像にモルフォロジー演算をやってみたのが下記の図となります。











今回はクロージング処理でピースのへこみ部分を除去し、その後オープニング処理でピースの出っ張り部分を除去することに成功しました。いろんなピースでやってみましたが、ほとんどのピースで4つの角を検出することができました。

モルフォロジー演算を行うときに、カーネルの大きさを自分で指定することができるのですが、このカーネルの大きさを取り除きたい部分の大きさよりも少し大きめにすると、うまく除去してくれるようです。(ただし、ピースが斜めに配置されていると、カーネルが短形なためモルフォロジー演算を行ってもピースの角を抽出することはできなくなります。)

ピースの4つの角を抽出できたので、あとは上下左右の形状を調べるだけです。

ひとまず「出っ張りがある」「へこみがある」「何も無い(直線)」の3つに区分したいので、
x方向に伸びる辺は上下5~10ピクセル、y方向に伸びる辺は左右5~10ピクセルの輝度を順次調べていけばよさそうです。

ではまた。

2010/08/27

ジグソーパズルプログラム 苦戦中

むずい、、むずいよ ジグソーパズル解答プログラム (ノД`)


Googleで答えを探しても文献が見当たらず、ようやく見つけたのが
A Global Approach to Automatic Solution of Jigsaw Puzzles という論文。
この論文では、輪郭同士を直接マッチングさせるのではなく、出っ張っている部分やへこんでいる部分の位置や大きさを比較して、その後で輪郭情報を使用してマッチングさせているようです。

論文の中では「巡回セールスマン問題を解くことで、自動的にパズルを解かすことに成功した」的なことが書かれていたのですが、巡回セールスマン問題は難しそうなのでパス。
フルオートで解答させるのはあきらめて、まずはセミオートで解答するものを作ることにしました。

処理手順(新)

・輪郭を抽出します。(ピースの数だけ輪郭が出力されます)
・輪郭1個ずつに対し、下記の処理を行います。
・輪郭に外接する四角形をcvMinAreaRect2を使って求めます。
・外接する四角形のサイズ、中心点、角度がわかったので、1ピースごとに回転が0度になるようにcvGetQuadrangleSubPixを使って回転させます。
・この時点で1ピースの向きは、45度傾いているか、整列されているかのどちらかになります。(ピースの4方向に出っ張りがある場合、出っ張りに外接する四角形が計算されてしまうため、45度傾いてしまいます)
・ピースの出っ張り・へこみではなく、ピースの四隅を探します。見つからない場合は、45度画像を回転させてもう一度探します。
LaplacianフィルタCannyフィルタをかければ四隅を検出できそうです)
 ・四隅がわかれば、ピースの輪郭を上下左右の4つに分けて、輪郭の区分と出っ張り・へこみの位置、大きさを計算します。これが輪郭の識別子となります。


 ・輪郭が直線の場合はコーナーピースもしくはラインピースになるので、コーナーピースの場合は下と右が直線部分になるように回転させます。
 ・ラインピースは下が直線部分になるように回転させます。


ここまでで、各ピースは整列され、上下左右の輪郭がどんな種類なのかが決まります。




あとはこの情報を元にマッチングさせていきます。


マッチング
1.四隅のピースのうち、どれか1つを適当に選び、完成図の左上(XY座標にすると0,0)に配置します。
2.  配置したピースの右(1,0)にはラインピースが必ず来るので、右に来るラインピースを探します。
3.さらにもうひとつ右(2,0)のラインピース、その隣のラインピース(3,0)と探していきます。
4.いつかは四隅の残り3ピースのうちのどれかに隣り合うので、四隅のピースになったらピースの探す方向を変えます。(右に探していた場合は下、下に探していた場合は左、左に探していたら上)
5.ラインピースと四隅のピースで配置されていないものがなくなれば、一番外側のピースが完成したことになります。
6.その先も同じように、左上から螺旋を描くように埋めていけばできあがる・・・かも。


本家と違うところは、ピースを探すときに人間の手を借りる、というところです。
たとえば、ピースの左側がへこんでいるピースはたくさんあるので、その中の候補を順番に表示させていき、人間に「当てはまる」「当てはまらない」と判断してもらいます。
この辺がセミオートな理由。セミオートが完成したらフルオートにも挑戦します。




完成までは結構時間がかかりそうな感じではありますが、
とりあえず今週末でピースの切り分けと分類までやってみようと思います。


ではまた。

2010/08/17

久々の更新

  先週、StarCraftIIというパソコンのゲームを買ってしまい、
研究そっちのけでゲームをやってました。

ちょっと落ち着いたので今週はマシンビジョンの研究に戻ります。

さて、前回やっていたジグソーパズルを解くプログラムですが、
重大な欠陥を発見してしまいました。

普通のパズルだと当たる確立ほぼゼロという、非常に悲しいものです。
チラシを切って作ったものだと大体あたるのですが、
実際に買ってきたジグソーパズルだとひどい結果となりました。

買ってきたのは、
「108ピース となりのトトロ 五月晴れの日に」
という初心者向けのパズルです。

完成品は20cm x 26cm程度の大きさ(A4と同じぐらいです)になりますが、
パッケージに載っている完成図の大きさが7cm x10cmと小さめでした。
とりあえず持っているデジカメのズームを使って高解像度(6Mピクセル)で撮影したものを
使い実験したところ、結果はボロボロ。

気を取り直して一度パズルを完成させ、それを撮影したものでやってみましたがこちらもボロボロ。

前回はここで力尽きました。

ジグソーパズルの解き方のコツを検索したところ、
1.外周のピースを抽出し、外周を作成する。
2.特徴量の多いピースを抽出し、部分的に作成する
3.外周、もしくは特徴量の多いピースの塊から領土?を拡大させていく
4.わかんないピースはとりあえず放置。 あとでひたすらあわせてみる
というものでした。

外周のピースを抽出するためには、各ピースの輪郭情報が必要となるので、
今度は輪郭マッチング方式でやってみることにしました。

プログラムの概要
1.スキャナーのガラス台の上にピースを適当な間隔をあけて並べます。(ひとまずグレースケールでスキャン)
2.スキャンした画像から、各ピースの輪郭を抜き出します。
3.各ピースの輪郭を順次比較して、似たような輪郭を持つグループに分けます。
4.ピースのグループのうち、1辺もしくは2辺が直線になっているもの(=外周ピース)を抽出します。
5.外周ピースを輪郭マッチングにかけます。
6.その後、外周ピースの1つ内側から輪郭マッチングをかけて、パズルを埋めていきます。

ここで重要なのが輪郭マッチングで、どうやってやったらよいものかを悩んでるところです。

パズルのピースは四角形の各辺がへこんだり出っ張ったりしているので、パズルの各辺を
へこんでる → -1
直線のまま →  0
出っ張ってる→ +1
で表すと、パズルを組み合わせたときの各辺の総和がゼロになっていれば
完成とみなせるはずです。

問題はこの組み合わせ方をどうするかですね~

ちょっとググって探してみようかな。。

2010/08/04

OpenCVでジグソーパズルを解いてみる

コンピュータビジョンの資料として使っている、"Computer_Vision_Algorithms_and_Applications"の
課題に、「イメージの特徴点を利用してジグソーパズルを解いてみよう」というものがありました。

面白そうだったので、実際に作ってみました。

準備
0.ジグソーパズルを用意します。
  (手元にパズルがなかったので、とりあえずドミノピザのチラシを素材にしました)
1.パズルの完成図をデジカメで撮影するか、スキャナで取り込みます。
  (とりあえず今回はA4サイズのチラシを6Mピクセルの大きさで撮影しました)
2.完成図をグレースケールで読み込み、SURF特徴量を求めます。
3.Webカメラから1ピースの画像を読み込み、SURF特徴量を求め、完成図の特徴量と比較します。
4.特徴点が一致した点をプロットします。
5.プロットされた点が多いところが、1ピースの場所となります。



今度は売っている100ピースぐらいのジグソーパズルでやってみたいと思います。
ソースコードはまた今度。


ではまた。

2010/07/30

PCを新調しました

最近、iMacの調子が悪いので、PCを新しく買いました。
OpenCVで遊ぶことも考えて、Windows7の32ビット版を選びました。

新しいPCで開発環境を整えようと、VC++2008 Expressをインストールし、
OpenCV2.1のインストーラを使ってインストールしたところ、
以前出ていたインテリセンスが表示されなくなっていました。

インストーラでやるとインテリセンスのデータベースにOpenCVの関数が反映されないっぽいです。

というわけで、ちょっと時間がかかりますが、自分でビルドすることにしました。
ビルドする方法は下記のサイトで詳しく説明されてましたので、参考にさせてもらいました。
OpenCV2.1の入手・ダウンロード・インストール@画像処理ソリューション

今回は、1つの処理を複数のコアに分担させるIntelのスレッディング・ビルディング・ブロック(TBB)も一緒にインストールしてみました。

TBBの本がオライリーから出てたはずなので、そのうち買って勉強しようと思います。

ではまた。

2010/07/28

OpenCVとOpenGLの組み合わせ

Youtubeやニコニコ動画のAR系の動画には、OpenGLで戦車なり目玉なりを
描画しているものが多いので、私もOpenGLをちょっと触ってみることにしました。

OpenGL入門のサイトを色々と巡ってみましたが、OpenGLが複雑でよくわからず。


試行錯誤で何とかマーカーの傾きや位置を描画する物体に
反映させることができるようになりました。



さらにOpenGLを勉強して、マーカーのど真ん中に急須を表示出来るようにしたいです。

ではまた。

2010/07/24

RANSACを実装してみました

この前、Excelで実験を行ったRANSACのコードを実際に書いてみました。

今回は正解の点400点、はずれの点400点のデータ群から
直線を検出することを目標にしました。(Y=AX+BのAとBを推定)

その結果が下記の図になります。
灰色の小さな点がはずれの点で、黄色の点がRANSACアルゴリズムによって"もっともらしい"と判断された点です。
緑色の直線がRANSACの「推定」ステージで求めた直線で、青の直線が「検証」ステージで求めた直線となります。





















ソースコードは別館の方においてあります。

ではまた。

2010/07/22

RANSACを調べてみました

パラメータのロバスト推定によく使用されているというRANSAC。
コンピュータビジョンの本にもところどころ出てきていますが、
どんなものなのかははっきりわかっていませんでした。

というわけで、色々と調査してみました。

Czech Technica大学の教材のPDFおべんきょうWikiを見て調べたところ、

RANSACのアルゴリズムは、下記のようになっていました。

1.総データ個数がU個あるデータから、ランダムでn個のデータを取り出します。
2.取り出したn個のデータから、パラメータを求めます。
 (取り出すデータの個数ですが、これは求めるべきパラメータの数に比例するようです)
3.求めたパラメータを、総データ点数から取り出したn個のデータを除いたものに式を当てはめ、
観測されたデータと2.で求めたパラメータの誤差を計算します。
4.誤差が許容範囲内であれば、パラメータに対して投票を行います。
5.1~4を繰り返し、投票数が一番多かったパラメータをひとまず採用します。
(これを仮パラメータとします)

6.仮パラメータを使ってすべてのデータに再度式を適用し、誤差が許容範囲内のものを抽出します。(この時点で雑音データがほぼ取り除かれます)

7.抽出したデータを元に、再度パラメータを求めます。
8.求まったパラメータがこのデータのもっともらしいパラメータとなります。



というわけで、Excelを使って実験をしてみました。
実験の条件は下記の通りです。

実験データ個数:600個
うち300個は正解データ、残りの300個は雑音データとしました。
正解データの数式は  Y=(1-rand()/10) *X で生成しており、
正解データはYの0.9倍から1倍の範囲にあり、平均すると0.95倍になる、、はずです。
雑音データの数式はY=rand()*X としました。Xが0から300まであるので、最小値0、最大値300の雑音データがランダムで発生しています。

パラメータ推定の対象となるデータをグラフにしたものが以下のものとなります。



上記のデータに、RANSACで式を当てはめてみます。
今回は原点を通る直線の式になるので、式は
 Y=AX
と簡単なものになります。
未知のパラメータが1個なので、ランダムで取り出すサンプルの個数は2個としました。


取り出した点PとQのX,Yの値を(Px,Py)、(Qx,Qy)とします。
A=傾き=Yの増加量/Xの増加量=(Qy-Py)/(Qx-Px) で、仮のAが求まります。
そして、仮のAをサンプル以外のデータに適用し、誤差を調べます。

今回は誤差が10%以下のものに限り投票してよいことにしました。



上記のことを600回(回数は適当に決めました)行い、得票数が一番多かったパラメータ(今回はA=0.91が得票数が一番多くなりました)を使って、誤差が範囲内にあるデータの集合を求めます。
誤差が範囲内にあるデータの集合は、雑音がほぼ取り除かれたデータとなるので、
このデータの集合を元に、再度パラメータを推定します。
今回は各データのY/Xを計算して、平均をとったところ、A=0.95となりました。
下の図のピンクがRANSACで求めたパラメータの直線です。


















おぉ~

見事に雑音が無視されていますね。

あとはこれをCで書けば、今後のパラメータ推定に役立ちそうです。

ではまた。

2010/07/21

パノラマ写真を作ろう その2

前回の内容から逆行するような形になりますが、
まずは一番簡単なところからはじめていきたいと思います。

画像の条件:
・スケーリングや回転はなし
・透視変換も一切なし
・画像間の変化はx軸とy軸に平行な移動のみ
というものです。


今回はx方向とy方向の差分を求めればよいのですが、
そのためには画像Aにある特徴が画像Bのどこにあるかを最初に見つける必要があります。

この辺はOpenCVのサンプルプログラムの中で検出してくれているので特に考える必要はありません。

今回は最小二乗法を使って、x方向とy方向の移動量を求めました。

その結果が下記の通りとなります。
1枚目は8枚の画像を合わせていく過程で、2枚目が画像を貼り合わせた
パノラマ画像となります。












まぁ、そこそこいい感じに出来たみたいです。

今回のソースコードは別館のほうに置いておきました。

今後の目標は下記の通りです。
・RANSACを使って、移動量をもう少し正確に求める(最小二乗法は、エラーの点も計算に含むので、エラーの点の影響を受けやすいようです)
・入力される画像の順番がバラバラでもパノラマ画像を作れるようにする
・画像の回転に対応する
・画像の拡大・縮小に対応する
・プログラムをもっと効率的にする


あと、パノラマ画像作成のプロジェクトのページを見つけたので、リンクを貼っておきます。
Automating Joiners ・・・パノラマ画像作成の論文や、スライドがあります。
Computational Photography・・・カーネギーメロン大学のComputer Photographyという講義のページ。パノラマ画像作成以外にも、モーフィングやモノクロ画像の自動着色プロジェクトがあります。この講義は結構楽しそうな感じです。

ではまた。

2010/07/19

OpenCVで自動的にパノラマ写真を作る(OpenCV Panography)

以前、コンピュータビジョンの勉強用資料として紹介した、"Computer Vision Algorithms and Applications" に、
パノラマ写真の作り方が載っていたので実際にやってみました。
(パノラマ写真を作ることを英語でpanographyとかImage stitingと言うようです。)

※今回はOpenCVのサンプルにあるfind_obj.cppをベースに作っています。


デジカメで撮った複数枚の画像から大きなパノラマ画像を作る方法は下記の通りです。
1.カメラの位置をなるべく動かさず(回転はOK)、複数枚の画像を撮ります。
2.それぞれの画像の中から、特徴量を抽出します(今回はSURFを使っています)
3.異なる2枚の画像の特徴量を比較し、2枚の画像間のホモグラフィ行列を求めます。
4.求めたホモグラフィ行列を利用して、1枚ずつパノラマ画像に貼っていきます。

では、早速作っていきましょう。
1.材料の準備
今回の材料は下記の3枚です。
(自転車でちょっと峠まで行って写真を撮ってきました。)



2.特徴を探す
画像の特徴をひとまず目で探してみましょう。
image1の右側にある水色で囲った部分と、image2の水色の部分が同じもので、
image2の右側にあるオレンジで囲った部分とimage3のオレンジの部分が同じものであることがわかります。
(ほかにも特徴はありますが、ぱっと見てわかりやすいのが上記の2つです。)

この特徴探しをコンピュータにやってもらうのですが、今回はOpenCVに実装されているSURF特徴量を使います。
SURFを使うと、移動はもちろん、回転やスケーリングにも強い特徴を求めることが出来ます。

3.特徴のマッチング
画像ごとの特徴のリストが作られたので、次はこれを比較します。
2つの画像間で同じ物体が存在する場合は、2つの特徴リストの中に一致する特徴があるはずです。
今回、一致するものを探すために最近傍探索を使用しています。
(正直この辺はよくわかってないのですが、とりあえず特徴リストAにある特徴Anと、
特徴リストBにある特徴Bm(nとmは任意の数)の差が最小になるものを探し、それを特徴のペアとすることのようです)

特徴リスト間で対応する特徴の組が求まったら、それを元にホモグラフィ行列を求めます。
対応する特徴間の差(つまり特徴のX方向とY方向の移動量)のリストを求めて、
OpenCVの関数cvFindHomographyにホモグラフィ行列を求めてもらいます。

4.画像を合成する
今回は画像が3枚なので、image1とimage2間のホモグラフィ行列H12と、image2とimage3間のホモグラフィ行列H13がわかっていますが、
image1とimage3間のホモグラフィ行列はわかっていません。

ですが、image1とimage2間、image2間とimage3間の関係はホモグラフィ行列を使い、
下記のように表せるので、
image1 = H12 image2
image2 = H23 image3

image1とimage3間の関係は
image1=H12 H23 image3
となるはずです。

以上のことを踏まえてプログラムを作ると、下記のような結果になりました。


右下方向に拡大していっているのが気になりますが、それっぽく合成されてるようです。


あとは、↓こうなってるのを



こんな感じに補正してやれば
それっぽいパノラマ画像が出来そうです。

現在のパノラマ画像を作るところの処理は
・image1を左上に貼り付ける
・image2の透視変換画像(H12を使用)を求めて、貼り付ける
・image3の一時的な透視変換画像(ホモグラフィ行列H12を使用)を求めて、
さらにその一時的な画像にホモグラフィ行列H23を使用した投資変換画像を求めて貼り付ける

といった感じになってるので、

・image1を左上に貼り付ける
・image2の透視変換画像(H12を使用)を求める
・image2の歪みを直して貼り付ける
・image3の一時的な透視変換画像(ホモグラフィ行列H12を使用)を求めて、
さらにその一時的な画像にホモグラフィ行列H23を使用した投資変換画像を求める
・image3の歪みを直して貼り付ける

といった感じにすれば、キレイなパノラマ画像が作れそうです。


2011-06-28 追記
OpenCV2.3に、ベータ版ですがパノラマ写真作成ソフトがつきました。


ではまた。

2010/07/13

Computer Visionの資料 その3

最近は勉強用資料の発掘に勤しんでます。


よさそうな資料がおいてあるサイトを2つ見つけたので、リンクを貼っておきます。

1つ目はフロリダセントラル大学の"CAP5415 - Computer Vision"という講義のページです。
http://www.cs.ucf.edu/courses/cap6411/cap5415/
Reference Textの中央付近に、Fundamentals of Computer Vision というオンライン書籍?のリンクがあります。133ページのPDFで、エッジ検出やカメラのパラメータ推定などが取り上げられています。
また、ページの下のほうには練習問題っぽいものがありました。

2つ目はワシントン大学のComputer Visionの講義のページです。
Computer Vision: A Modern Approach という1000ページ弱のPDFがダウンロードできます。
http://www.cs.washington.edu/education/courses/455/02wi/
その他、Projectsというページにも面白そうな課題が載っていました。


ではまた。

2010/07/11

透視変換ツール

「詳解 OpenCV」の練習問題で、下記のようなお題がありました。
・テンキーの数字キーを押したら、該当の透視変換行列のセルに関連する
値を増減させるものを作ってみる。
・ズームインとズームアウトの機能をつける。
・回転する機能を追加できれば追加する。


とりあえず作ったものの結果が下記の通りとなります。
元の画像、アフィン変換(外形が平行四辺形になる)のもの、
透視変換(外形が台形になるもの)、適当に変換したもの です。




















とりあえず今回作ったもの(やっつけですが)は下記の通りとなります。
rを押すとリセット、cを押すと行列に加える数値のプラスとマイナスを変更できます。
qで終了です。
ズームとパンは、数字の3を押せば表現できます。
回転はとばしました。


//////////////////////////////////////
// 
// OpenCVで遊ぼう!
// http://playwithopencv.blogspot.com/
// 透視変換をします。

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

CvMat* warp_matrix =cvCreateMat(3,3,CV_32FC1);
double inc;

void ResetMatrix()
{
 cvZero(warp_matrix);
 cvSetReal2D(warp_matrix,0,0,1); 
 cvSetReal2D(warp_matrix,1,1,1); 
 cvSetReal2D(warp_matrix,2,2,1); 
}
void changeMatrix( int row, int col,double ratio)
{
 double n;
 n = cvGetReal2D(warp_matrix,row,col)+inc*ratio;
 cvSetReal2D(warp_matrix,row,col,n); 
}

int main(int argc, char **argv) 
{

  IplImage *src,*dst;
  char filename[80];

  std::cout<< "Input image filename." <<std::endl;
  std::cin >> filename;

  FILE *fp;
  if ( (fp = fopen(filename,"r")) != NULL ){
      fclose( fp );
     // ファイルが存在する
  }
  else
  {
     std::cout<< "Invaild filepath" <<std::endl;
    return -1;// ファイルは存在しない
  }


  src=cvLoadImage(filename,1);
  dst = cvCloneImage(src);

  dst->origin = src->origin;
  cvZero(dst);


  char c;
  cvNamedWindow("WarpPerspective",1);
  inc=0.01;
  
  ResetMatrix();
  while(true)
  {

   cvWarpPerspective(src,dst,warp_matrix);
  // cvSave("c:\\warp.txt",warp_matrix);

   cvShowImage("WarpPerspective",dst);
   c= cvWaitKey();
  
   //配置
   // 7  8  9
   // 4  5  6
   // 1  2  3
   // cを押すと、プラスとマイナスを変更できる。
   // zを押すと、ズーム
   // pを押すと、パン
   // rを押すと、{1,0,0,0,1,0,0,0,1}にリセットする
   // 9と6は押しても画像に変化はありません。
   if(c=='7') { changeMatrix(0,0,1);}  
   if(c=='8') { changeMatrix(0,1,1);}
   if(c=='9') { changeMatrix(0,2,1);}
   if(c=='4') { changeMatrix(1,0,1);}
   if(c=='5') { changeMatrix(1,1,1);}  
   if(c=='6') { changeMatrix(1,2,1);}
   if(c=='1') { changeMatrix(2,0,0.005);}
   if(c=='2') { changeMatrix(2,1,0.005);}
   if(c=='3') { changeMatrix(2,2,1);}  
   if(c=='c') { inc=inc *-1;}
   if(c=='q') break;
   if(c=='r')  { ResetMatrix(); };
  }
  cvReleaseImage(&dst);
  cvReleaseMat(&warp_matrix);
  cvReleaseImage(&src);
  cvDestroyWindow("WarpPerspective");


 return 0;



}

2010/07/08

Computer Visionの勉強用資料 その2

またまたComputer Visionの勉強用資料を発見しました。
Microsoftの研究所(たぶん)のRichard Szeliskiさんが書いたものです。
http://szeliski.org/Book/

ダウンロードして個人で使用しても大丈夫とのことなので、ダウンロードしてキンドルに入れてみました。今もっているのは小さいほうのキンドルなので、A4の書籍はさすがに文字が小さくなります。(どれくらい小さいかを実感してみたい方は、A4に印刷したものを25%の倍率(もしくはA4→A6)でコピーしてみてください。)


資料の話題に戻って、この資料では
・イメージプロセッシング
・物体検出とマッチング
・分割
・特徴に基づくアライメント
・SFM(動画からの再構築?)
・動きの推定
・イメージステッチング(複数枚の画像を大きな1枚の画像に合成することらしいです。)
・3Dの再構築
・画像の理解(顔検出、特定の物体検出)

と、さまざまなことが取り上げられています。

結構詳しく書かれている貴重な資料(しかも無料で)になると思うので、
前のスライドとともにちょっとずつ翻訳しながら読んでいきたいと思います。




---------------------------------------------------

最近はPDFで色々と資料が手に入るのですが、最適な閲覧方法がなかなか見つかりません。

以前はノートパソコンを横にして見ていましたが、腕や目が疲れるので長時間の利用は厳しいです。しかし、PDFのしおりやリンク機能が使え、フルカラーで閲覧できます。

キンドルは軽く、バックライトが無いので目が疲れにくいのですが、PDFのしおり機能やリンクが利用できません。また、すばやくペラペラめくる操作は今のところ出来ません。

紙に印刷すると読みやすいけれど置き場所に困ります。ページ数が多いとインク代も気になるところです。

各媒体でメリット・デメリットはありますが、今のところキンドルDXがPDFを見るのにはいいのではないかなぁと考えています。

2010/07/02

マシンビジョンの資料

最近はGoogle Books等で、色々とマシンビジョンの資料を探していました。
探している中で、よさそうな資料を見つけました。
「Multiple View Geometry in Computer Vision」という本の著者が作った240Pにわたるスライドです。
http://users.cecs.anu.edu.au/~hartley/Papers/CVPR99-tutorial/tutorial.pdf

内容としては、カメラのキャリブレーションに関するものや、ステレオビジョン、複数の画像からの3次元再構築などです。

スライド形式なので単語が少ないので翻訳も楽ちんです。
ひとまずしばらくはこれで勉強していく予定です。

2010/06/28

OpenCVで動画の動き補正

前回、パーティクルフィルタで対象の物体を追跡するプログラムを書きました。
今回は使い方をちょっと変えて、対象の物体を常に画面の中央に持ってくるようにしてみました。

元の動画は手でデジカメを持ち、前後左右に動きながら対象の車を撮影したもので、
車は動画の中心から離れたところにあります。

パーティクルフィルタでその車(今回は赤い色を抽出)の位置を特定し、
中心からの距離を使って動画をシフトすることで、対象の車が常に中心になるように
しています。



この方式だと、上下左右の移動は補正できますが、カメラが斜めに傾いたりすると
対応できなくなります。

斜めの補正はcvMinAreaRect2を使えば出来るようになるかもしれません。

ではまた。

2010/06/24

パーティクルフィルタ その2

前回の続きです。

前回はRGB形式の画像をHSV形式に変換し、Hを元に尤度を計算してましたが、なかなかうまくいかなかったのでRGB形式のまま、検索対象の色とのチャネルごとの差を求めて尤度を計算する方式に変えました。

検索対象の色は、マウスをクリックした座標近くにある色の平均としています。
Hのみを元に計算していたときよりは精度がよいようです。



サンプルコードを元にこれを作ってみましたが、
実際のパーティクルフィルタの理論はよくわかってません。

OpenCVの本にカルマンフィルターの説明があったので、
まずそれから理解しようかな~と思います。

ではまた。

今回のソースコードはこちら