基于CMake構建MSVC_CUDA及MinGW編譯環境下的的OpenCV項目

前言

第一次搭建OpenCV開發環境的時候各種報錯,內心那個煩啊,簡直了。當時只能針對某個特定的錯誤去尋找特定的解決方法,在OpenCV構建過程中出現最多的問題就是各個模塊文件的下載問題,本質上這類問題的解決思路都是一樣的,奈何我裝完了才意識到。

文件下載

構建OpenCV的源碼編譯環境除了基本的編譯環境外還需要下面幾個東西:

  • CUDA工具包
  • cuDNN庫
  • opencv源碼
  • opencv_contrib源碼,注意下載版本需要與opencv的版本保持一致
  • opencv_3rdparty源碼
  • CMake

NVIDIA的網頁瀏覽有點慢,但是下載速度還可以,cuDNN下載需要注冊NVIDIA的會員。OpenCV的下載速度就比較鬧心了,從github拉取賊慢,但是可以使用油猴安裝github的腳本提高拉取速度,也可以在碼云里面搜索合適的鏡像拉取。CUDA的安裝就不寫了,cuDNN的安裝是將下載的文件解壓到CUDA的安裝目下,例如我的CUDA的安裝目錄是 D:\NVIDIA GPU Computing Toolkit\CUDA\v11.1 ,cuDNN解壓的目錄也是這個。

想省事的可以直接使用我打包好的 opencv-4.5.1,這個壓縮包已經解決了我所遇到的所有關于下載錯誤的問題,應該可以直接配置,如果出現其他錯誤就自行搜索解決方法。
其他幾個包:
opencv_contrib-4.5.1
opencv_3rdparty_part1
opencv_3rdparty_part2

配置MSVC和CUDA編譯環境下的OpenCV項目

步驟一

注意這個目錄結構,后面會頻繁的在這幾個目錄中切換,容易搞混。我測試的目錄是 F:/Desktop/test,在這個目錄下面有三個opencv相關的源碼。

友情提示一下,在準備自己的目錄結構之前,保證至少有30G左右的硬盤空間,如果你打算同時編譯Debug和Release版本的,要多大的空間,你懂的😏。我有一次辛辛苦苦編譯了好幾個小時到快結束的時候失敗了,這都是血淚史啊😂。

運行 CMake 后首先設置 opencv 的源碼目錄;然后設置構建目錄;勾選分組以便查看構建選項;如果沒有提前創建構建目錄,那么在 Configure 時CMake會詢問是否創建目錄;隨后就是設置編譯環境的相關配置,根據你自己需要進行設置即可,最后點擊 Finish 進行初次配置。

OpenCV_1.png

初次配置過程中通常都會出現錯誤,第一個錯誤就是 Python 版本問題,這個錯誤不用管,后面配置時會自動得到修正。

OpenCV_2.png

步驟二(重要)

然后就是比較常見的 ippicv 和 FFmpeg 文件下載錯誤,這類錯誤基本占據了整個 OpenCV 構建過程中的一半,幸運的是這類錯誤解決思路是一致的,掌握這個解決思路以后安裝就會非常容易。ippicv 的操作過程忘記截圖了,我就以 FFmpeg 的修改作為例子簡單說明。

CMake-GUI錯誤信息解讀

首先看看 CMake 給出的錯誤信息,這里給出了幾個比較關鍵的信息:

  1. 是哪一個文件下載失敗了;
  2. 去哪兒看下載錯誤的日志; (ps:正確的位置是CMake剛開始配置的build目錄下,下面的截圖是之前測試的,名稱不對。)
  3. 最后調用錯誤的位置。

OpenCV_3.png

下面是FFmpeg的另外兩個錯誤,錯誤都是類似的。

OpenCV_4.png

OpenCV_5.png

下載錯誤日志解讀

下載錯誤日志的位置去哪兒找在前面已經提過了,找到后可以看到具體的錯誤操作。每一個文件下載錯誤都有三個關鍵的地方:

  1. 錯誤的文件名;
  2. 錯誤文件的MD5校驗值;
  3. 下載文件存放在什么位置;從圖里面可以看出,存放的位置其實就是在opencv源碼目錄中新建了一個 .cache 目錄,然后將下載的文件存放在所屬模塊目錄下,而文件名的形式是 “MD5校驗值 - 文件名”;
    OpenCV_6.png

迷之操作(重要)

查詢Git分支號

從CMake-GUI的錯誤信息讀取中,我們看到與FFmpeg相關的三個錯誤調用堆棧最后的位置是 3rdparty/ffmpeg/ffmpeg.cmake:20 ,此時的上層目錄是opencv的源碼目錄。既然知道了位置那就去這個文件看看到底是個什么鬼,看下圖,注意文件所在的位置。這個文件開始有4條關鍵的語句,通過命名我們可以知道第一條語句是Git的分支號;第二條語句是FFmpeg的32位庫文件MD5校驗值;第三條語句是FFmpeg的64位庫文件MD5校驗值;第四條語句是FFmpeg的cmake文件MD5校驗值。

OpenCV_7.png

文件拷貝
  • 首先使用命令行終端進入到已經拉取的opencv_3rdparty目錄下

    • cd /d F:/Desktop/test/opencv_3rdparty/
  • 然后通過Git命令切換分支到上面這個過程查詢的分支號

    • git checkout 6152e132572dfdaa32887eabeb7199bef49b14dc
  • 從下載錯誤的日志中我們已經知道了ffmpeg下載的文件應該存放在什么位置,先將那個存放位置的所有內容刪掉

  • 在切換分支以后的opencv_3rdparty目錄下找到下載錯誤的文件,并將其拷貝到上一個操作中的目錄中

    • OpenCV_8.png
獲取并更新MD5校驗值
  • 從下載錯誤的日志我們還知道,文件名的形式應該是“MD5校驗值-文件名”,因此我們需要先獲取MD5校驗值,然后進行文件的重命名操作。

    • 獲取MD5的可以直接使用命令行,然后手動進行文件重命名

      • certutil.exe -hashfile “文件名” md5
    • 我嫌麻煩,寫了個簡單的Python腳本,這個腳本的功能就是獲取腳本文件所在目錄下的所有文件的MD5校驗值,并進行重命名操作

      • import hashlib
        import osdef TraverseFile():return (file for root, dirs, files in os.walk(".") for file in filesif "RenameFile.py" != file)def RenameFile(files):for file in files:md5 = hashlib.md5()with open(file, "rb") as file_detect:for data in iter(lambda: file_detect.read(8096), b''):md5.update(data)result = md5.hexdigest()with open("md5.txt", "a") as write_result:write_result.write(file + " : " + result + "\n")os.rename(file, result + "-" + file)RenameFile(TraverseFile())
        
  • 知道了MD5校驗值以后還需要回到最終調用錯誤的那個文件(就是獲取Git分支號的文件)中將MD5的校驗值更新一下,這里更新的時候注意別改錯了,否則就會校驗失敗,那么CMake仍然會去下載文件

  • OpenCV_9.png

  • 更新完畢后我們再次執行 configure 操作,可以發現錯誤已經消失。只要后續遇到所有類似下載錯誤都按這個分析過程來處理基本上可以保證解決大部分下載失敗的問題

步驟三

步驟三主要是給OpenCV 配置一些額外的模塊,在搜索框中輸入 “extra”,然后在對應的值中寫入opencv_contrib中modules的路徑,注意CMake的路徑是“/“形式,然后再次進行 configure,過程依然會有錯誤。按照步驟二的操作一步一步解決即可,不過需要注意的是,引入opencv_contrib后調用堆棧最后位置給出的是全路徑,要找Git分支號和更新MD5校驗值需要按照這個路徑查找,而不是opencv的源碼目錄中查找。

OpenCV_10.png

步驟四

步驟四是配置OpenCV的CUDA構建選項,在搜索框中輸入 “CUDA”,將CUDA相關的選項都勾選上,再次重新進行 configure ,如果之前CUDA安裝順利這里應該也非常順利。最后點擊 configure 旁邊的 Generate 生成OpenCV的編譯項目。

OpenCV_11.png

步驟五

步驟5是生成對應編譯環境的OpenCV項目,并對項目編譯生成運行庫。項目生成后我們使用Visual Studio對其進行編譯。找到 CMakeTargets 目錄下的 ALL_BUILD,配置生成的庫為Debug或者Release,然后進行編譯,編譯完成后繼續編譯 INSTALL,然后會在最開始的構建目錄下生成install文件目錄,將這個目錄的內容拷貝到指定的地方,然后添加環境變量就可以使用啦!

2021-01-11_180225.png

配置MinGW編譯環境下的OpenCV項目

配置MinGW編譯環境下的OpenCV項目與MSVC編譯環境類似,主要區別是在步驟一、步驟四以及步驟五。由于在Windows系統下CUDA不支持MinGW的編譯環境,因此沒有步驟四,那么主要區別就是步驟一及步驟五。

步驟一

OpenCV_12.png

步驟五

由于使用MinGW編譯環境,因此在編譯生成運行庫的時候有所不同。

  • 首先命令行進入到構建目錄中

    • cd /d F:/Desktop/test/opencv/build
  • 然后使用 mingw32-make 開始編譯

    • mingw32-make -j8
  • 最后使用 mingw32-make 生成安裝目錄即可

    • mingw32-make install

簡單測試

Visual Studio 2019 - MSVC

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>#ifndef NDEBUG
// Debug
#pragma comment(lib, "opencv_core451d.lib")
#pragma comment(lib, "opencv_imgcodecs451d.lib")
#pragma comment(lib, "opencv_highgui451d.lib")
#else
// Release
#pragma comment(lib, "opencv_core451.lib")
#pragma comment(lib, "opencv_imgcodecs451.lib")
#pragma comment(lib, "opencv_highgui451.lib")
#endif // !NDEBUGint main() {cv::Mat img = cv::imread("cplusplus.png");cv::namedWindow("test", cv::WINDOW_AUTOSIZE);cv::imshow("test", img);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

CLion - MinGW

# CMakeLists.txtcmake_minimum_required(VERSION 3.17)project(Test_OpenCV VERSION 1.0.0 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 14)add_executable(${CMAKE_PROJECT_NAME})
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE D:/OpenCV4.5.1/MinGW_8_x64/include/)
file(GLOB SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)
target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${SRCS})
file(GLOB LIBS D:/OpenCV4.5.1/MinGW_8_x64/x64/mingw/bin/*.dll)
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ${LIBS})
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>int main() {cv::Mat img = cv::imread("cplusplus.png");cv::namedWindow("test", cv::WINDOW_AUTOSIZE);cv::imshow("test", img);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

更新2021-01-13

又發現了新的坑。。。這兩天用python測試了一下opencv,發現無法正確導入包,試了一圈都不行,它也不報什么錯誤信息!!!!!我多試了幾次后發現C盤空間滿了。。😤,分析了一下磁盤才發現它會在C:\Users\用戶名\AppData\Local\CrashDumps下會產生較大的崩潰文件,崩潰一次寫一個文件。后來我發現編譯源碼時INSTALL的日志里面了拷貝了生成的文件到python的庫里面,又想起我之前已經單獨安裝過python版本的opencv了。
OpenCV_13.png
這么來看,應該是文件被覆蓋了導致的崩潰。由于python版本的文件已經被覆蓋,因此需要將原來python版本的opencv徹底卸載掉,卸載掉之后在Visual Studio中執行 “生成INSTALL” 操作,然后應該就好使了。

在找上面的問題時我偶然間發現python版本的opencv的 __init__.py會加載一個相同目錄下的config.py的配置文件,這個配置文件里面其實就是庫的路徑,默認寫的是編譯后Install的目錄,如果你在“生成INSTALL”時沒有修改生成的路徑,那么默認是在編譯目錄下的,這時候如果你把整個文件夾拷走了,那么就會出現錯誤“ImportError: DLL load failed while importing cv2: 找不到指定的模塊”,這時候修改一下路徑就行,同時注意編譯時是Debug版本的opencv,庫的路徑就必須指向Debug版本的路徑。要不是上面的事故,這個地方我估計只有等我刪了編譯后的文件夾我才能發現。。。
OpenCV_14.png
OpenCV_14..png
在VSCode中,發現opencv沒有自動補全,添加自動補全的額外路徑即可,有pylint的波浪線也可以通過下面的配置解決。

    "python.linting.pylintArgs": ["--errors-only  --generated-members=numpy.* ,torch.* ,cv2.* , cv.*"],"python.autoComplete.extraPaths": ["D:/Python3/Lib/site-packages/cv2/python-3.8",],

本文博客地址

歡迎來我的自建博客看看

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256024.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256024.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256024.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OC Autorelease

implementation ViewController - (void)viewDidLoad {[super viewDidLoad];__unsafe_unretained NSObject *obj1 [ViewController getObj];NSLog("%",obj1); // 運行OK__unsafe_unretained NSObject *obj2 [ViewController getObj];NSLog("%",obj2); //…

【opencv】——鋼管計數(霍夫圓變換 + 閾值 + canny)

目錄 方法一:霍夫圓變換 + canny 方法二 閾值 + 尋邊 對圖中的鋼管進行計數 方法一:霍夫圓變換 + canny

svn服務器搭建-SuSE Linux Enterprise Server 11 SP3

svn存儲版本數據也有2種方式&#xff1a;1.bdb&#xff1b;2.fsfs。因為BDB方式在服務器中斷時&#xff0c;有可能鎖住數據&#xff08;搞ldap時就深受其害&#xff0c;沒法根治&#xff09;&#xff0c;所以還是FSFS方式更安全一點&#xff0c;我也選擇這種方式。下載相關軟件…

Swift 2.0初探:值得注意的新特性

轉眼間&#xff0c;Swift已經一歲多了&#xff0c;這門新鮮、語法時尚、類型安全、執行速度更快的語言已經漸漸的深入廣大開發者的心。我同樣也是非常喜愛這門新的編程語言。 今年6月&#xff0c;一年一度的WWDC大會如期而至&#xff0c;在大會上Apple發布了Swift 2.0&#xff…

Android 自定義WebView彈窗及屏蔽彈窗

額&#xff0c;還是那個WebView的問題&#xff0c;內核已換成騰訊X5內核&#xff0c;所以接下來的內容會有一些X5內核的方法。但我們的H5是不能改的&#xff0c;還是只有委屈我們自己。先看看H5自帶的彈窗 這樣子的彈窗在不同的手機上呈現的可能是不同的效果&#xff0c;效果不…

【圖像處理】——Python實現two_pass方法來進行連通域的提取

目錄 一、相關知識 1、two_pass算法思想 2、并查集算法 二、自定義的two_pass算法

C++ 多線程使用future傳遞異常

如果 std::async 調用的函數拋出異常&#xff0c;那么這個異常會被存儲在值的位置&#xff0c;同時 future 變為 ready ,如果調用 get() 會重新拋出存儲的異常。 Note: 標準并沒有指定原來的異常對象是被重新拋出或者拷貝后拋出&#xff0c;不同的編譯器會做不同的選擇。 對于 …

期貨黃金與現貨黃金比較

現貨黃金與期貨黃金是目前市場上最熱門的黃金投資方式&#xff0c;與國內任何的金融投資品相比&#xff0c;都具有一定的優勢。 其實金投網小編覺得現貨黃金與期貨黃金最主要的不同點是這個&#xff1a;期貨黃金做的是國內市場&#xff0c;同股票市場一樣&#xff0c;里面有莊家…

DNS域傳送漏洞

0x00 相關背景介紹 Dns是整個互聯網公司業務的基礎&#xff0c;目前越來越多的互聯網公司開始自己搭建DNS服務器做解析服務&#xff0c;同時由于DNS服務是基礎性服務非常重要&#xff0c;因此很多公司會對DNS服務器進行主備配置而DNS主備之間的數據同步就會用到dns域傳送&#…

封裝之--通過類中公有方法訪問私有成員變量

如何在ClassB中訪問ClassA的私有成員變量&#xff1f;&#xff08;典型的封裝案例&#xff09; 通過在ClassA中定義公有的成員方法&#xff0c;然后&#xff0c;在ClassB中通過ClassA的對象調用ClassA中的公有方法&#xff0c;來訪問ClassA中的私有成員變量。 轉載于:https://w…

匹配物鏡放大倍數與相機像元尺寸

通常來說&#xff0c;相機內部的CCD或者CMOS傳感器上都有感光陣列&#xff0c;由一個一個的感光元件構成&#xff0c;每一個感光元件負責完成光電轉換的過程。簡單理解&#xff0c;一個感光元件可以認為就是一個像素(pixel)或像元(pel)。像元具有一定尺寸&#xff0c;如果像的尺…

2016/11/10 kettle概述

ETL(Extract-Transform-Load&#xff0c;即抽取&#xff0c;轉換&#xff0c;加載)&#xff0c;數據倉庫技術&#xff0c;是用來處理將數據從來源&#xff08;以前做的項目&#xff09;經過抽取&#xff0c;轉換&#xff0c;加載到達目的端&#xff08;正在做的項目&#xff09…

【深度學習】——非極大值抑制(nms/soft-nms)

目錄 一、相關概念 1、iou 1&#xff09;理論計算 2&#xff09;Python代碼&#xff08;代碼參考yolov3模型util.py文件&#xff09; 2、nms 1)基本思路 2&#xff09;標準nms和soft-nms 3&#xff09;Python代碼實現&#xff08;yolov3中util.py文件&#xff0c;增加了…

移動服務安全現狀分析!

2019獨角獸企業重金招聘Python工程師標準>>> 由于Android開源的環境&#xff0c;導致Android的整體環境都存在很多不安全的因素&#xff0c;同時用戶在移動APP客戶端的便捷應用&#xff0c;也給用戶帶來了巨大的安全隱患。未經過移動服務安全加固的APP存在被靜態反編…

封裝不同類模板的隨機數生成器

最近準備刷題&#xff0c;打算簡單封裝下隨機數生成器&#xff0c;方便產生測試數據。C11的STL提供了很多分布類型&#xff0c;我比較常用的是均勻分布&#xff0c;均勻分布的值有兩種類型&#xff0c;一類是整數&#xff0c;另一類是浮點數&#xff0c;STL根據值的類型定義了兩…

Log4j詳細設置說明

1. 動態的改變記錄級別和策略&#xff0c;即修改log4j.properties,不需要重啟Web應用&#xff0c;這需要在web.xml中設置一下。2. 把log文件定在 /WEB-INF/logs/ 而不需要寫絕對路徑。3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ &#xff0c;而不是Class-Pat…

【機器學習】——卷積神經網絡(Keras)修改學習率(定值+自適應)

目錄 1、直接獲取現有模型的學習率 2、打印顯示學習率 3、調整學習率 1&#xff09;1.LearningRateScheduler 2&#xff09;ReduceLROnPlateau 利用tensorflow的Keras模塊我們可以建立我們自己定義的卷積神經網絡模型&#xff0c;但是一般不會觸碰到學習率這個問題&#x…

使用Docker構建你的第一個服務

1. 感受一下Docker的便捷 項目源碼 https://github.com/MoonShining/dockernize-grape-helloworld clone下來以后運行,cd到項目目錄下&#xff0c;運行 docker build -t api-sample . docker run -p 8080:8080 api-sample:latest 復制代碼就可以訪問localhost:8080看到效果了. …

MyEclipse連接MySQL

在官網http://www.mysql.com/downloads/下載數據庫連接驅動 本文中使用驅動版本為mysql-connector-java-5.1.40 一、創建一個java測試項目MySQLConnectorsTest 在項目下穿件一個lib文件夾用來存放MySQL驅動包。 右鍵驅動包build path進行add添加操作&#xff0c;打開Referenced…

在Windows系統中配置Google AddressSanitizer

Google AddressSanitizer簡介 AddressSanitizer (ASan) 是 C 和 C 的內存錯誤檢測軟件&#xff0c;它可以檢測&#xff1a; 釋放指針后繼續使用堆緩沖區溢出棧緩沖區溢出全局緩沖區溢出返回后繼續使用在范圍之外繼續使用初始化順序的bug內存泄漏 在 Windows 系統中&#xff…