1. 程式人生 > >OpenCV基礎——OpenCV3和VS的下載、安裝、環境配置

OpenCV基礎——OpenCV3和VS的下載、安裝、環境配置

作為最後一個更新的課,首先和大家說聲抱歉,其次,本次的課不會涉及到過多的C++程式碼,所以大家可以放心(其實這個看標題也能看出來……)

第一部分 VS的下載安裝

大家可以去官網下載,也可以百度一下壓縮包,我是百度裡找了個壓縮包下載的,因為官網我下載出現了問題,大家如果能在官網下我建議還是官網下哈。

【原本是打算提供雲盤的,但是因為檔案傳輸太慢了,過幾天再補上】

下完以後雙擊點開vs_ultimate.exe就可以開始安裝了,安裝過程和一般軟體的安裝差不多,就不多講了。

第二部分 OpenCV的下載安裝以及配置環境變數

OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以執行在Linux、Windows、Android和Mac OS作業系統上。它輕量級而且高效——由一系列 C 函式和少量 C++ 類

構成,同時提供了Python、Ruby、MATLAB等語言的介面,實現了影象處理和計算機視覺方面的很多通用演算法

opencv2.4.9地址:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.9/opencv-2.4.9.exe/download

(我是用2.4.9的版本的,當然大家還可以去官網下OpenCV3或其他版本,如果下了其他版本,第三部分的環境搭建就需要注意一些不同的地方)

下載完成後,雙擊就可以完成解壓,解壓的路徑要記清楚。我的路徑是D:\opencv。

接下來要配置環境變數(步驟如下):

【計算機】→【(右鍵)屬性】→【高階系統設定】→【高階(標籤)】→【環境變數】→(雙擊)系統變數中的Path→在變數值裡面新建相應的路徑(以下路徑以我的路徑為樣本)。

對於32位系統,就新增:

D:\opencv\build\x86\vc12\bin

對於64位系統,就新增:

D:\opencv\build\x86\vc12\bin    和    D:\opencv\build\x64\vc12\bin

注:變數值實際為bin資料夾的路徑,對應於上面解壓opencv時的路徑。vc8表示編譯環境為Microsoft Visual Studio 2005;vc9表示編譯環境為Microsoft Visual Studio 2008;vc10表示編譯環境為Microsoft Visual Studio 2010;vc11表示編譯環境為Microsoft Visual Studio 2012;

vc12表示編譯環境為Microsoft Visual Studio 2013。大家根據自己下的VS的版本選擇不同的路徑。

第三部分 環境搭建

(一)開啟Visual Studio,新建一個Win32控制檯應用程式的空專案


點選【確定】後在點一次【下一步】,會出現以下介面,將【空專案】勾起來即可點【完成】


(二)在原始檔裡新增一個名為main的cpp檔案(你也可以命名為其他的)



(三)為工程新增包含目錄(include)

在新出現的“屬性管理器”工作區中


【(單擊)Test1】→【(單擊)Debug|Win32】→【(右擊在點選屬性或直接雙擊)Microsoft.Cpp.Win32.user】

在【通用屬性】→【VC++目錄】→【包含目錄】中新增上:

D:\opencv\build\include

D:\opencv\build\include\opencv

D:\opencv\build\include\opencv2

根據opencv的解壓路徑來確定實際路徑

(四)工程庫(lib)目錄的配置

第四步和第三步差不多,是在【通用屬性】→【VC++目錄】→【庫目錄】中新增:

D:\opencv\build\x86\vc12\lib

同樣也是根據opencv的解壓目錄來決定實際的路徑。

不管是32位還是64位作業系統,只需要考慮用Win32編譯器還是x64編譯器。其實配置選擇什麼跟64位還是32位系統沒有直接的關係,而是在於在編譯程式時是使用那個編譯器。編譯器選的是Win32,就用x86;編譯器選的是x64,就用x64。不過一般情況下,都是用的Win32的x86編譯器。所以,無論32還是64位作業系統,配置檔案最好都選擇x86版的。

注:這裡的vc12規則和之前提到的是一樣的

(五)連結庫的配置

前面和第三步前半部分一樣,後面:

【通用屬性】→【連結器】→【輸入】→【附加的依賴項】

新增如下249版本的lib(這樣的lib順序是:19個帶d的debug版的lib寫在前面,19個不帶d的release版的lib寫在後面,即優先支援debug模式的編譯執行):

opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
opencv_objdetect249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_nonfree249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_videostab249.lib
opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.libopencv_ml249.lib

注:對於2.4.9及以下的版本的庫,不同的庫只需改變.lib檔案中對應的數字即可。對於3.版本的庫,只需新增

opencv_ts300d.lib

opencv_world300d.lib 

opencv_ts300.lib

opencv_world300.lib          即可

另外注意:按照如上的這種方式來配置,也許會出現debug下可以執行但是release下不能執行的情況(因為字串讀取問題引起的諸如圖片載入不了,報指標越界,記憶體錯誤等等)

解決方案:想在release模式下執行出程式結果,在工程的release模式下,將不帶d的lib(全部是19個)新增到【專案】->【屬性】(注意這樣開啟的是當前工程的屬性頁,我們只需在這裡將release版(即不帶d)的相關lib新增進去)->【配置屬性】->【連結器】->【輸入】->【附加的依賴項】下即可

不過一般debug模式下就能完成所需要的執行結果,所以我是按照如上的方式來進行配置的。

(六)在Windows資料夾下加入OpenCV動態連結庫

如果環境變數配置得準確,且配置之後經過重啟,就沒有進行這步配置的必要了。即做完上面第五步的配置,重啟一次,就可以直接跳到第七步進行測試,看是否配置成功。如果不想重啟而馬上檢視是否配置成功,就需要進行這步的配置。

將D:\opencv\build\x86\vc12\bin目錄下的所有動態連結庫複製貼上到C:\Windows\System32資料夾(對應的目錄根據opencv解壓路徑和vs的版本決定)。對於Windows8系統,要放置在SysWOW64資料夾下。

(七)最終測試

#include<opencv2\opencv.hpp>
using namespace cv;

int main(){
	//【1】讀入一張圖片
	Mat img = imread("1.jpg");
	//【2】在視窗中顯示載入的圖片
	imshow("【載入的圖片】", img);
	//【3】等待3000ms後窗口自動關閉
	waitKey(3000);
}

要將“1.jpg”檔案放在D:\University\New\Test1\Test1資料夾中,即和main.cpp在同一個資料夾中。

點選【本地Windows偵錯程式】執行檔案,就會出現以下結果:


最後來一個小番外——呼叫攝像頭採集影象(這個以後還會講,但是大家這次可以自己玩一下)

依舊是先建立一個Win32控制檯應用程式的空專案,在原始檔裡新增main.cpp檔案,程式碼如下:

#include<opencv2\opencv.hpp>
using namespace cv;

int main(){
	//【1】從攝像頭讀入視訊
	VideoCapture capture(0);
	//【2】迴圈顯示每一幀
	while (1){
		Mat frame; //定義一個Mat變數,用於儲存每一幀的影象
		capture >> frame; //讀取當前幀
		imshow("攝像頭", frame); //顯示當前幀
		waitKey(30); //延時30ms
	}
	return 0;
}