“OpenCV” カテゴリのアーカイブ

OpenCVのCVS版(2008/10/10)をダウンロードして,いろいろ遊んでみました.
自身の動作環境は以下の通りです.

OS: Windows Vista Ultimate
IDE: Visual Studio 2005 Pro
DirectShow: Windows SDK v6.0
OpenCV: CVS版(20081010)

まず,気になる機能としてSURFがあるので,OpenCVで用意されているサンプルプログラム
C:\Program Files\OpenCV\samples\c\find_obj.cpp
を試してみました.




おおー,いろいろ応用できそうな感じですね.

***********************************

また,CVS版では,highguiのキャプチャ機能にvideoInput Library
組み込まれているようです.なので,highguiで提供されているcvCreateCameraCapture関数で
DirectShowのキャプチャが利用できるようになるみたい.コード例を以下に示します.

C++:
  1. #include <cv.h>
  2. #include <cxcore.h>
  3. #include <highgui.h>
  4.  
  5. #pragma comment(lib,"cv.lib")
  6. #pragma comment(lib,"cxcore.lib")
  7. #pragma comment(lib,"highgui.lib")
  8.  
  9. int main(int argc, char **argv)
  10. {
  11.     CvCapture *capture = 0;
  12.     IplImage *frame = 0;
  13.     int c;
  14.  
  15.     //カメラキャプチャ(DirectShow)の初期化
  16.     capture = cvCreateCameraCapture(CV_CAP_DSHOW);
  17.  
  18.     //ウィンドウの表示
  19.     cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);
  20.  
  21.     while(1)
  22.     {
  23.         frame = cvQueryFrame(capture);
  24.         cvShowImage("Capture", frame);
  25.         c = cvWaitKey(1);
  26.  
  27.         //ESCキーが押されたら終了
  28.         if(c == '\x1b')
  29.         {
  30.             break;
  31.         }
  32.     }
  33.  
  34.     cvReleaseCapture(&capture);
  35.     cvDestroyWindow("Capture");
  36.  
  37.     return 0;
  38. }


といった感じで,これまでの記述と同じ感じでDirectShowのキャプチャが簡単にできるようになるようです.
※ただし,2008/10/10現在のvideoInput Libraryにはfps変更用のメソッドがないので,fps変更はできません.

ということで,OpenCV/videoInput Libraryによるビデオキャプチャ
という記事の存在意義がなk(以下,自主規制)

Comments 1 コメント »

OpenCV開発再開? - 100円プログラマの覚え書き経由で知ったのですが,
OpenCV@sourceforge.netのForumsに以下のような記述があるみたい.

Willow Garage, a robotics research institutue/incubator is now supporting OpenCV development.
Expect new release early October that includes full, state of the art stereo pipeline,
improved calibration and many bug fixes.

これから,Willow GarageがOpenCVの開発をサポートするということでしょうか.
#それなら,IntelのOpenCVサイトが無くなったのも納得な気がするけど,IPPはどうするんでしょうか? > Intel

あと,10月にOpenCVのリリースがあるかもとのこと.

うーん,次のリリースで公開される機能って何だろーということで,
OpenCV v1.0と比べて,CVS版で大きく変わったと思われる機能を挙げてみます.
これがそのまま次のリリースで公開されるのかな?(※外れてたらスミマセン。。。)

・特徴点抽出アルゴリズムSIFTの高速化版SURF: Speeded Up Robust Features
→cvExtractSURF関数

・Stereo Calibration
→cvStereoCalibrate関数

・graph cut-based algorithmを用いた視差マップ算出
→cvFindStereoCorrespondenceGC関数

・cvThreshold
→「大津の方法」アルゴリズム追加

・オブジェクト検出器追加
→haarcascade_eye.xml,haarcascade_eye_tree_eyeglasses.xml

ざっと,こんな感じでしょうか?(CVS版を見た感じだと,bug fixはかなりあるみたい)
10月ももうすぐなのでリリースを楽しみに待つことにしましょう.

Comments コメントなし »

dandelion's log » cvReleaseImageの挙動についてのコメント欄のアドバイスをもとに,
OpenCV/videoInput Libraryによるビデオキャプチャのサンプルプログラム
にmemcpyバージョンを追加しました.

ただ,記事を書いた時に比べてvideoInputのバージョンが上がってAPIが少し変わっているので
その辺の対応もいずれ書かないとダメかな?(需要があるのかって話だけど。。。)

*******************************

Linux上でOpenCVを使っている人にはお馴染みのサイト,
Linux + OpenCV + 1394カメラ HOWTO
が更新されています!!(自分も学部時代にお世話になりました)

今後の更新が気になるところです.

*******************************

たのしいCocoaプログラミング[Leopard対応版]

著者/訳者:木下 誠

出版社:ビー・エヌ・エヌ新社( 2008-08-30 )

定価:¥ 2,940

Amazon価格:¥ 2,940

単行本(ソフトカバー) ( 352 ページ )

ISBN-10 : 4861005949

ISBN-13 : 9784861005947




が届きました.前評判通り懇切丁寧な解説でわかりやすい!!

ただ,MacBook付属のDVDに入っているXcodeはバージョンが3.0なんだけど,書籍で説明に使われている
Xcodeのバージョンが3.1なので,画面が少し違って焦った。。。(あれ?このチェックボックスがない etc...)
#新しいもの好きなのでADCで最新のXcodeをダウンロードしてインストールしましたが

ということで,Xcodeでいろいろプログラム組んでいたので,Diffused Illumination関連が出来なかった。。。
#9/23の休みにはなんとかやりたいところ.

Comments コメントなし »

OpenCV/videoInput Libraryによるビデオキャプチャのサンプルプログラムについて,
HandyARのデモが動かない問題の原因を発見した - サイScripterの旅立ちにて以下の指摘がありました.

どこのサイトを見ても、どうも怪しいコードしか載っていないように見える。

cvCreateImage後はimageDataにアロケートされているんだから、imageDataに代入しちゃったら解放するアドレスがわからないと思うんだけどなぁ。

でもメモリーリークの警告でないしなぁ・・・


結論から言うとメモリ解放について問題は無いです.ということで,
こちらとしても,「怪しいコードと断定」されるのも癪なので,
なぜ問題無いかについて少し書いてみます.

まず,cvReleaseImageの内部で何をやっているかというと,
確保したイメージ領域の解放のためにcvReleaseDataをコールしています.
cxarray.cppのcvReleaseData関数の中身を以下に示します.

C++:
  1. // Deallocates array's data
  2. CV_IMPL void
  3. cvReleaseData( CvArr* arr )
  4. {
  5.     CV_FUNCNAME( "cvReleaseData" );
  6.    
  7.     __BEGIN__;
  8.  
  9.     if( CV_IS_MAT_HDR( arr ) || CV_IS_MATND_HDR( arr ))
  10.     {
  11.         CvMat* mat = (CvMat*)arr;
  12.         cvDecRefData( mat );
  13.     }
  14.     else if( CV_IS_IMAGE_HDR( arr ))
  15.     {
  16.         IplImage* img = (IplImage*)arr;
  17.  
  18.         if( !CvIPL.deallocate )
  19.         {
  20.             char* ptr = img->imageDataOrigin;
  21.             img->imageData = img->imageDataOrigin = 0;
  22.             cvFree( &ptr );
  23.         }
  24.         else
  25.         {
  26.             CvIPL.deallocate( img, IPL_IMAGE_DATA );
  27.         }
  28.     }
  29.     else
  30.     {
  31.         CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
  32.     }
  33.  
  34.     __END__;
  35. }


その中で,
C++:
  1. if( !CvIPL.deallocate )
  2. {
  3.     char* ptr = img->imageDataOrigin;
  4.     img->imageData = img->imageDataOrigin = 0;
  5.     cvFree( &ptr );
  6. }

という部分からわかるように実際に解放するメモリ領域の先頭アドレスとして指定されるのは
img->imageDataOriginであることがわかると思います.

では,img->imageDataOriginって何?という話になるので,
IplImage構造体について一度確認してみましょう.
cxtypes.hのIplImage構造体の定義を以下に示します.

C++:
  1. typedef struct _IplImage
  2. {
  3.     int  nSize;         /* sizeof(IplImage) */
  4.     int  ID;            /* version (=0)*/
  5.     int  nChannels;     /* Most of OpenCV functions support 1,2,3 or 4 channels */
  6.     int  alphaChannel;  /* ignored by OpenCV */
  7.     int  depth;         /* pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
  8.                            IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported */
  9.     char colorModel[4]; /* ignored by OpenCV */
  10.     char channelSeq[4]; /* ditto */
  11.     int  dataOrder;     /* 0 - interleaved color channels, 1 - separate color channels.
  12.                            cvCreateImage can only create interleaved images */
  13.     int  origin;        /* 0 - top-left origin,
  14.                            1 - bottom-left origin (Windows bitmaps style) */
  15.     int  align;         /* Alignment of image rows (4 or 8).
  16.                            OpenCV ignores it and uses widthStep instead */
  17.     int  width;         /* image width in pixels */
  18.     int  height;        /* image height in pixels */
  19.     struct _IplROI *roi;/* image ROI. if NULL, the whole image is selected */
  20.     struct _IplImage *maskROI; /* must be NULL */
  21.     void  *imageId;     /* ditto */
  22.     struct _IplTileInfo *tileInfo; /* ditto */
  23.     int  imageSize;     /* image data size in bytes
  24.                            (==image->height*image->widthStep
  25.                            in case of interleaved data)*/
  26.     char *imageData;  /* pointer to aligned image data */
  27.     int  widthStep;   /* size of aligned image row in bytes */
  28.     int  BorderMode[4]; /* ignored by OpenCV */
  29.     int  BorderConst[4]; /* ditto */
  30.     char *imageDataOrigin; /* pointer to very origin of image data
  31.                               (not necessarily aligned) -
  32.                               needed for correct deallocation */
  33. }
  34. IplImage;


コメントにもありますが,imageDataOriginは,cvCreateImageで確保したイメージ領域を解放する
ことを保証するために用意されていて,実際にcvCreateImage関数の内部で
呼ばれるcvCreateData関数の中で,イメージ領域の割り当て時に
イメージ領域の先頭アドレスはimageDataとimageDataOriginの両方に格納されます.
cvarray.cppのcvCreateData関数の一部を以下に示します.

C++:
  1. if( !CvIPL.allocateData )
  2. {
  3.     CV_CALL( img->imageData = img->imageDataOrigin =
  4.                         (char*)cvAlloc( (size_t)img->imageSize ));
  5. }


ということで,imageDataが変更されても,imageDataOriginにイメージ領域の先頭アドレスが
格納されているので,cvReleaseImageできちんと解放されることがおわかりいただけると思います.

そんなわけで,OpenCVの内部でどうなっているかを把握した上で書いている点ご理解ください.
※誤解を生まないようVI.getPixelsで取得したイメージデータをmemcpy使ってコピーすれば
 いいんでしょうけど,ループ中にメモリコピーを行うと速度が落ちそうなので,ポインタの変更で済ませちゃってます.

#まぁ,指摘通り,C,C++がある程度わかる人には一見危なそうに見えるのは事実なんですが,
#このようにきちんと内部動作まで解説するとそれなりに大変で,初心者がそれを読むと挫折しそうなので
#今のところ説明を省いています.その辺のバランスって難しいですよね。。。
#何か良い案があれば教えてください.

Comments 4 コメント »

久しくOpenCVで遊んでないけど,これまで書き損ねてた豆知識的な事を書いてみます.参考までに.

■opencv_introduction
既出かもしれませんが,opencv-docにある
・opencv_introduction_2007June9.pdf
・opencv_objectdetection_2007june10.pdf
が結構良い感じにまとまっているよなーと.
この発表の資料かな?

(英語だけど)OpenCVの概要を掴むには良い教材だし,それなりに情報も新しい.
他所の情報を引用しただけの微妙なサイトよりも遙かに有用.

■CodingStyleGuide
ソースを直に読むなら,既存のファイルや関数の命名規則などが分かっていた方が遙かに効率が良いです.
CodingStyleGuide - OpenCV Library Wikiに軽く目を通すだけでも効率アップするはず!!

■CVS版
人柱的な意味合いが強いのでCVS版は避けられがちですが, 機能追加やbug fixがあって,
面白いので時々チェックしてます.

例えば,CVS版には,otherlibsの下にffopencvというディレクトリが新規で追加されてたりします.
CVSのコメントには,
>ffmpeg wrapper for opencv
と書かれているので,うまく使えばいろんな動画フォーマットに対応できるのかな?(多分)
あと,CVS版には目検出用の学習データ
・haarcascade_eye_tree_eyeglasses.xml
・haarcascade_eye.xml
が追加されていたりします.新しもの好きな方はCVS版で遊んでみる価値アリかも.

■公式サイト消失!?
個人的に結構前から凄く気になっていたのですが,IntelにあるOpenCV 公式サイトが無くなってますよね。。。
もしかして,Intelが手を引こうとしている??最近,というかかなりMLのチェックを怠ってたので,状況が掴めてません.
OpenCV本がそろそろ出るだけに気になる所です.

Learning OpenCV

著者/訳者:Gary Bradski Adrian Kaehler

出版社:Oreilly & Associates Inc( 2008-10-03 )

定価:¥ 4,523

Amazon価格:¥ 3,832

ペーパーバック ( 555 ページ )

ISBN-10 : 0596516134

ISBN-13 : 9780596516130


Comments コメントなし »

アクセスが少し増えてきたので,今まで自分が作ってきたしょうもないものを挙げてみるテスト.

■学部
GA(遺伝的アルゴリズム)の研究室配属だったのに,OpenCVの存在を知り楽しそうだったので
学部4年の夏から研究テーマを画像処理に変更(一応,GAも前処理に入れてたりするけど).
#高専のときに画像処理をやってたので,ゼロからのスタートでないのが唯一の救い.

当時,OpenCVの日本語サイトはほとんど存在しなかったので,英語による情報収集がメインの暗黒時代でした.

研究としてはwebカメラで普通のディスプレイをタッチパネルにしよう!!という試み.
実際にやっていることはそんなに難しくなくて,2つのカメラで指先をトラッキングして,3次元位置情報を算出し,
スクリーンに触れているかを判定して,マウスの動作に置き換えているだけです.

あと,今思うと,マルチタッチとかやってみれば良かったなーと思いますが,
自分には先見の明がなかったのでそこまではやってない。。。



ペイント操作のデモ.320x240のキャプチャ画像を解析して,
ディスプレイ座標を算出しているので精度はお世辞にも良いとは言えない。。。


ブラウザ操作のデモ.それなりに動くのでやってて楽しかったデモ.
ただ,指先検出の前処理に肌色抽出をやっているため,webページに人の顔や
肌色に似た色が出てくると誤認識してしまう(苦笑)



■修士
可動式+透過型のマルチタッチスクリーン.マルチタッチはFTIR方式で実現.
情報の獲得と作業を並列に行う際にいかに視線移動を少なくできるかという考えのもとに実装.

透明なスクリーンにプロジェクターの映像をそれなりに投影しつつ,
FTIRも実現するということに地味に苦労した記憶が。。。
#透明なスクリーンに映像を投影するってことはスクリーンの上方向に光を拡散させないといけないんだけど,
#反面,FTIRをやる場合には,スクリーンの下方向に光を拡散させる必要があるのでかなり鬼門だった.

あと,下のムービーでは音をカットしていますが,音声合成による操作ナビゲートもやってたりします.



■修士(おまけ)
うちの大学院では,学部生が研究室をプチ体験できるイベントがあったりするわけですが,
そこで,参加者の学部生が用意していた課題を予想以上にこなしてしまったので,
急遽何か作ってくれと頼まれて作ったもの.
#実験室に3時間くらい籠もって学部生に見つからないように作ってた。。。

デモは,マーカーに書かれた場所にGoogle Earthで移動するというもので,
AISTだと産総研,JAISTだと北陸先端,NAISTだと奈良先端に移動します.
#体験セミナーのテーマが画像処理だったのでマーカー検出部も一から作りました.
#ただ,画像処理よりもGoogle Earth APIをC++側で操作する方がいろいろ苦労した気がします(苦笑)





アルゴリズムはこんな感じ.

1. 2値化
2. 輪郭線抽出
3. 輪郭線の多角形近似
4. 辺の数が4となる領域をマーカー領域として残す
5. マーカー領域のコーナー位置よりマーカーの傾きを計算
6. 傾き情報を用いてアフィン変換(傾き補正)
7. テンプレートマッチングにより文字認識
8. 認識結果をGoogle Earthに渡す

学部生対象の画像処理の課題に良いレベルだと思うので,オススメです.



と,ここまで書いてて思ったのは,学生時代しょうもないものばかり作っていたんだなぁと。。。(遠い目)
ということで,今日はこの辺にしときます.

Comments コメントなし »

OpenCVを利用したプログラムにDebug版のライブラリhighguid.libを依存ファイルに追加して,
Debugモードでビルド,実行すると「MSVCR80.dll」が見つからない!!と怒られました。。。

なんでだろーと思って探してみると,公式のバグ報告にて既に報告されているみたいです.
書き込みによると,CVS版では解決しているらしいですが,CVS版をダウンロードして検証する
気力が残っていないので,javencaoさんの書き込みを参考に自力でなんとかしてみることにします.

ということで,以下に行った手順を示します.
※ある程度知識を有する、かつ人柱上等の人向けです(必ず最後まで読んでから判断してください).
初心者の方には激しく非推奨.


続きを読む方は下のリンクをクリックしてください.
このエントリの続きを読む »

Comments コメントなし »

Vista搭載の新デスクトップPCにOpenCVをインストールしてみました.
開発環境は以下のとおり.

OS:Windows Vista Ultimate SP1
CPU:Intel Core 2 Quad Q9450(2.66GHz)
IDE:Visual Studio 2005 Professional

が,ライブラリのビルドまではできたんだけど,OpenCV/bin/にある
cvtest.exeやcxcoretest.exeでテストするとたまにFAILが出ます。。。 orz
(たまになのが余計に気になる!!)

確かにVistaは正式にはサポートされてないけど,Windows XPでやってたときってこんなの出てたっけ?
とりあえず,XPが入っているノートPCで試してみるか。。。

あと,ここを読んでいる方で,Windows XP or Vista環境にてOpenCV使っている人が
いましたら,cvtest.exeやcxcoretest.exeを何回か実行してみてテスト状況などを
教えていただけると何かヒントになるかもしれないので情報提供お願いします.
※コメント or メールで情報提供受け付けてます.

**************************************************
[追記:2008/04/29]
Windows XP SP2 + Visual Studio 2005 Professional
という環境でcvtest.exe, cxcore.exeを実行してみたところ,同様の結果でした。。。
まぁ,これまで使えてたんだし大丈夫なのかな?(多分)

あと,OpenCVのライブラリをOpenMPモードでビルドすると,通常生成されるライブラリと何か違うのかな?
(パッと見た感じ,「/openmp」というオプションが有効になってるだけだけど)
OpenMPとOpenCVをからめた情報があまりないので,どちらのモードでビルドすべきかちょっと迷っています.

Comments コメントなし »

OpenCVを久しく触っていないのでちょっとリハビリ中.
てきとーに遊んでたらこんなものができました(※狙って作ってない).
使い道は無いけどな.>自分

原画像はLenna画像.
結果画像は正面からはただの点の集合にしか見えませんが,
異なる方向から見ると,原画像が浮き出るという不思議な画像.
※こちらの環境ではディスプレイを上から見下ろす感じで眺めると見えました.

それにしても,なんでこんなプログラムできたんだろう。。。
結果はおもしろいけど,全く意図しないものができたので困惑してます(苦笑)


原画像
 
結果画像
[追記:2008.04.16]
新しく買った解像度の高い(1920x1200)ディスプレイだと普通に見えますね。。。
解像度設定し損ねてた.orz ちゃんと1920x1200に設定したら正面から見えなくなりました.

ちなみに上記の実験に使ったノートPCのディスプレイの解像度は1280x1024.
PSPの液晶だと表示モードによっては画像の変換のせいかにじみました.
普通に見るぶんには斜めから見ないと見えないですけど.あと,興味本位で結果画像をOpenCVの顔認識プログラムにつっこんでみたら,認識に失敗.コンピュータは騙せても人間の眼は騙せない.改めて人間の眼はすごいなぁと感心.

そんなこともあって,人間が斜めから見ると知覚できて,コンピュータには認識しづらいみたいなので,一瞬CAPTCHAの代用的な応用できるんじゃね?とか思ったりしたんですけど,解像度の補間がらみの処理で絵が見えたってことは,すぐに突破されそう。。。まぁ,CAPTCHA自体がユーザビリティ的にどうなんだって話だけど.

Comments 1 コメント »

OpenCV/RAW画像生成 - Point at infinityという記事をアップしました.
といっても個人用ですが。。。(←需要があるとは思っていない)
まぁ,参考までに.

/****** [ここから余談]******
OpenCVの普及により画像処理という分野が身近になったのはいいのですが,
最初からOpenCVに依存しすぎると,理屈がわかっていなくても高度なアルゴリズムが
簡単に組めてしまうため,そういう人に限って「やってみたらできました」的な
結果に陥りやすいという諸刃の剣.


C言語習いたての人なんかは一からアルゴリズムをコーディングしてみた方が
後々のために良い勉強になりそうな気がします.

C言語に慣れてきたら,ppmなどファイル情報がヘッダ部に書き込まれているような
フォーマットにステップアップするとかね.
******[ここまで余談] ******/

ということで,OpenCVの話はここらへんにして.
最近,30日でできる! OS自作入門という本を買いました.
以前から気にはなっていたのですが,なかなか購入までには踏み切れなくて。。。

なのでやる気が再燃した今こそと,思い切って購入.
値段は3,990円とちょっと高めですが,それだけの価値がある読みやすい本だと思います.

ということで,現在1日目終了(バイナリエディタ久し振り使ったな…).
いつまで自分が続くのか…というのも気がかりですが,最近いろんなものに手を付け過ぎな感が。。。

30日でできる! OS自作入門

著者/訳者:川合 秀実

出版社:毎日コミュニケーションズ( 2006-03 )

定価:¥ 3,990

Amazon価格:¥ 3,990

単行本 ( 705 ページ )

ISBN-10 : 4839919844

ISBN-13 : 9784839919849




またまた,話が飛びますが,奥華子のシングル「手紙」をようやく買いました.
GYAOで「手紙」のPVが120秒間視聴できるんですけど,音楽とPVの出来がすごく良くて癒されます.
当分,BGMとして活躍しそうです.

手紙 / 奥華子 / CD ( Music )

ポニーキャニオン( 2008-01-23 )

定価:¥ 1,200 ( 中古価格 ¥ 142 より )


Comments コメントなし »