在VS2017(VC15)上配置opencv4.0.1環境

在VS2017(VC15)上配置opencv4.0.1環境

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

網上有各式各樣的配置方式,可是大部分都沒說每一步作法的緣由 ,致使opencv版本不大同樣的話,不少人就把全部教程都試個遍,結果還不必定配成功。我我的是很反感這種方式的,因此下文會解釋作每一步的緣由,瞭解了作每一步的必要性後,配置不一樣版本的opencv環境就遊刃有餘了。html

1、下載opencv庫

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

下載Win pack解壓後獲得文件目錄以下:c++

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

2、開始配置環境

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

下面咱們來看用一個外部導入的庫時,須要怎麼配置。markdown

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

配置系統環境變量

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

這個地方須要填絕對路徑,我把我解壓的opencv放在D盤的opencv文件夾下,所以具體路徑仍是要參照你本身文件所在的位置。盲目抄個人路徑通常都會出錯。post

配置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庫的項目時,直接導入這兩個屬性表文件便可。

 

 

3、最終測試

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

圖片以下:

 

代碼以下:

  1. #include<iostream>
  2.  
    #include <opencv2/core/core.hpp>
  3.  
    #include <opencv2/highgui/highgui.hpp>
  4. using namespace cv;
  5.   
  6. int main() 
  7. {
  8.  
    // 讀入一張圖片(小熊貓)
  9.  
    Mat img = imread( "picture.png");
  10.  
    // 建立一個名爲 "小熊貓"窗口
  11.  
    namedWindow( "小熊貓");
  12.  
    // 在窗口中顯示小熊貓
  13.  
    imshow( "小熊貓", img);
  14.  
    // 等待6000 ms後窗口自動關閉
  15.  
    waitKey( 6000);
  16.  
    return 0;
  17.  
    }

把圖片放在項目目錄下,命名爲picture.png,測試運行。

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

 

4、一個小bug

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

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

5、參考文章

https://blog.csdn.net/poem_qianmo/article/details/19809337

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

 

【opencv程序錯誤解決指南】因爲找不到opencv_world401d.dll,沒法繼續執行代碼

  • 問題
    dll找不到
  • 錯誤緣由
    程序引用了.lib文件,卻沒有找到對應的.dll文件,也就是動態連接庫的文件。
    Windows系統有兩種找到動態連接庫文件的方法,①經過C:\Windows路徑下有兩個目錄System32和SysWOW64;②經過系統環境變量中的Path環境變量來尋找。
  • 解決方法
    這裏提供兩種解決這種問題的方法:
    1)(推薦)在電腦的系統變量的Path中添加.dll文件所對應的文件路徑,通常對應的lib文件夾同級目錄的bin目錄。(若是實在找不到,能夠用搜索軟件everything進行查找,而後將路徑添加進Path中);
    2)或者找到C:\Windows路徑下有兩個目錄System32和SysWOW64,找到opencv_world401d.dll,將其分別拷貝到這兩個文件夾下面便可。
  • 注意
    1)有時即便經過上面兩步中的一步設置後了路徑,可是運行時可能仍是顯示找不到,這時咱們將VS重啓一下,通常均可行。2)帶d的.dll是debug模式下須要的,不帶d的.dll是release模式下須要的,用上面2)方法時,咱們須要根據不一樣的模式,將不一樣的.dll文件放到C:\Windows路徑下有兩個目錄System32和SysWOW64下。
相關文章
相關標籤/搜索