OpenCV for c++Builder

整理日: 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);
}
//---------------------------------------------------------------------------
posted @ 2015-04-06 15:52  wanglinqiang  阅读(979)  评论(0编辑  收藏  举报