OpenCV for c++Builder

时间:2021-12-15 23:22:44

整理日: 20154/6

Borland C++BuilderでOpenCVを使う

確認 Turbo C++ 2007/03

1. ダウンロード&インストール

http://sourceforge.net/projects/opencvlibrary/

から、opencv-win (OpenCV_1.0.exe) をダウンロード&インストールして下さい。

→C:\Program Filesへインストールされます。

2. ライブラリのビルド

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”マイクロソフトなどと思います。

3. C++Builderの設定

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

を追加します。

4. テストプログラム

#include "cv.h"
#include "highgui.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
IplImage* ml;
ml = cvLoadImage( "./sample.bmp" );
}

コンパイルが通り実行できれば使用可能です。

5. memo

公式ドキュメントの引数に”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);
}
//---------------------------------------------------------------------------