よくある質問/トラブルシューティング/HOWTO
一般的な質問
OpenCVをインストールするには?
インストールガイドをお読み下さい.
OpenCVを早く習得するには?
- サンプルプログラム集(samplesディレクトリ内にあります)をご覧下さい.
- お使いの開発環境に合ったOpenCVワークスペース(_makeディレクトリ内にあります)をロードしてください.
- Microsoft Visual Studio 6.0用は,opencv.dsw
- Miscrosoft Visual Studio .NET 2003用は,opencv.sln
- Borland C++ BuilderX用は,cbuilderx/opencv.bpgr (訳注:ver.1.0では存在しない)
cvsample
を開き,ビルドして実行してください. コードを見て,適宜改変してみてください. - リファレンスマニュアル(docs\index.html)もご覧下さい.この中にも多くのサンプルが含まれています.
- OpenCVアーカイブhttp://groups.yahoo.com/group/OpenCV から興味のあるトピックを探してください.
- 新しいプロジェクトを一から作るか,既存の
cvsample
を改変しましょう. OpenCVを使うための Microsoft Visual Studio のウィザードが http://groups.yahoo.com/group/OpenCVにあります. (Files sectionには,OpenCV@yahoogroups.com へのユーザ登録が必要です)
OpenCVのバグを見つけたときは?
OpenCV@yahoogroups.comにメールを送ってください. その際,SubjectはBUG <....分かりやすいタイトル...> としてください.
Intel® Ingegrated Performance Primitivesのバグを見つけたときは?
developer_support@intel.comにメールを送ってください.
OpenCVフォーラムに参加するには?
OpenCV-subscribe@yahoogroups.comにメールを送ってください. メンバーになり,ログインすると,次のWebグループを読めるようになります. http://groups.yahoo.com/group/OpenCV
大量のメールを受信したくないので,設定を変更したいんだけど?
リアルタイムでメールを受信するか,一日一回のダイジェスト版を受信するかの設定は, http://groups.yahoo.com/mygroupsで, OpenCVの左のプルダウンリストからできます.
メーリングリストから脱退したいんだけど?
OpenCV-unsubscribe@yahoogroups.comにメールを送ってください. その際,Subjectは[OpenCV]とし,本文は記入不要です.
OpenCVとIPLを同時に使うとコンパイルエラーが出ました.どうすればいいですか?
IPLが存在することを明示的に宣言しない場合,IPLから完全に独立させるために,OpenCVではIplImage構造体とその他幾つかの構造体は重複して宣言されます.OpenCVのヘッダをインクルードする前にHAVE_IPLを宣言するか,"#include <ipl.h>"をOpenCVのヘッダの前に記述することで,衝突を回避することができます.
OpenCVは他のプロセッサでも動きますか?
動きます.OpenCV自体はオープンソースであり,特に32bitプラットフォーム間の移植は非常に容易です. ただし,IPPの効果により,Intelのプロセッサでは,OpenCVは特に高速に動作します.
Windows® OS に関連した質問
ビルドすると,streams.h not found とエラーが出ました.
(Windows Server 2003 SP1 SDK 以降では)Platform SDKの一部となったDirectShow SDKをインストールしてセットアップする必要があります. 以下の手順を参考にしてください.
-
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/からPlatform SDKをダウンロードし,
http://msdn.microsoft.com/directx/からDirectX SDKをダウンロードしてください. (サイズが非常に大きいです.ダウンロードとインストールはそれぞれ個別に行えます)
もし動作しない場合,HighGUIはVFWかMILを使ってキャプチャすることになります. - Platform SDKとDirectShow SDKを両方インストールする.
DirectX SDKを(サンプルコードあり,または無しで)インストールしてください. - baseclassesをビルドする
<PlatformSDKインストールフォルダ>\samples\multimedia\directshow\readme.txt をご覧下さい. - ビルドしたライブラリ(Release用のstrmbase.libとDebug用のstrmbasd.lib)を <PlatformSDKのインストールフォルダ>\libにコピーする
- Developer Studioに以下のパスを追加する
<DirectX SDKのインストールフォルダ>\include
<Platform SDKのインストールフォルダ>\include
<Platform SDKのインストールフォルダ>\samples\multimedia\directshow\baseclasses
をインクルードパスに追加してください (Visual Studio 6.0では, Tools->Options->Directories->Include files
Visual Studio 2005では,Tools->Options->Projects and Solutions->VC++ Directories->Include files).
<DirectX SDKのインストールフォルダ>\lib
<Platform SDKのインストールフォルダ>\lib
をライブラリ探索パスに追加してください(同様のダイアログ...->"Library files").注意:これらのパスはリストの先頭に追加してください. そうしないとコンパイルエラー,リンクエラーが発生する可能性があります. これはVisual Studioが古いバージョンのヘッダやライブラリを読み込むことがあり,必要な作業です.
- 以上でOpenCV DirectShow フィルタのビルドが可能になります.
DirectX SDKをインストールしたが,"TransInPlace" filter class constructorsが宣言されていない,または再宣言されている などのリンクエラーが出ます.
SDKのincludeフォルダとlibフォルダのパスを探索パスの先頭に追加してください.
cvcamを使おうとしたら,すぐにクラッシュしました.
ProxyTrans.ax と SyncFilter.ax が登録されているかを確認してください.
*.ax (DirectShow フィルタ)の登録ってどうやるの?
対象のファイルを(エクスプローラ内で) regsvr32.exe を使って開いてください (Windows2000では,プログラムを選択する...->参照...->c:\windows\system32\regsvr32.exe (パスは異なるかもしれません)). この関連付けは保存しておくと便利でしょう.
フィルタが登録できません(regsvr32がエラーを出しました).
この問題の多くは,幾つかの必要なDLLが検索パスに無いことが原因です. OpenCVの場合,<Openのインストールフォルダ>\bin がパスに入っているかを確認してください
cxcore096d.dll か cxcored.lib が無いみたいなんですが.
cxcore096d.dll はcxcore DLLのDebug用,cxcored.lib は cxcore096d.dllのインポートライブラリです. OpenCVワークスペース(_makeディレクトリ内にあります)を開いて,"cxcore"をアクティブプロジェクトとして選択し, "Win32 Debug"を選択してください. ビルドすると,bin\cxcore096d.dll と lib\cxcored.lib ができます. 同様の作業を,その他全てのOpenCVコンポーネントで行ってください. (バイナリファイルの最後の文字がdのものはDebug版で,that are not shipped)
HighGUIをコンパイルすると,"mil.h is not found" とエラーが出ました.
mil.hはMeteor や Meteor II などのMatrox製(もしくは互換製品)のフレームグラバーに付属するMatrox Imaging Library (MIL)の一部です.- この種のフレームグラバーを使っていて,MILをインストールしている場合には, mil\include と mil\lib を Developer Studio の検索パス(サブメニューの ツール->オプション->ディレクトリ)に追加してください.
- MILを使っていない場合,このエラーは無視してください. mil.hは,MIL用のHighguiで,"Win32 MIL Debug" もしくは "Win32 MIL Release"をビルドする場合に必要です. 代わりに,"Win32 Debug" もしくは "Win32 Release"(サブメニューの ビルド -> アクティブな構成)を選択することで コンパイルできるようになります.ただしこの場合,VFW経由で画像の取得が行われます.
DirectShow フィルタのデバックはどうやってやるの?
- フィルタを含んだワークスペースを開いてください(例えばopencv.dsw).
- フィルタをアクティブなプロジェクトに選択して,Debugモードでビルドしてください.
- デバッグバージョンのフィルタを登録するために,エクスプローラを起動します(例えば,regsvr32 camshiftd.ax). (レジストリにはフィルタ名だけが登録されているため,デバック/リリースバージョンを変更したときに一度実行するだけでよく,フィルタの再コンパイル後に毎回登録する必要はありません.)
- Developer Studioに戻り,デバッグモードで実行(F5)すると, モジュールをデバッグするために実行するアプリケーションを聞いてきます. camshift.ax をデバッグする際には,camshiftdemoを選択し, その他の DirectShowフィルタをデバッグするには,DirectX SDK ツールの grapheditを選択してください.
- graphedit内で,フィルタグラフをビルドしてください(例えば,camera->camshift->renderer).
- グラフを保存してください(次回以降,これを読み込むと便利です).
- ブレイクポイントをフィルタの::Transformメソッド内か,その他適当な場所に設定してください.
- フィルタを実行して,確認してください.
OpenCVで遊ぶためにDeveloperStudio のプロジェクトを作りたい.
Developer StudioでOpenCVを使うプロジェクトを一から作るには,以下のようにします.
- Developer Studioで新しいアプリケーションを作る.
- メニューから,"File"->"New..."->"Projects" をクリックし, "Win32 Application" か "Win32 console application" を選ぶ. (後者の方が簡単で,サンプルのプロジェクトはこの方法で作られています).
- プロジェクト名を入力し,保存先ディレクトリを指定してください.
- このプロジェクトに独自のワークスペースを作成する場合には,"Create new workspace", 現在実行中のワークスペースに組み込む場合には,"Add to current workspace"を選択する.
- "next" ボタンをクリックする.
- "An empty project"を選択し,"Finish","OK"をクリックする.
- ファイルをプロジェクトに追加する.
- メニューから,"File"->"New..."->"Files" を選択する.
- "C++ Source File"を選択し,ファイル名を入力して"OK"を押す.
- OpenCVを使うために必要な #include を追加する.
#include "cv.h" /* #inlcude "cvaux.h" // 実験的なもの(必要があれば追加)*/ #include "highgui.h"
もしくは,既存のファイル(opencv\samples\c\morphology.cなど)をプロジェクトのフォルダにコピーして,プロジェクトに追加(エディタビューで右クリック-> "Insert File into Project" -> <プロジェクト名>)する.
- プロジェクトの設定を変更する.
- メニューから "Project"->"Settings..."を選び,プロジェクト設定ダイアログを表示させる.
- 作成したプロジェクトを右の枠から選択する.
- Release と Debug 構成の両方に共通した設定を変更する.
- "Settings For:"->"All Configurations"を選択する.
- "C/C++"タブ -> "Preprocessor"カテゴリ -> "Additional Include Directories:"を選択する. opencv\cxcore\include, opencv\cv\include, opencv\otherlibs\highgui と,必要があれば opencv\cvaux\includeの (.dspファイルから見た)相対パスか,絶対パスをコンマ区切りで追加する.
- "Link" タブ -> "Input" カテゴリ -> "Additional library path:"を選択する. 必要なライブラリ(cxcore[d].lib cv[d].lib hihghui[d].lib cvaux[d].lib)のパスを全て追加する.
- "Debug"構成の設定を変更する.
- "Settings For:"->"Win32 Debug"を選択する.
- "Link" タブ -> "General"カテゴリ -> "Object/library modules"を選択する. スペース区切りで,cvd.lib, highguid.lib, cvauxd.lib (必要があれば)を追加する.
- 出力ファイルの場所と名前を変更したい(例えば,出力される.exeファイルをDebugフォルダではなく,プロジェクトフォルダに置きたい)場合には, "Link" タブ -> "General" カテゴリ -> "Output file name:"で,./<実行ファイル名>d.exe とすればよい.
- "Release"構成の設定を変更する.
- "Settings For:"->"Win32 Release"を選択する.
- "Link"タブ -> "General"カテゴリ -> "Object/library modules"を選択する. スペース区切りで,cv.lib, highgui.lib, cvaux.lib (必要があれば)を追加する.
- .exeファイルの名前を変更したい場合には,"Link" タブ -> "General" カテゴリ -> "Output file name:"で,./<実行ファイル名>.exeとすればよい.
- プロジェクトの依存関係を追加する.
- メニューから "Project" -> "Insert project into workspace"を選択する.
- opencv\cv\make\cv.dsp を選択する.
- opencv\cvaux\make\cvaux.dspと,opencv\otherlibs\highgui\highgui.dspにも同様の作業を行う.
- 依存関係を設定します.
- メニューから "Project" -> "Dependencies..."を選んで,
- "cv"に対して"cxcore"を選択する.
- "cvaux"に対して"cv"と"cxcore"を選択する.
- "highgui"に対して,"cxcore"を選択する.
- 作成したプロジェクトに対して,"cxcore","cv","cvaux","highgui"の全てを選択する.
- 以上で完了です.コンパイルして実行してみてください.
Linuxに関連した質問
工事中ライブラリを使うための技術的な質問
画像の各ピクセルにアクセスするには?
(座標は原点を基準として0からカウントします. 原点は img->origin=IPL_ORIGIN_TL とした場合には左上,img->origin=IPL_ORIGIN_BL とした場合には左下になります.)
- 8ビット 1チャンネルの画像I(IplImage* img)の場合,
I(x,y) ~ ((uchar*)(img->imageData + img->widthStep*y))[x]
- 8ビット 3チャンネルの画像I(IplImage* img)の場合,
I(x,y)blue ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3 ] I(x,y)green ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+1] I(x,y)red ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+2]
例えば,(100,100)の点の輝度を30増加させるには,以下のようにします.CvPoint pt = {100,100}; ((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3 ] += 30; ((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3+1] += 30; ((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3+2] += 30;
または,より効率的にCvPoint pt = {100,100}; uchar* temp_ptr = &((uchar*)(img->imageData + img->widthStep*pt.y))[x*3]; temp_ptr[0] += 30; temp_ptr[1] += 30; temp_ptr[2] += 30;
- 32ビット 浮動小数点型 1チャンネルの画像I(IplImage* img)の場合,
I(x,y) ~ ((float*)(img->imageData + img->widthStep*y))[x]
- つまり一般的に,T型 Nチャンネル画像の場合,
I(x,y)c ~ ((T*)(img->imageData + img->widthStep*y))[x*N + c] マクロCV_IMAGE_ELEM( image_header, elemtype, y, x_Nc ) を使う場合は, I(x,y)c ~ CV_IMAGE_ELEM( img, T, y, x*N + c )
行列の要素にアクセスするには?
やり方は前述のものとよく似ています. (以下のサンプルでは,iは0から始まる行要素,jは0から始まる列要素)
- 32ビット浮動小数点型の実数行列M(CvMat* mat)の場合には,
M(i,j) ~ ((float*)(mat->data.ptr + mat->step*i))[j]
- 64ビット浮動小数点型の複素数行列M(CvMat* mat)の場合には,
Re M(i,j) ~ ((double*)(mat->data.ptr + mat->step*i))[j*2] Im M(i,j) ~ ((double*)(mat->data.ptr + mat->step*i))[j*2+1]
- 1チャンネル行列の場合には,マクロCV_MAT_ELEM( matrix, elemtype, row, col )が使えます.
例えば,32ビット浮動小数点型実数行列では,
M(i,j) ~ CV_MAT_ELEM( mat, float, i, j ),
また,3x3行列を単位行列に初期化するには,CV_MAT_ELEM( mat, float, 0, 0 ) = 1.f; CV_MAT_ELEM( mat, float, 0, 1 ) = 0.f; CV_MAT_ELEM( mat, float, 0, 2 ) = 0.f; CV_MAT_ELEM( mat, float, 1, 0 ) = 0.f; CV_MAT_ELEM( mat, float, 1, 1 ) = 1.f; CV_MAT_ELEM( mat, float, 1, 2 ) = 0.f; CV_MAT_ELEM( mat, float, 2, 0 ) = 0.f; CV_MAT_ELEM( mat, float, 2, 1 ) = 0.f; CV_MAT_ELEM( mat, float, 2, 2 ) = 1.f;
OpenCVでデータを処理するには?
6000の要素を持つ300x200ピクセルの32ビット浮動小数点型画像・配列の場合には,
int cols = 300, rows = 200; float* myarr = new float[rows*cols]; // ステップ1)CvMatヘッダを初期化する CvMat mat = cvMat( rows, cols, CV_32FC1, // 32ビット浮動小数点型,1チャンネル myarr // ユーザデータへのポインタ(データはコピーされない) ); // ステップ2)OpenCVの関数を使って,例えば L2(フロベニウス)ノルムを計算する double norm = cvNorm( &mat, 0, CV_L2 ); ... delete myarr;その他の関数の使い方は,リファレンスマニュアルの cvCreateMatHeaderやcvInitMatHeader,cvCreateImageHeader,cvSetDataなどをご覧下さい.
画像を読み込んで表示するには?
/* 使い方:prog <image_name> */ #include "cv.h" #include "highgui.h" int main( int argc, char** argv ) { IplImage* img; if( argc == 2 && (img = cvLoadImage( argv[1], 1)) != 0 ) { cvNamedWindow( "Image view", 1 ); cvShowImage( "Image view", img ); cvWaitKey(0); // イベント処理を含む場合には,これが重要. cvDestroyWindow( "Image view" ); cvReleaseImage( &img ); return 0; } return -1; }
どうすれば輪郭の抽出と処理ができますか?
サンプルプログラムsquares(samples\c\squares.c)をご覧下さい.
OpenCVを使ってカメラのキャリブレーションをするには?
工事中