1. 程式人生 > >VS2017開發C++學習(三)OpenCV的配置方法

VS2017開發C++學習(三)OpenCV的配置方法

我們 文件路徑 源碼 stack bug 不同版本 整合 imread evc

作為萌新最初聽說到opencv,以為是一個集成開發環境IDE。後來因為畢設原因不得不去使用opencv,才了解到OpenCV是一個廣受歡迎的開源計算機視覺庫 ,它提供了很多函數,實現很多計算機視覺算法,從最基本的濾波到高級物體檢測皆有涵蓋。換言之,opencv只不過是一個寫好的庫,方便在編程的時候對視覺數據進行處理。

網上有各式各樣的配置方式,但是大部分都沒說每一步做法的原因 ,導致opencv版本不大一樣的話,很多人就把所有教程都試個遍,結果還不一定配成功。我個人是很反感這種方式的,所以下文會解釋做每一步的原因,了解了做每一步的必要性後,配置不同版本的opencv環境就遊刃有余了。

一、下載opencv庫


百度搜一下就能找到官網https://opencv.org/,在releases選項頁找到下載的地方。Documentation是程序相關說明文檔,Sources是opencv的源碼,Win pack與Sources的區別是,Win pack不僅包含了源碼,還包含了利用源碼編譯後的庫。

技術分享圖片

下載Win pack解壓後得到文件目錄如下:

技術分享圖片

sources文件夾下的是源碼,配置環境的話是用不上的,有用的是源碼經過編譯後的庫,位於build文件夾下。

二、開始配置環境
官方只提供了部分語言環境的編譯庫,一開始我是想著在devc++上配來著,畢竟devc++輕量一點,操作起來也方便簡單一點。後來發現官方根本沒有提供這個編譯庫,需要自己用cmake拿源碼來編譯,查了下好像有點麻煩,索性在VS2017下配算了,官方在opencv4.0.1有提供VS2017(VC15)的編譯庫,而且只提供了64位版的。

下面我們來看用一個外部導入的庫時,需要怎麽配置。

以C++為例,編譯時需要用到庫的頭文件(用於include),一般是.h之類的文件;鏈接時用到靜態鏈接庫(.lib),運行時用到動態鏈接庫(.dll或.exe之類)。通俗地說,靜態鏈接庫編譯後會整合到程序中,而動態鏈接庫不會整合到程序中。動態鏈接庫更像是給運行提供環境,就像平時裝遊戲時可能要先裝什麽VC、DX之類環境軟件才能玩。

配置系統環境變量
正如前面所說,動態鏈接庫是為運行時提供環境,所以程序在運行時怎麽知道動態鏈接庫在什麽位置呢。因此我們需要將動態鏈接庫的位置告訴操作系統,方法就是設置系統變量。動態鏈接庫位於build\x64\vc15\bin文件夾下(bin是指二進制文件,說明已經是一個相對獨立的程序),於是我們在此電腦屬性->高級系統屬性->環境變量->系統變量Path下增加上述路徑。

技術分享圖片

技術分享圖片

技術分享圖片

這個地方需要填絕對路徑,我把我解壓的opencv放在D盤的opencv文件夾下,因此具體路徑還是要參照你自己文件所在的位置。盲目抄我的路徑一般都會出錯。

配置VS2017環境
配置編譯環境無非是讓編譯器能找到引用頭文件以及相關的靜態鏈接庫,引用頭文件在build\include\opencv2文件夾下,靜態鏈接庫在build\x64\vc15\lib文件夾下,下面所配置的路徑都是基於這兩個路徑。

考慮到不同的工程、項目等可能會用到不同的庫,VS2017已經將工具=》選項=》項目和解決方案下的全局VC++目錄改成了屬性頁,每個project項目可以有自己的屬性頁,甚至各個模式下都可以有自己的屬性頁。點擊 視圖=》其他窗口=》屬性管理器 打開屬性管理器,可以看到如下:

技術分享圖片

在這裏,我的配置方式與網上其他文章所介紹的不太一致。他們的方法是雙擊Microsoft.Cpp.x64.user這一個屬性頁去修改,這樣就可以一勞永逸,以後都不用再配環境。按照他們的方法配置出現的一個問題就是會導致release模式或debug模式下報異常,導致程序無法正常執行,如下:

技術分享圖片

其原因是附加依賴項中,他們把帶d後綴和不帶d後綴的.lib靜態鏈接庫寫在了一起,帶d是屬於debug模式下要使用靜態鏈接庫,不帶d的是release模式下要使用的靜態鏈接庫。VS只會取寫在前面的靜態鏈接庫,因此會導致debug或release模式之一不可用(取決於你把哪個寫在前面)。查閱了很多博客以及stack overflow的很多回答,回答基本上都是說這是opencv的一個BUG,其實我個人感覺更像是VS的一個BUG。

另一方面,Microsoft.Cpp.x64.user實際上是位於C:\Users\Admin\AppData\Local\Microsoft\MSBuild\v4.0\下的一個屬性頁文件,所有項目都會默認使用他,這不太符合項目獨立性的設計初衷。

下面是我的一個配置方法。

在Debug | x64處右擊新建一個新的屬性表opencv_property401d_x64(名字隨便起),雙擊新建的屬性表,開始配置包含文件和靜態鏈接庫。

技術分享圖片

技術分享圖片

在包含目錄處配置包含的頭文件路徑:

技術分享圖片

在庫目錄處配置靜態鏈接庫位置:

技術分享圖片

配置附加依賴項:

技術分享圖片

技術分享圖片

特別說明一下,在配置附加依賴項時需要先查看,靜態鏈接庫文件夾下有什麽文件,如我的opencv4.0.1靜態鏈接庫文件夾D:\opencv\build\x64\vc15\lib下有如下文件。

技術分享圖片

我們只關註.lib文件,帶d結尾的是用於debug模式的靜態鏈接庫,不帶d結尾的是用於release模式的靜態鏈接庫,4.0.1版本比較簡潔只剩兩個.lib文件了,老版2代左右的opencv有一大堆靜態鏈接庫,所以在附加依賴項處要寫一大堆。因為我們這裏配置的是Debug | x64的屬性表,所以我們只把帶d結尾的.lib文件寫進去。總而言之,此處附加依賴項填寫靜態依賴庫文件夾下所有帶d結尾的.lib文件路徑,靜態依賴庫文件夾在4.0.1版本是build\x64\vc15\lib,具體路徑可能會因版本而異。

再次說明,上面所填的所有具體的絕對路徑一定要根據自己電腦上相關文件的路徑去寫,不要盲目抄我的。

最後,在Release | x64處右擊新建一個新的屬性表opencv_property401_x64,雙擊新建的屬性表,配置方法與上面一致,唯一的區別在於,附加依賴項中填寫的是所有不帶d結尾的.lib文件路徑。

技術分享圖片

技術分享圖片

配置完成後的屬性表結構如下:

技術分享圖片

這些屬性結構表將會應用於其對應的模式,opencv_property401_x64用於release的64位模式,opencv_property401d_x64用於debug的32位模式,因為沒有官方提供32位模式的,所以32位下沒有對屬性頁進行設置,因此也不能使用32位模式進行編譯。

每種模式的屬性表工作方式類似於CSS中的層疊方式,雙擊項目或Debug | x64之類的也可以進行屬性設置,但這類屬性頁是存儲於項目的工程文件中的,不是獨立的屬性表文件。上述配置完成後的opencv_property401_x64和opencv_property401d_x64是外部的獨立屬性表文件,建議進行備份保存,以後遇到需要使用opencv庫的項目時,直接導入這兩個屬性表文件即可。

三、最終測試
簡單寫一個顯示圖片的C++程序進行配置測試。

圖片如下:

技術分享圖片

代碼如下:

#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


using namespace cv;


int main()
{
// 讀入一張圖片(小熊貓)
Mat img = imread("picture.png");
// 創建一個名為 "小熊貓"窗口
namedWindow("小熊貓");
// 在窗口中顯示小熊貓
imshow("小熊貓", img);
// 等待6000 ms後窗口自動關閉
waitKey(6000);
return 0;
}
把圖片放在項目目錄下,命名為picture.png,測試運行。

技術分享圖片

註意debug x64模式和release x64模式都測試下,確保沒有問題。

四、一個小bug
在我測試的時候遇到過報這樣一個異常。

一開始還以為是配環境出了問題,最後發現把我的搜狗輸入法切換成系統默認輸入法這個問題就解決了。這個輸入法已經在我的程序生涯坑了我不止一次了,我也在想為毛我還沒卸這個輸入法。

五、參考文章
https://blog.csdn.net/poem_qianmo/article/details/19809337

http://www.opencv.org.cn/forum.php?mod=viewthread&tid=33549


原文:https://blog.csdn.net/goldenbullet/article/details/86016921

VS2017開發C++學習(三)OpenCV的配置方法