opencv+opencv_contrib+cuda和VS2022編譯

本文介紹使用OpenCV和OpenCV_Contrib源碼及Cuda進行編譯的過程,編譯過程中會用到OpenCV、OpenCV_Contrib、Toolkit、Cmake、VS2022等工具,最終編譯OpenCV的Cuda版本。

一、OpenCV下載地址

OpenCV官網下載地址:https://opencv.org/releases/#,選擇一個版本下載,下載之后解壓或者提取;

OpenCV Gihthub下載地址:https://github.com/opencv/opencv;也可以在Github選擇一個版本下載,下載之后解壓;

在這里插入圖片描述在這里插入圖片描述
注:從官網使用下載器下載的OpenCV解壓后會多一個build文件夾,是已經編譯的opencv文件,直接從Github下載的沒有這個文件夾,因為需要自己編譯Cuda版本的opencv,所以不會用到這個build文件夾,有沒有都不影響;
在這里插入圖片描述

圖中左側opencv4.11.0文件夾就是右側的sources文件夾(下圖)
在這里插入圖片描述

二、OpenCV_contrib下載地址

OpenCV Gihthub下載地址:https://github.com/opencv/opencv_contrib,和下載OpenCV相同的方式進行下載,注意OpenCV_contrib的版本要與下載的OpenCV的版本一致。下載后解壓;
在這里插入圖片描述

下圖中的cuda開頭的文件夾就是與cuda相關的文件,
在這里插入圖片描述

三、Cmake下載

下載Cmake:https://cmake.org/download/,我使用的Cmake4.0.1;

四、Cuda Toolkit下載

1.查看CUDA最高支持版本

在命令窗口中使用nvidia-smi查看電腦的顯卡支持的CUDA Toolkit版本(如果nvidia-smi不可用,可能是命令行輸錯了或者沒安裝顯卡驅動,檢查命令行或者下載驅動:https://www.nvidia.cn/drivers/lookup/),下圖中CUDA Version12.6代表最高支持CUDA Toolkit12.6的版本;
在這里插入圖片描述

2.下載CudaToolkit

下載地址:https://developer.nvidia.com/cuda-downloads,下載完成后,進行安裝,安裝后
在C:\Program Files會有NVIDIA GPU Computing Toolkit文件夾;
在這里插入圖片描述

3.環境變量配置

安裝完成后,系統環境變量中會有以下兩個路徑;
在這里插入圖片描述
在環境變量Path中,需要添加以下路徑(前兩個是安裝后自動添加的,所以只需要添加最后一個x64的路徑就行):
在這里插入圖片描述

4.檢查CUDA Toolkit版本

在命令窗口輸入 nvcc -V(中間有空格)會顯示電腦安裝的CUDA Toolkit的版本號;
在這里插入圖片描述

五、cuDNN下載

下載地址:https://developer.nvidia.com/cudnn,下載完成后,將其中的bin文件,lib文件夾,include文件夾,三個文件夾中的文件復制到對應的cuda文件夾中,即C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2文件夾的對應目錄中(v12.2是CUDA的版本號,我下載的是12.2),如果不使用cuDNN可以跳過此步驟;
在這里插入圖片描述

六、編譯

1.opencv編譯

1.打開Cmake,首先編譯opencv,選擇Opencv源碼文件夾,之后選擇新的build文件夾,如下圖新建一個build文件夾,我的build文件夾名字為cudaopencv1:
在這里插入圖片描述

點擊左下角的Configure,會彈出以下界面,選擇generator,我的需要使用的VS2022,所以我選擇的是Visual Studio 17 2022(根據自己的需求選擇),之后點擊Finish:
在這里插入圖片描述
2.Configure完成后會有以下界面,Configure過程中會顯示warning,提示你版本cmake版本要求或者文件未找到,可以一個一個查看,不是自己需編譯的文件就不用管(也可以直接取消勾選,不進行編譯);
在這里插入圖片描述

3.點擊Generate,下方會顯示Generating done.
在這里插入圖片描述

4.至此build文件夾(我的build文件夾名為cudaopencv1)中會出現以下文件:
在這里插入圖片描述

2.OpenCV生成

1.雙擊打開生成的OpenCV.sln,
在這里插入圖片描述

2.在VS中設置編譯環境Debug或者Release,之后在解決方案管理器中找打CmakeTargerts,右鍵點擊其中的ALL_BUILD,點擊生成;
在這里插入圖片描述
3.在自己的build文件夾中會生成lib文件夾,如下所示
在這里插入圖片描述

lib文件夾中的內容是剛剛生成的文件,如果是在Debug模式下生成就會有Debug文件夾,如果是Release模式就會有Release文件夾,兩種模式都生成,兩個文件夾都有;
在這里插入圖片描述

文件夾中是生成的庫文件:
在這里插入圖片描述

3.編譯contrib及CUDA

1.在Cmake中找到OPENCV_EXTRA_MODULES_PATH,設置文件夾為opencv_contrib文件中的modules文件夾路徑,我的opencv_contrib路徑為:D:/OpenCV4.11/opencv_contrib-4.11.0/modules,如下圖:
在這里插入圖片描述

2.在cmake的search中輸入cuda,設置BUILD中的BUILD_CUDA_STUBS為勾選狀態,設置WITH中的WITH_CUDA為勾選狀態;
在這里插入圖片描述

3.設置完成后,點擊下方的Configure,最下方顯示Configuring done.
在這里插入圖片描述
4.完成Generate之后設置顯卡算力參數,在Cmake的Search中搜索ARCH,設置CUDA_ARCH_BIN參數為自己的顯卡算力,我的顯卡算力為8.6,具體自己的顯卡算力可以在Nvidia網站查詢:https://developer.nvidia.com/cuda-gpus;
在這里插入圖片描述

注意:在未點擊Generate時搜索不到這個參數,完成一次Generate后才可以搜到這個參數,如果不設置這個參數會導致后邊的cudaopencv編譯失敗;

5.設置CUDA_FAST_MATH為勾選狀態:
在這里插入圖片描述
點擊Configure,顯示Configuring done后,點擊Generate,Generating done

6.檢查是否編譯成功
a.在Camke的白色區域中,Build中會顯示以下目錄:
在這里插入圖片描述
b.在自己的build文件夾中的modules文件夾中(我的build文件夾名字為cudaopencv1),會有以下文件,
在這里插入圖片描述

至此opencv cuda版本的build完成。

4.使用VS進行生成

打開build文件夾(cudaopencv1),找到OpenCV.sln,雙擊打開;
在這里插入圖片描述

在CmakeTargets中找到ALL_BUILD,右鍵點擊生成(此過程比較長,我用了18分鐘),
在這里插入圖片描述
在這里插入圖片描述

生成完成后,查看自己的build文件夾的lib文件夾,發現與之前相比會多出contrib中的內容
在這里插入圖片描述
之后點擊INSTALL中的僅用于項目僅生成INSTALL,點擊后會在build文件夾中生成一個install文件夾,文件夾中的內容就是編譯的全部內容。
在這里插入圖片描述
在這里插入圖片描述
install文件夾中的內容:
在這里插入圖片描述
這里邊都是debug模式下編譯的庫文件,如果需要release模式,在ALL_BUILD生成時,在VS中選擇Release,然后再生成INSTALL。

至此,opencv +contrib+cuda編譯全部完成。

七、配置及使用

1.配置環境變量

在此電腦->屬性->高級系統設置->環境變量->系統變量->Path中增加編譯的bin文件夾;
在這里插入圖片描述

2.配置項目屬性

首先配置項目包含目錄,在包含目錄中添加:D:\OpenCV4.11\cudaopencv1\install\include 和 D:\OpenCV4.11\cudaopencv1\install\include\opencv2;
在這里插入圖片描述
在庫目錄中,配置D:\OpenCV4.11\cudaopencv1\install\x64\vc17\lib
在這里插入圖片描述
在鏈接器->輸入->附加依賴項中,加入build文件夾中所有lib文件名稱,文件名很多,所以可以使用命令行一次性全部轉換為文本,然后直接復制(詳見3.獲取所有lib文件名稱
在這里插入圖片描述

3.獲取所有lib文件名稱

在命令窗口中輸入:dir /b “文件路徑”>生成的文本路徑;
例如以下截圖,會將lib文件夾中的所有文件名字存放到C盤的name文本中;
在這里插入圖片描述

4.驗證是否可用

使用以下代碼可以獲取編譯信息及電腦的GPU數量,則可以正常使用;

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/cudafilters.hpp>
#include <opencv2/cudaimgproc.hpp>
int main() 
{std::cout << "OpenCV built with CUDA: " << cv::getBuildInformation() << std::endl;//獲取編譯信息,如下圖int num_devices = cv::cuda::getCudaEnabledDeviceCount();std::cout << "Number of CUDA devices: " << num_devices << std::endl;return 0;
}

在這里插入圖片描述
如果編譯正常,使用getBuildInformation()函數可以看到NVIDIA CDUA的狀態為YES,而且可以看到顯卡的計算能力;
使用cuda::getCudaEnabledDeviceCount()可以獲取到電腦的顯卡數量(如下圖,電腦只有一個顯卡,獲取的結果也是1);
在這里插入圖片描述

八、匯總

使用的編譯工具及版本如下,如果有需要編譯完成的文件,可以在評論區留下郵箱;
在這里插入圖片描述

九、編譯過程中可能遇到的問題

1.所有步驟均按照以上過程操作,但是在VS生成過程中,顯示:

27>D:\OpenCV4.5.5\opencv\sources\modules\core\include\opencv2/core/cuda/common.hpp(99,27): error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int (編譯源文件D:\OpenCV4.5.5\opencv\cudaopencv\modules\core\arithm.sse4_1.cpp)

產生這個問題大概率是由于cuda版本與opencv版本的兼容問題,我最開始使用OpenCV4.5.5和CUDA 12.2版本,出現這個問題,后來換成OpenCV4.11和CUDA12.2,編譯成功

2.在Cmake過程中出現以下錯誤,顯示:

CMake Error at cmake/OpenCVDetectCUDAUtils.cmake:297 (list):
list GET given empty list
Call Stack (most recent call first):
cmake/OpenCVDetectCUDA.cmake:76 (ocv_set_cuda_arch_bin_and_ptx)
cmake/OpenCVFindLibsPerf.cmake:46 (include)
CMakeLists.txt:800 (include)

cmake檢測CUDA架構時未能正確識別電腦GPU的計算能力,如果出現這個問題,在cmake中設置CUDA_ARCH_BIN的值,GPU計算能力查詢https://developer.nvidia.com/cuda-gpus

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

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

相關文章

spring中的@ConfigurationProperties注解詳解

一、核心功能與作用 ConfigurationProperties 是Spring Boot中用于將外部配置&#xff08;如application.properties或application.yml中的屬性&#xff09;綁定到Java對象的核心注解。其核心功能包括&#xff1a; 配置集中管理&#xff1a;將分散的配置屬性按前綴綁定到Java類…

【C/C++】函數模板

&#x1f3af; C 學習筆記&#xff1a;函數模板&#xff08;Function Template&#xff09; 本文是面向 C 初學者的函數模板學習筆記&#xff0c;內容包括基本概念、定義與使用、實例化過程、注意事項等&#xff0c;附帶示例代碼&#xff0c;便于理解與復現。 &#x1f4cc; 一…

電子病歷高質量語料庫構建方法與架構項目(智能數據目錄篇)

電子病歷高質量語料庫的構建是醫療人工智能發展的基礎性工作,而智能數據目錄作為數據治理的核心組件,能夠有效管理這些語料資源。本文將系統闡述電子病歷高質量語料庫的構建方法與架構,特別聚焦于智能數據目錄的設計與實現,包括數據目錄的功能定位、元數據管理、構建步驟以…

前端懶加載(Lazy Loading)實戰指南

&#x1f680; 前端懶加載&#xff08;Lazy Loading&#xff09;實戰指南 懶加載是現代 Web 性能優化的“常規操作”。它的目標簡單直接&#xff1a;讓用戶只加載“當下真正需要的資源”。從靜態資源、組件、模塊到數據&#xff0c;每一層都可以使用懶加載技術&#xff0c;構建…

在 Ubuntu 系統中,查看已安裝程序的方法

在 Ubuntu 系統中&#xff0c;查看已安裝程序的方法取決于軟件的安裝方式&#xff08;如通過 apt、snap、flatpak 或手動安裝&#xff09;。以下是幾種常見方法&#xff1a; 通過 apt 包管理器安裝的軟件 適用于通過 apt 或 dpkg 安裝的 .deb 包。 列出所有已安裝的軟件包&…

性能優化實踐:性能監控體系

性能優化實踐&#xff1a;性能監控體系 在Flutter應用開發中&#xff0c;建立一個完善的性能監控體系對于保證應用質量和用戶體驗至關重要。本文將從實戰角度深入講解如何搭建Flutter應用的性能監控體系&#xff0c;包括監控指標的設計、數據采集實現、分析平臺搭建等內容。 …

kotlin 02flow-sharedFlow 完整教程

一 sharedFlow是什么 SharedFlow 是 Kotlin 協程中 Flow 的一種 熱流&#xff08;Hot Flow&#xff09;&#xff0c;用于在多個訂閱者之間 共享事件或數據流。它適合處理 一次性事件&#xff08;如導航、彈窗、Toast、刷新通知等&#xff09;&#xff0c;而不是持續狀態。 ? …

模擬開發授權平臺

這次只是實現應用的curd和公私鑰的校驗以及第三方的通知dmeo項目&#xff0c;大家可以拓開視野來編寫 進入主題 項目鏈接&#xff1a;桌角的眼鏡/develop_auth_platform 直接下拉并運行就行 回調應用代碼在test包中 回調應用測試代碼 package mainimport ("encoding/…

STM32 USART串口

一、通信接口 二、串口通信 串口是一種應用十分廣泛的通訊接口&#xff0c;串口成本低、容易使用、通信線路簡單&#xff0c;可實現兩個設備的互相通信單片機的串口可以使單片機與單片機、單片機與電腦、單片機與各式各樣的模塊互相通信&#xff0c;極大地擴展了單片機的應用…

uniapp開發06-視頻組件video的使用注意事項

uniapp開發-視頻組件video的使用注意事項&#xff01;實際項目開發中&#xff0c;經常會遇到視頻播放的業務需求。下面簡單講解一下&#xff0c;uniapp官方提供的視頻播放組件video的常見參數和實際效果。 1&#xff1a;先看代碼&#xff1a; <!--視頻組件的使用展示-->…

【爬蟲】微博熱搜機

第一個下面一點&#xff1a; js代碼&#xff1a; const n require("crypto-js");let s n.SHA1(n.enc.Utf8.parse("tSdGtmwh49BcR1irt18mxG41dGsBuGKS")) , a n.enc.Hex.parse(s.toString(n.enc.Hex).substr(0, 32));function h(t) {let e (i t Stri…

軟考 系統架構設計師系列知識點之雜項集萃(51)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;50&#xff09; 第80題 設三個煤場A1、A2、A3分別能供應煤7、12、11萬噸&#xff0c;三個工廠B1、B2、B3分別需要10、10、10萬噸&#xff0c;從各煤場到各工廠運煤的單價&#xff08;百元/噸&…

npm,yarn,pnpm,cnpm,nvm,npx包管理器常用命令

前端比較主流的包管理器主要有三個npm&#xff0c;yarn&#xff0c;pnpm 多層級依賴&#xff0c;通常發生在依賴之間存在復雜的版本要求時 包 A 依賴于包 B1.0.0 包 B 依賴于包 C2.0.0 另一個包 D 也依賴于 C3.0.0 一、NPM (Node Package Manager) https://www.npmjs.cn/…

科普簡潔版:同態加密——密碼學的未來瑰寶

文章目錄 一、同態加密的基本概念1.1 什么是同態加密1.2 同態加密的數學本質1.3 同態加密的類型 二、主要同態加密方案詳解2.1 ElGamal加密2.2 Paillier加密2.3 Gentry的完全同態加密方案2.4 BGV方案2.5 BFV方案2.6 CKKS方案 三、同態加密的關鍵技術3.1 噪聲管理技術3.2 多項式…

力扣第448場周賽

賽時成績如下: 這應該是我力扣周賽的最好成績了(雖然還是三題) 1. 兩個數字的最大乘積 給定一個正整數 n。 返回 任意兩位數字 相乘所得的 最大 乘積。 注意&#xff1a;如果某個數字在 n 中出現多次&#xff0c;你可以多次使用該數字。 示例 1&#xff1a; 輸入&#xff1…

(一)Modular Monolith Architecture(項目結構/.net項目初始化/垂直切片架構)

文章目錄 項目地址一、項目結構1.1 Modules1. Events 模塊2. Users 模塊3. Ticketing 模塊4. Attendance 模塊1.2 數據庫模塊1.3 模塊架構選擇1. 全是Clean Architecture2. 分別使用不同的架構二、初始化項目2.1 本地創建項目結構1. 創建空的solution2. 添加基礎配置3. 創建git…

Java常用組件之Redis經典面試題(一)

大家好&#xff0c;今天為大家帶來Java項目中&#xff0c;幾乎必不可少的組件之一-Redis的一些常見面試題&#xff0c;幫忙近期需要面試的朋友們來一個理論基礎突擊&#xff01; 一、數據類型 1.Redis的常用數據類型有哪些 ? 難易程度&#xff1a;☆☆☆ 出現頻率&#xff1a;…

2025.5.4總結

今天去光谷步行街逛了一下&#xff0c;感覺熟悉又陌生&#xff0c;說熟悉是因為初二的時候來過武漢光谷&#xff0c;盡管過去了8年時間&#xff0c;但絲毫不影響標志性建筑的存在&#xff0c;也陌生是商場的建筑風格真實氣派&#xff0c;感覺進入了一座城堡&#xff0c;在里面都…

神經網絡在專家系統中的應用:從符號邏輯到連接主義的融合創新

自人工智能作為一個學科面世以來&#xff0c;關于它的研究途徑就存在兩種不同的觀點。一種觀點主張對人腦的結構及機理開展研究&#xff0c;并通過大規模集成簡單信息處理單元來模擬人腦對信息的處理&#xff0c;神經網絡是這一觀點的代表。關于這方面的研究一般被稱為連接機制…

Doo全自動手機殼定制系統

Doo全自動手機殼定制系統 項目概述 Doo全自動手機殼定制系統是一個完整的手機殼定制解決方案&#xff0c;支持多端應用&#xff0c;包括服務端、客戶端、管理后臺等多個組件。系統采用現代化的技術棧&#xff0c;提供完整的手機殼定制、訂單管理、用戶管理等功能。 目錄結構…