在沒有安裝Opencv的電腦上運行基於Opencv庫的程式

來源:互聯網
上載者:User

在沒有安裝OpenCV的電腦上,要運行基於OpenCV庫的程式,有兩種方法:一、動態連結:就是將OpenCv安裝目錄下的bin目錄下的*.dll檔案與應用程式一起打包發布;二、靜態連結:就是將OpenCV庫原始碼先用cMake進行編譯,然後將opencv庫的源檔案加到工程中一期編譯,也就是說最後產生的可執行檔可以單獨運行,不需要OpenCV的動態連結程式庫。


一、首先介紹第一種方法,動態連結,dll調用其中包括隱式調用和顯示調用


1 隱式調用一般需要:
聲明函數介面的.h檔案——include檔案夾裡的內容
連結動態庫的.lib檔案——lib檔案夾裡的內容以及Input->Additional Dependencies添加的XX.lib
動態連結程式庫.dll檔案——bin檔案夾的內容
這裡bin檔案夾是在系統內容目錄裡的,所以執行代碼是exe檔案可以找到。也可以添加在系統檔案中,把需要用到的dll拷貝到exe同一個檔案夾下即可。
所以,如果把未發布的工程拷貝到沒有opencv的電腦上,只要把需要用的函數相關的.h,.lib以及.dll檔案考過去即可。

2 另一種調用dll的方式是顯示調用。
顯示調用是不需要.lib和.h檔案的。是在代碼裡“顯示”載入要用到的函數。例如:
HINSTANCE hDLL=NULL;//生命DLL控制代碼  
hDLL=LoadLibrary("opencv_core242d.dll");  //載入DLL
HMAT myImread=(HMAT)GetProcAddress(hDLL,"imread");  //使用DLL中的函數
這樣在拷貝工程時只拷貝用到的DLL檔案就可以。
但這樣代碼寫得很麻煩,DLL換個名字版本之類的要改很多地方,一般用得不多。

如果只是給別人靜態連結的exe程式(比如一個demo,不用跑程式),那隻要給別人dll檔案就可以。
也就是將需要用到的dll檔案拷到exe檔案夾下即可,Release拷貝XX.dll,Debug版本拷貝XXd.dll
(所以我們寫Additional Dependencies不用到的盡量不寫,這樣拷的dll會少一些~)

二 再一種方法就是樓上提到的把OpenCV的源碼一起編譯到可執行檔中。
這樣就不用拷貝dll檔案,只是產生的exe會比較大,具體方法為:

以HMMDemo為例
1、將OpenCv安裝目錄下的cv、cvaux、otherlibs/highgui三個目錄複寫到你的工程目錄下,再在工程目錄下建立一個camera目錄,將安裝目錄下的apps/Common目錄中的兩個檔案複製至camera目錄中。
2、在整合式開發環境的專案管理視窗中(FileView)建立六個檔案夾,分別為highgui_src,highgui_include,cvaux_include,cvaux_src,cv_include,cv_src
3、將專案管理視窗中Source Files中的Camera.cpp(如果有的話)及Header Files中的Camera.h(如果有的話)的路徑改為工程目錄下的camera目錄。
4、在專案管理視窗中右擊cv_include項,選擇Add Files to Folder...,將第1步中已複製至工程目錄下的cv目錄下的include目錄中的.h檔案添加到該專案管理檔案夾中。接著按相同做法將cv目錄下的src目錄中的.cpp檔案添加到cv_src專案管理檔案夾中。對cvaux_include、cvaux_src,highgui_include,highgui_src亦如此操作。兩點注意,第一是工程目錄下的highgui目錄下不再分include和src,但操作相同;第二是為cvaux_src添加.cpp檔案時不要添加cvaux.cpp,因為這個檔案包括了cv.h,連結時會有重複定義的錯誤。
5、右擊cv_src,選擇Setting...,選擇C/C++頁,在Category選擇Precompiled Headers,再選擇下面四個單選項中的第一項”Not using precompiled headers”。這樣做的目的是不使用編譯標頭檔,否則會產生“找不到檔案結尾”的錯誤。也可以在每個.cpp檔案的開頭加入include ”stdafx.h”,但顯然沒有更改一個選項來得方便。對cvaux_src及highgui_src也進行相同操作。
6、為工程的編譯編譯選項(Project->Settings...->C/C++)增加/Zm200,作用是增加堆棧的最大限制,因為cvaux_src中有個檔案用到了一個很大的常數數組,200不夠大的可以300,400......。
7、在Project->Settings...->C/C++中,選擇Category中的Preprocessor項,把Additional include directories改為cv/include,cv/src,highgui,camera,cvaux/include,cvaux/src
8、Project->Settings...->Link,如果Object/library modules中有cv.lib,cvaux.lib,highgui.lib,刪除之。注意cvd.lib為Debug版,cv.lib為Release版。
9、Project->Settings...->General,將Output directories下的兩個框改為Debug,這個是中間檔案(.obj等)的輸出目錄。Project->Settings...->Link,將Output file name改為Debug/XXX.exe,這個是最終可執行檔的輸出目錄。
好了,你的項目已經可以脫離OpenCV安裝環境編譯了,編譯出來的程式也可以脫離OpenCV的動態連結程式庫運行了

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.