基于CMake构建MSVC_CUDA及MinGW编译环境下的的OpenCV项目
前言
第一次搭建OpenCV開發(fā)環(huán)境的時候各種報錯,內(nèi)心那個煩啊,簡直了。當時只能針對某個特定的錯誤去尋找特定的解決方法,在OpenCV構(gòu)建過程中出現(xiàn)最多的問題就是各個模塊文件的下載問題,本質(zhì)上這類問題的解決思路都是一樣的,奈何我裝完了才意識到。
文件下載
構(gòu)建OpenCV的源碼編譯環(huán)境除了基本的編譯環(huán)境外還需要下面幾個東西:
- CUDA工具包
- cuDNN庫
- opencv源碼
- opencv_contrib源碼,注意下載版本需要與opencv的版本保持一致
- opencv_3rdparty源碼
- CMake
NVIDIA的網(wǎng)頁瀏覽有點慢,但是下載速度還可以,cuDNN下載需要注冊NVIDIA的會員。OpenCV的下載速度就比較鬧心了,從github拉取賊慢,但是可以使用油猴安裝github的腳本提高拉取速度,也可以在碼云里面搜索合適的鏡像拉取。CUDA的安裝就不寫了,cuDNN的安裝是將下載的文件解壓到CUDA的安裝目下,例如我的CUDA的安裝目錄是 D:\NVIDIA GPU Computing Toolkit\CUDA\v11.1 ,cuDNN解壓的目錄也是這個。
想省事的可以直接使用我打包好的 opencv-4.5.1,這個壓縮包已經(jīng)解決了我所遇到的所有關于下載錯誤的問題,應該可以直接配置,如果出現(xiàn)其他錯誤就自行搜索解決方法。
其他幾個包:
opencv_contrib-4.5.1
opencv_3rdparty_part1
opencv_3rdparty_part2
配置MSVC和CUDA編譯環(huán)境下的OpenCV項目
步驟一
注意這個目錄結(jié)構(gòu),后面會頻繁的在這幾個目錄中切換,容易搞混。我測試的目錄是 F:/Desktop/test,在這個目錄下面有三個opencv相關的源碼。
友情提示一下,在準備自己的目錄結(jié)構(gòu)之前,保證至少有30G左右的硬盤空間,如果你打算同時編譯Debug和Release版本的,要多大的空間,你懂的😏。我有一次辛辛苦苦編譯了好幾個小時到快結(jié)束的時候失敗了,這都是血淚史啊😂。運行 CMake 后首先設置 opencv 的源碼目錄;然后設置構(gòu)建目錄;勾選分組以便查看構(gòu)建選項;如果沒有提前創(chuàng)建構(gòu)建目錄,那么在 Configure 時CMake會詢問是否創(chuàng)建目錄;隨后就是設置編譯環(huán)境的相關配置,根據(jù)你自己需要進行設置即可,最后點擊 Finish 進行初次配置。
初次配置過程中通常都會出現(xiàn)錯誤,第一個錯誤就是 Python 版本問題,這個錯誤不用管,后面配置時會自動得到修正。
步驟二(重要)
然后就是比較常見的 ippicv 和 FFmpeg 文件下載錯誤,這類錯誤基本占據(jù)了整個 OpenCV 構(gòu)建過程中的一半,幸運的是這類錯誤解決思路是一致的,掌握這個解決思路以后安裝就會非常容易。ippicv 的操作過程忘記截圖了,我就以 FFmpeg 的修改作為例子簡單說明。
CMake-GUI錯誤信息解讀
首先看看 CMake 給出的錯誤信息,這里給出了幾個比較關鍵的信息:
下面是FFmpeg的另外兩個錯誤,錯誤都是類似的。
下載錯誤日志解讀
下載錯誤日志的位置去哪兒找在前面已經(jīng)提過了,找到后可以看到具體的錯誤操作。每一個文件下載錯誤都有三個關鍵的地方:
迷之操作(重要)
查詢Git分支號
從CMake-GUI的錯誤信息讀取中,我們看到與FFmpeg相關的三個錯誤調(diào)用堆棧最后的位置是 3rdparty/ffmpeg/ffmpeg.cmake:20 ,此時的上層目錄是opencv的源碼目錄。既然知道了位置那就去這個文件看看到底是個什么鬼,看下圖,注意文件所在的位置。這個文件開始有4條關鍵的語句,通過命名我們可以知道第一條語句是Git的分支號;第二條語句是FFmpeg的32位庫文件MD5校驗值;第三條語句是FFmpeg的64位庫文件MD5校驗值;第四條語句是FFmpeg的cmake文件MD5校驗值。
文件拷貝
-
首先使用命令行終端進入到已經(jīng)拉取的opencv_3rdparty目錄下
- cd /d F:/Desktop/test/opencv_3rdparty/
-
然后通過Git命令切換分支到上面這個過程查詢的分支號
- git checkout 6152e132572dfdaa32887eabeb7199bef49b14dc
-
從下載錯誤的日志中我們已經(jīng)知道了ffmpeg下載的文件應該存放在什么位置,先將那個存放位置的所有內(nèi)容刪掉
-
在切換分支以后的opencv_3rdparty目錄下找到下載錯誤的文件,并將其拷貝到上一個操作中的目錄中
獲取并更新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校驗值以后還需要回到最終調(diào)用錯誤的那個文件(就是獲取Git分支號的文件)中將MD5的校驗值更新一下,這里更新的時候注意別改錯了,否則就會校驗失敗,那么CMake仍然會去下載文件
-
更新完畢后我們再次執(zhí)行 configure 操作,可以發(fā)現(xiàn)錯誤已經(jīng)消失。只要后續(xù)遇到所有類似下載錯誤都按這個分析過程來處理基本上可以保證解決大部分下載失敗的問題
步驟三
步驟三主要是給OpenCV 配置一些額外的模塊,在搜索框中輸入 “extra”,然后在對應的值中寫入opencv_contrib中modules的路徑,注意CMake的路徑是“/“形式,然后再次進行 configure,過程依然會有錯誤。按照步驟二的操作一步一步解決即可,不過需要注意的是,引入opencv_contrib后調(diào)用堆棧最后位置給出的是全路徑,要找Git分支號和更新MD5校驗值需要按照這個路徑查找,而不是opencv的源碼目錄中查找。
步驟四
步驟四是配置OpenCV的CUDA構(gòu)建選項,在搜索框中輸入 “CUDA”,將CUDA相關的選項都勾選上,再次重新進行 configure ,如果之前CUDA安裝順利這里應該也非常順利。最后點擊 configure 旁邊的 Generate 生成OpenCV的編譯項目。
步驟五
步驟5是生成對應編譯環(huán)境的OpenCV項目,并對項目編譯生成運行庫。項目生成后我們使用Visual Studio對其進行編譯。找到 CMakeTargets 目錄下的 ALL_BUILD,配置生成的庫為Debug或者Release,然后進行編譯,編譯完成后繼續(xù)編譯 INSTALL,然后會在最開始的構(gòu)建目錄下生成install文件目錄,將這個目錄的內(nèi)容拷貝到指定的地方,然后添加環(huán)境變量就可以使用啦!
配置MinGW編譯環(huán)境下的OpenCV項目
配置MinGW編譯環(huán)境下的OpenCV項目與MSVC編譯環(huán)境類似,主要區(qū)別是在步驟一、步驟四以及步驟五。由于在Windows系統(tǒng)下CUDA不支持MinGW的編譯環(huán)境,因此沒有步驟四,那么主要區(qū)別就是步驟一及步驟五。
步驟一
步驟五
由于使用MinGW編譯環(huán)境,因此在編譯生成運行庫的時候有所不同。
-
首先命令行進入到構(gòu)建目錄中
- 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
又發(fā)現(xiàn)了新的坑。。。這兩天用python測試了一下opencv,發(fā)現(xiàn)無法正確導入包,試了一圈都不行,它也不報什么錯誤信息!!!!!我多試了幾次后發(fā)現(xiàn)C盤空間滿了。。😤,分析了一下磁盤才發(fā)現(xiàn)它會在C:\Users\用戶名\AppData\Local\CrashDumps下會產(chǎn)生較大的崩潰文件,崩潰一次寫一個文件。后來我發(fā)現(xiàn)編譯源碼時INSTALL的日志里面了拷貝了生成的文件到python的庫里面,又想起我之前已經(jīng)單獨安裝過python版本的opencv了。
這么來看,應該是文件被覆蓋了導致的崩潰。由于python版本的文件已經(jīng)被覆蓋,因此需要將原來python版本的opencv徹底卸載掉,卸載掉之后在Visual Studio中執(zhí)行 “生成INSTALL” 操作,然后應該就好使了。
在找上面的問題時我偶然間發(fā)現(xiàn)python版本的opencv的 __init__.py會加載一個相同目錄下的config.py的配置文件,這個配置文件里面其實就是庫的路徑,默認寫的是編譯后Install的目錄,如果你在“生成INSTALL”時沒有修改生成的路徑,那么默認是在編譯目錄下的,這時候如果你把整個文件夾拷走了,那么就會出現(xiàn)錯誤“ImportError: DLL load failed while importing cv2: 找不到指定的模塊”,這時候修改一下路徑就行,同時注意編譯時是Debug版本的opencv,庫的路徑就必須指向Debug版本的路徑。要不是上面的事故,這個地方我估計只有等我刪了編譯后的文件夾我才能發(fā)現(xiàn)。。。
在VSCode中,發(fā)現(xiàn)opencv沒有自動補全,添加自動補全的額外路徑即可,有pylint的波浪線也可以通過下面的配置解決。
本文博客地址
歡迎來我的自建博客看看
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的基于CMake构建MSVC_CUDA及MinGW编译环境下的的OpenCV项目的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试金士顿固态硬盘软件,金士顿固态硬盘优
- 下一篇: Chrome的历史版本下载