整理日: 20154/6ui
Borland C++BuilderでOpenCVを使う
確認 Turbo C++ 2007/03.net
http://sourceforge.net/projects/opencvlibrary/
から、opencv-win (OpenCV_1.0.exe) をダウンロード&インストールして下さい。rest
→C:\Program Filesへインストールされます。code
C++Builderの場合そのまま.libが使えません。
アクセサリ>コマンドプロンプトを開き、
cd C:\Program Files\OpenCV_make
を実行して下さい。orm
→プロンプトが」C:\Program Files\OpenCV_make>」となります。ci
コマンドプロンプトで
make -f make_all_bc.mak
を実行して下さい。get
→コンパイルが始まります。
→OpenCv/bin/のDLLが更新されます。
→OpenCV/lib/のLIBが更新されます。it
(ここでやろうとしていること)
C:\Program Files\OpenCV_make フォルダにある makefileと、オプションとして make_all_bc.mak を実行しようとしています。 多分」bc」がボーランドコンパイラで、」gnu」がGNU、 」ms」マイクロソフトなどと思います。io
OpenCv/bin/から、cv100dll、cxcore100.dll、highgui100.dll、の3つを、 出來上がるEXEと同じフォルダにコピーします。
OpenCV/lib/から、cv.lib、cxcore.lib、highgui.lib、の3つを プロジェクトと同じ位置へコピーします。opencv
ビルダー>プロジェクト>プロジェクトに追加で、上記3つのLIBを追加します。
ビルダー>プロジェクト>オプションのインクルードパスにて
C:\Program Files\OpenCV\cxcore\include
C:\Program Files\OpenCV\cv\include
C:\Program Files\OpenCV\otherlibs\highgui
C:\Program Files\OpenCV\otherlibs\cvcam\include
を追加します。
#include "cv.h" #include "highgui.h" void __fastcall TForm1::Button1Click(TObject *Sender) { IplImage* ml; ml = cvLoadImage( "./sample.bmp" ); }
コンパイルが通り実行できれば使用可能です。
公式ドキュメントの引數に」CvArr」が出てきますが。
CvArr is used only as a function parameter to specify that the function accepts arrays of more than a single type,for example IplImage, CvMat or even CvSeq. The particular array type is determined at runtime by analyzing the first 4 bytes of the header.
より引數CvArrには、IplImage* CvMat* CvSeq* を使います。
typedef struct _IplImage { int nSize; /* sizeof(IplImage) */ int ID; /* version (=0)*/ int nChannels; /* チャンネル數。RGBなら3 OpenCV の関數では、主に 1~4 を使います */ int alphaChannel; /* OpenCV では使いません */ int depth; /* 1畫素の持つ型 IPL_DEPTH_8U : 8 bit 天然數 IPL_DEPTH_8S : 8 bit 整數 IPL_DEPTH_16S : 16 bit 整數 IPL_DEPTH_32S : 32 bit 整數 IPL_DEPTH_32F : 32 bit 実數 IPL_DEPTH_64F : 32 bit 実數 */ char colorModel[4]; /* OpenCV では使いません */ char channelSeq[4]; /* ditto */ int dataOrder; /* 0 - RGB RGB RGB, 1 - RRR GGG BBB OpenCV では、0 のみ使用可能 */ int origin; /* 0 - 左上が原點, 1 - 左下が原點 */ int align; /* データアライメント。 OpenCVでは參照しません。widthStep のみ參照します */ int width; /* width。橫の畫素數 */ int height; /* height。縦の畫素數 */ struct _IplROI *roi; /* Region Of Interest。 処理対象の領域を持つポインタ。使わないなら NULL */ struct _IplImage *maskROI; /* must be NULL */ void *imageId; /* ditto */ struct _IplTileInfo *tileInfo; /* ditto */ int imageSize; /* 畫素値配列のバイトサイズ (==image->height*image->widthStep)*/ char *imageData; /* アライメントされた畫素値配列へのポインタ */ int widthStep; /* アライメントした橫のバイトサイズ */ int BorderMode[4]; /* OpenCV では使いません */ int BorderConst[4]; /* ditto */ char *imageDataOrigin; /* 畫素値配列へのポインタ(アライメントは不要) deallocation には必要らしいが、NULLでイイと思う*/ }IplImage; //--------------------------------------------------------------------------- //OpenCvを起動(指定フォルダから呼び出す) #pragma comment(lib, "../opencv/highgui.lib") #include "highgui.h" void __fastcall TMainForm::Button2Click(TObject *Sender) { typedef IplImage* (*CVLOAD)(char*); HINSTANCE hCxcore = LoadLibrary("../opencv/cxcore097.dll");//これをロードしてから HINSTANCE hHighgui = LoadLibrary("../opencv/highgui097.dll"); int width = 0; if(hCxcore && hHighgui){ //DLLで定義されているメソッド名(ヘッダではない) CVLOAD DllFunction = (CVLOAD)GetProcAddress(hHighgui,"_cvLoadImage"); IplImage* ml = DllFunction("./sample.bmp"); width = ml->width; } FreeLibrary(hCxcore); FreeLibrary(hHighgui); } //---------------------------------------------------------------------------