熱門文章

2013年2月10日

C++/CLI With OpenCV

OpenCV過去多半是在C/C++環境下運行,當使用.Net Framework的CLR語言想使用OpenCV將透過第三方編譯的Emgu CV函式庫來做匯入編譯。
C++/CLI這時就有其優勢可同時使用managed與unmanaged寫法,首先先到OpenCV官方下載最新版的OpenCV Lib 以及Intel TBB

解壓縮OpenCV-2.4.3.exe後將會產生一個opencv資料夾,裡面將會使用到
  1. opencv\build\include
  2. opencv\build\x86\vc10\lib
  3. opencv\build\x86\vc10\bin
解壓縮tbb41_20130116oss_win.zip後將會產生一個tbb41_20130116oss資料夾,裡面將會使用到
  1. C:\Users\Henry\Desktop\tbb41_20130116oss\lib\ia32\vc11\tbb_debug.lib
  2. ※vc11 for Visual Studio2012 根據自己IDE版本選擇
開啟一個新的CLR主控台專案,並把opencv資料夾內的include與lib資料夾複製到專案資料夾內(同cpp與h檔同位置)。
再把tbb41_20130116oss內的tbb_debug.lib放置專案內剛複製的lib資料夾。

在Include目錄及程式庫目錄增加上面路徑之目錄



在程式內載入兩個.H檔
#include "include\opencv\cv.h"
#include "include\opencv\highgui.h"

在連結器部分其他相依性加入

opencv_calib3d243.lib
opencv_contrib243.lib
opencv_core243.lib
opencv_features2d243.lib
opencv_imgproc243.lib
opencv_flann243.lib
opencv_highgui243.lib
opencv_objdetect243.lib
tbb_debug.lib



程式部分輸入

#include "stdafx.h"
#include "include\opencv\cv.h"
#include "include\opencv\highgui.h"
using namespace System;

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");
IplImage *Image = cvLoadImage("img_1357809933.jpg");
cvNamedWindow("Show Image",CV_WINDOW_AUTOSIZE);
cvShowImage("Show Image",Image);
cvWaitKey(0);
cvReleaseImage(&Image);
cvDestroyWindow("Show Image");
    return 0;
}

並把opencv\build\x86\vc10\bin內所有DLL檔案複製到Debug或是Release資料夾內
也把檔名"img_1357809933.jpg"的圖片放置專案資料夾內
  1. 如果是從Visual Studio直接編譯執行圖片請放置專案名稱資料夾(同cpp與h檔同位置)
  2. 如果從編譯完的執行檔執行請放到與執行檔同資料夾
執行結果如下
(照片為網路轉載)













3 則留言:

  1. 您好:
    冒昧打擾。
    剛好也在嘗試在 dot net framework下掛opencv,
    依據您說明的方法實驗,差別只在於opencv版本,我使用的是242,
    想請問您是否有遇過這樣的錯誤訊息?

    1. error C3862: 'cvRound': 不能以 /clr:pure 或 /clr:safe 編譯 Unmanaged 函式
    2. error C3645: 'cvRound' : __clrcall 不可使用於編譯為機器碼的函式上

    謝謝您blog上提供的詳細說明。

    回覆刪除
  2. 您好:
    已找到答案 Orz
    http://msdn.microsoft.com/zh-tw/library/ms235211(v=vs.90).aspx
    看來真的需要好好搞清楚架構,不能一直亂寫.....
    再次感謝您~ :)

    回覆刪除
  3. 您好
    感謝你的熱心分享^^
    我也只是把之前遇到的問題發表在這部落格
    由於工作忙碌已很久沒更新 如果有我懂得我也會盡量解答

    回覆刪除