1. 程式人生 > >OpenCV環境配置Visual Studio 2010、2012、2013、2015

OpenCV環境配置Visual Studio 2010、2012、2013、2015

本文方法主要適用於經典的OpenCV2.4.x的所有版本,3.x不在範圍內。本文的配置方法可以容忍vs的所有版本,以及32位和64位的配置衝突問題,完美解決OpenCV所有配置相關問題,一次完成配置,輕鬆編寫所有程式,並且能使各種vs版本配置的環境不衝突的方法。
如果你已經配置了opencv,有問題或者沒問題,避免方法衝突可以清掉現有配置,以現在這種方法來實現最佳配置。

下載後,我們得到一個7z的exe檔案壓縮包,雙擊解壓縮到指定目錄如下圖:
這裡寫圖片描述

2.修改目錄名

a.將build/x86下的vc10、vc11、vc12(如果有vc9、vc13等,一樣修改,後面加0即可),修改為vc100、vc110、vc120,如圖
這裡寫圖片描述

b.將build/x64下的vc10、vc11、vc12(如果有vc9、vc13等,一樣修改,後面加0即可),修改為vc100、vc110、vc120,如圖
這裡寫圖片描述

c.將build下的x86修改為win32
這裡寫圖片描述

3.開啟visual studio(無論你什麼版本都行),這裡以vs2013為例,新建一個控制檯專案:

這裡寫圖片描述

a.選擇配置管理器-新建解決方案平臺-選擇x64,確定即可,如圖:
這裡寫圖片描述

b.選擇檢視-屬性管理器
這裡寫圖片描述

c.填入標頭檔案和庫檔案路徑
這裡庫的路徑是如下,該庫路徑是全部通用:
H:\opencv2.4.10\build/$(Platform)/vc$(PlatformToolsetVersion)/staticlib
這裡寫圖片描述

d.新增巨集定義:_CRT_SECURE_NO_WARNINGS
這裡寫圖片描述

4.寫程式

在程式碼中寫下:

#include "stdafx.h"
#include <cv.h>
#include <opencv2/core/core.hpp>
#include <highgui.h>

using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
    Mat img(300, 300, CV_8UC3);
    img.setTo(Scalar(0, 255));
    imshow("Hello OpenCV"
, img); waitKey(); return 0; }

a.開啟cv.h
這裡寫圖片描述

b.在cv.h中新增一句:#include <opencv/cv_import_static_lib.h>
這裡寫圖片描述

c.開啟core.hpp
這裡寫圖片描述

d.在core.hpp中新增一句:#include <opencv/cv_import_static_lib.h>
這裡寫圖片描述

e.core.hpp上點右鍵,開啟core.hpp所在目錄,進入到opencv標頭檔案目錄下,然後轉到:H:\opencv2.4.10\build\include\opencv
這裡寫圖片描述

f.在目錄中新建文字檔案.txt,並將如下內容貼上並儲存

#pragma once

#ifdef WIN32
#include <opencv2/core/version.hpp>
//定義巨集,保證在debug模式下,匯入opencv_xxxd.lib,release模式下匯入opencv_xxx.lib
#ifdef _DEBUG
#   define CC_CVLIB(name) "opencv_" name CC_CVVERSION_ID "d.lib"
#   define CC_CVLIB_2(name) "opencv_" name CC_CVVERSION_ID2 "d.lib"
#   define CC_LIB(name) name "d.lib"
#else
#   define CC_CVLIB(name) "opencv_" name CC_CVVERSION_ID ".lib"
#   define CC_CVLIB_2(name) "opencv_" name CC_CVVERSION_ID2 ".lib"
#   define CC_LIB(name)   name ".lib"
#endif

//對於靜態庫,必須匯入如下這些庫
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "Vfw32.lib")
#pragma comment(lib, "winspool.lib")
#pragma comment(lib, "comdlg32.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")
#pragma comment(lib, "uuid.lib")
#pragma comment(lib, "odbc32.lib")
#pragma comment(lib, "odbccp32.lib")
#pragma comment(lib, "Comctl32.lib")

//如果為3版,匯入方式不同
#if CV_MAJOR_VERSION==3
//定義cv的庫名稱,2410版的,如果是其他版本,則修改為指定的就好了
#define CC_CVVERSION_ID       "2410"
#define CC_CVVERSION_ID2       "300"

//匯入靜態庫依賴
#pragma comment(lib, CC_LIB("IlmImf"))
#pragma comment(lib, CC_LIB("libjasper"))
#pragma comment(lib, CC_LIB("libjpeg"))
#pragma comment(lib, CC_LIB("libpng"))
#pragma comment(lib, CC_LIB("libtiff"))
#pragma comment(lib, CC_LIB("libwebp"))
#pragma comment(lib, "ippicvmt.lib")
#pragma comment( lib, CC_CVLIB("calib3d") )
#pragma comment( lib, CC_CVLIB_2("calib3d") )
#pragma comment( lib, CC_CVLIB("contrib") )
//#pragma comment( lib, CC_CVLIB("core") )
#pragma comment( lib, CC_CVLIB_2("core") )
//#pragma comment( lib, CC_CVLIB("core") )
#pragma comment( lib, CC_CVLIB_2("features2d") )
#pragma comment( lib, CC_CVLIB("features2d") )
#pragma comment( lib, CC_CVLIB_2("flann") )
#pragma comment( lib, CC_CVLIB("flann") )
#pragma comment( lib, CC_CVLIB("gpu") )
#pragma comment( lib, CC_CVLIB_2("highgui") )
#pragma comment( lib, CC_CVLIB("highgui") )
#pragma comment( lib, CC_CVLIB_2("imgcodecs") )
#pragma comment( lib, CC_CVLIB_2("imgproc") )
#pragma comment( lib, CC_CVLIB("imgproc") )
#pragma comment( lib, CC_CVLIB("legacy") )
#pragma comment( lib, CC_CVLIB_2("ml") )
#pragma comment( lib, CC_CVLIB("ml") )
#pragma comment( lib, CC_CVLIB("ocl") )
#pragma comment( lib, CC_CVLIB("nonfree") )
#pragma comment( lib, CC_CVLIB_2("objdetect") )
#pragma comment( lib, CC_CVLIB("objdetect") )
#pragma comment( lib, CC_CVLIB_2("photo") )
#pragma comment( lib, CC_CVLIB("photo") )
#pragma comment( lib, CC_CVLIB_2("shape") )
#pragma comment( lib, CC_CVLIB_2("stitching") )
#pragma comment( lib, CC_CVLIB("stitching") )
#pragma comment( lib, CC_CVLIB_2("superres") )
#pragma comment( lib, CC_CVLIB("superres") )
#pragma comment( lib, CC_CVLIB_2("ts") )
#pragma comment( lib, CC_CVLIB("ts") )
#pragma comment( lib, CC_CVLIB_2("video") )
#pragma comment( lib, CC_CVLIB("video") )
#pragma comment( lib, CC_CVLIB_2("videoio") )
#pragma comment( lib, CC_CVLIB_2("videostab") )
#pragma comment( lib, CC_CVLIB("videostab") )
#pragma comment(lib, CC_LIB("zlib"))
#else
#define CC_CVVERSION_ID CVAUX_STR(CV_VERSION_EPOCH) CVAUX_STR(CV_VERSION_MAJOR) CVAUX_STR(CV_VERSION_MINOR)
//匯入靜態庫依賴
#pragma comment(lib, CC_LIB("IlmImf"))
#pragma comment(lib, CC_LIB("libjasper"))
#pragma comment(lib, CC_LIB("libjpeg"))
#pragma comment(lib, CC_LIB("libpng"))
#pragma comment(lib, CC_LIB("libtiff"))
#pragma comment( lib, CC_CVLIB("calib3d") )
#pragma comment( lib, CC_CVLIB("contrib") )
#pragma comment( lib, CC_CVLIB("core") )
#pragma comment( lib, CC_CVLIB("features2d") )
#pragma comment( lib, CC_CVLIB("flann") )
#pragma comment( lib, CC_CVLIB("gpu") )
#pragma comment( lib, CC_CVLIB("highgui") )
#pragma comment( lib, CC_CVLIB("imgproc") )
#pragma comment( lib, CC_CVLIB("legacy") )
#pragma comment( lib, CC_CVLIB("ml") )
#pragma comment( lib, CC_CVLIB("ocl") )
#pragma comment( lib, CC_CVLIB("nonfree") )
#pragma comment( lib, CC_CVLIB("objdetect") )
#pragma comment( lib, CC_CVLIB("photo") )
#pragma comment( lib, CC_CVLIB("stitching") )
#pragma comment( lib, CC_CVLIB("superres") )
#pragma comment( lib, CC_CVLIB("ts") )
#pragma comment( lib, CC_CVLIB("video") )
#pragma comment( lib, CC_CVLIB("videostab") )
#pragma comment(lib, CC_LIB("zlib"))
#endif //CV_MAJOR_VERSION
#endif

g.將新建文字檔案.txt改名為cv_import_static_lib.h

h.回到工程中,修改工程的所有配置屬性為靜態mfc:
這裡寫圖片描述

i.點選執行或者按下Ctrl+F5
這裡寫圖片描述
正常情況下,應該會出現這個視窗,算正式完成配置
這裡寫圖片描述

5.後續每個新工程寫程式的步驟

a.新建一個win32的工程並按照上面h步(回到工程中,修改工程的所有配置屬性為靜態mfc)的方法設定
b.寫任何你想要的opencv程式碼即可直接執行。

6.對於其他OpenCV專案以這種環境執行起來

a.刪掉專案中附加依賴項中和opencv相關的lib配置或者程式碼中以#pragma comment配置的opencv庫
b.設定工程屬性為靜態mfc
c.即可執行

基於5和6看,你會發現,使用的時候是相當方便的,不會再受dll所幹擾而浪費時間,摸不著頭腦。
並且,這種模式,你能夠在win32、x64、debug、release下完全跑起來,而不像之前,會出現很多異常。
另外,這模式是基於靜態庫的,也就是釋出軟體的時候非常方便,不需要攜帶任何opencv的dll檔案。非常有利於做各種事情。
如果你在vs2010下配置的,那麼以這個方式,在2013下也完全能夠零改動跑起來。

**最後:如果需要播放視訊檔案的情況,得把opencv的opencv_ffmpeg249.dll和opencv_ffmpeg249_64.dll複製到c:/windows/目錄下即可(靜態連結是不會連結上這兩個dll的,包括髮布程式的時候也需要帶上他們)。
檔案在H:\opencv2.4.10\build\win32\vc100\bin裡面以及H:\opencv2.4.10\build\x64\vc100\bin裡面
**