整理日: 20154/6
Borland C++BuilderでOpenCVを使う
確認 Turbo C++ 2007/03
http://sourceforge.net/projects/opencvlibrary/
から、opencv-win (OpenCV_1.0.exe) をダウンロード&インストールして下さい。
→C:\Program Filesへインストールされます。
C++Builderの場合そのまま.libが使えません。
アクセサリ>コマンドプロンプトを開き、
cd C:\Program Files\OpenCV_make
を実行して下さい。
→プロンプトが”C:\Program Files\OpenCV_make>”となります。
コマンドプロンプトで
make -f make_all_bc.mak
を実行して下さい。
→コンパイルが始まります。
→OpenCv/bin/のDLLが更新されます。
→OpenCV/lib/のLIBが更新されます。
(ここでやろうとしていること)
C:\Program Files\OpenCV_make フォルダにある makefileと、オプションとして make_all_bc.mak を実行しようとしています。 多分”bc”がボーランドコンパイラで、”gnu”がGNU、 ”ms”マイクロソフトなどと思います。
OpenCv/bin/から、cv100dll、cxcore100.dll、highgui100.dll、の3つを、 出来上がるEXEと同じフォルダにコピーします。
OpenCV/lib/から、cv.lib、cxcore.lib、highgui.lib、の3つを プロジェクトと同じ位置へコピーします。
ビルダー>プロジェクト>プロジェクトに追加で、上記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);
}
//---------------------------------------------------------------------------