Cmake、VS2019、C++、openGLopenCV環境安裝

CMakeVisual Studio 2019 環境下安裝和配置 OpenGLOpenCV 以及 CUDA 可能會有些復雜,因為涉及的組件多且相互依賴。以下是一個詳細的指南,幫助您逐步完成安裝和配置。


1. 前提條件

在開始之前,請確保您已安裝以下軟件:

  • Visual Studio 2019: 安裝時請選擇“使用 C++ 的桌面開發”工作負載。如果您計劃進行更廣泛的圖形編程,也可以考慮包含“使用 C++ 的游戲開發”工作負載,因為它包含了一些 OpenGL 相關組件。
  • C++ 編譯器: Visual Studio 2019 自帶 MSVC,我們將使用它。

2. 安裝 OpenGL

OpenGL 本身是一個規范,而不是一個傳統意義上的庫。您通常會使用 GLAD(OpenGL 加載器)來管理函數指針,并使用 GLFW(圖形庫框架)來處理窗口和輸入。
在這里插入圖片描述

a. GLFW 安裝

  1. 下載 GLFW: 訪問 GLFW 官網,下載適用于 Visual Studio 2019 的預編譯二進制文件(例如:“64-bit Windows binaries”)。
  2. 解壓: 將下載的 ZIP 文件解壓到一個方便的位置,例如 C:\Libraries\glfw-3.3.8
  3. 結構: 解壓后的文件夾中會包含 include(用于頭文件)和 lib(用于庫文件)。
    在這里插入圖片描述

b. GLAD 安裝

在這里插入圖片描述

  1. 訪問 GLAD 官網: 前往 GLAD 官網。
  2. 選擇選項:
    • 語言: C/C++
    • 規范: OpenGL
    • API: 選擇一個版本(例如 4.6)。請務必選擇“Core”配置文件。
    • 擴展: 基本設置無需選擇任何特定擴展。
    • 加載器: 勾選“Generate a loader”。
  3. 生成: 點擊“Generate”并下載 ZIP 文件。
  4. 解壓: 解壓 ZIP 文件的內容。您會發現一個 include 文件夾,其中包含 KHRgladGLFW 相關的頭文件。
  5. 復制頭文件: 將解壓后的 include 目錄中的 gladKHR 文件夾復制到您的項目 include 目錄中,或者一個公共的 include 目錄(例如 C:\Libraries\glad\include)。

3. 安裝 CUDA Toolkit

CUDA 對于利用 NVIDIA GPU 進行加速計算至關重要。

  1. 檢查 GPU 兼容性: 確保您的 NVIDIA GPU 支持 CUDA。您可以在 NVIDIA CUDA GPU 頁面 上查看。
  2. 下載 CUDA Toolkit: 訪問 NVIDIA CUDA Toolkit 下載頁面。
    • 選擇您的操作系統(Windows)、架構(x86_64)和 Visual Studio 版本(VS2019 對應 10.0)。
    • 選擇“local”安裝程序進行完整下載。
  3. 運行安裝程序: 執行下載的安裝程序。
    • 在安裝過程中,選擇自定義安裝。
    • 重要提示: 如果安裝程序試圖安裝比您當前 Visual Studio 版本更舊的集成,請取消選擇 Visual Studio 集成。您需要最新的集成,這應該隨您的 VS2019 安裝提供,或者由 Visual Studio 自身更新。通常,讓 CUDA 安裝程序處理核心 CUDA 組件和驅動程序更安全。
    • 按照屏幕上的提示完成安裝。
  4. 驗證安裝:
    • 打開命令提示符,輸入 nvcc -V。您應該會看到 CUDA 編譯器版本信息。
    • 檢查您的系統 PATH 環境變量。您應該能看到類似 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.Y\binC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.Y\libnvvp 的條目。

set(CUDA_DIR "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2")
在這里插入圖片描述


4. 安裝 OpenCV

OpenCV(開源計算機視覺庫)可能會更復雜一些,尤其是與 CUDA 集成時。我們將使用 CMake 從源代碼構建它。
在這里插入圖片描述

a. 下載 OpenCV 源代碼

  1. 下載 OpenCV: 訪問 GitHub 上的 OpenCV 發布頁面,下載最新穩定版本的源代碼(例如 opencv-4.x.x.zip)。
  2. 下載 OpenCV Contrib: 如果您需要額外的模塊(如 SIFT、SURF 等,這些模塊因專利問題已移至 contrib),也請從 OpenCV Contrib 發布頁面 下載相應的 opencv_contrib-4.x.x.zip
  3. 解壓: 創建一個文件夾,例如 C:\Libraries\opencv。將 opencv-4.x.x.zip 解壓到 C:\Libraries\opencv\opencv-4.x.x,并將 opencv_contrib-4.x.x.zip 解壓到 C:\Libraries\opencv\opencv_contrib-4.x.x

b. 使用 CMake 和 Visual Studio 2019 構建 OpenCV

  1. 安裝 CMake: 如果您尚未安裝,請從 CMake 官網 下載并安裝 CMake。選擇 Windows 安裝程序。

  2. 創建構建目錄: 在您的 C:\Libraries\opencv\opencv-4.x.x 文件夾中,創建一個新的空文件夾,命名為 build。因此路徑將是 C:\Libraries\opencv\opencv-4.x.x\build

  3. 打開 CMake-GUI: 啟動 CMake 圖形用戶界面(CMake-GUI)。

    • 源代碼路徑: 瀏覽到 C:\Libraries\opencv\opencv-4.x.x
    • 構建二進制文件路徑: 瀏覽到 C:\Libraries\opencv\opencv-4.x.x\build
  4. 配置:

    • 點擊 Configure
    • 選擇您的生成器:選擇 Visual Studio 16 2019
    • 選擇平臺:選擇 x64
    • 點擊 Finish
  5. 設置 CMake 選項: 配置完成后,會出現一個選項列表。以下是 CUDA 和 contrib 的關鍵選項:

    • BUILD_opencv_world:(可選,但推薦)勾選此項以構建單個 opencv_world 庫。
    • OPENCV_EXTRA_MODULES_PATH:勾選此項并提供您的 opencv_contrib 模塊路徑,例如 C:\Libraries\opencv\opencv_contrib-4.x.x\modules
    • WITH_CUDA勾選此選項。 CMake 應該會自動檢測您的 CUDA 安裝。如果未檢測到,您可能需要手動將 CUDA_TOOLKIT_ROOT_DIR 設置為您的 CUDA 安裝路徑(例如 C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/vX.Y)。
    • CUDA_ARCH_BIN:這很重要。在 此處 查找您 GPU 的計算能力。例如,如果您的 GPU 計算能力為 7.5,則輸入 7.5(或 75)。您可以輸入用分號分隔的多個計算能力(例如 6.1;7.5;8.6)。
    • WITH_OPENGL勾選此選項。
    • INSTALL_C_EXAMPLES:(可選)勾選以構建 C 示例。
    • INSTALL_PYTHON_EXAMPLES:(可選)如果不需 Python 示例,則取消勾選。
    • BUILD_EXAMPLES:(可選)勾選以構建示例。
    • BUILD_SHARED_LIBS:保持勾選以構建 DLL(動態庫)。如果您更喜歡靜態鏈接,請取消勾選。
    • BUILD_TESTS:(可選)取消勾選以加快構建速度。
  6. 重新配置并生成:

    • 再次點擊 Configure,確保所有選項都已正確設置。紅色條目應該會消失。
    • 點擊 Generate。這將在您的 build 目錄中生成 Visual Studio 解決方案文件。
  7. 在 Visual Studio 中構建:

    • 在 Visual Studio 2019 中打開 C:\Libraries\opencv\opencv-4.x.x\build\OpenCV.sln
    • 在“解決方案資源管理器”中,右鍵單擊 ALL_BUILD 項目,然后選擇生成。這將編譯所有 OpenCV 模塊。這可能需要很長時間。
    • ALL_BUILD 完成后,右鍵單擊 INSTALL 項目,然后選擇生成。這會將編譯好的庫、頭文件和 DLL 復制到 C:\Libraries\opencv\opencv-4.x.x\build\install 目錄(或您在 CMake 配置期間指定為 CMAKE_INSTALL_PREFIX 的路徑)。

5. 設置 Visual Studio 2019 項目

現在所有組件都已安裝,讓我們在 Visual Studio 中創建一個新項目并鏈接到這些庫。

  1. 創建新項目:
    • 打開 Visual Studio 2019。
    • 點擊“創建新項目”。
    • 選擇“控制臺應用”(適用于 C++)。
    • 為您的項目命名并選擇位置。
  2. 配置項目屬性:
    • 在“解決方案資源管理器”中,右鍵單擊您的項目,然后選擇屬性
    • 確保將配置設置為 所有配置,平臺設置為 x64

a. 包含目錄(Include Directories)

  • 轉到 VC++ 目錄 > 包含目錄
  • 添加以下路徑:
    • C:\Libraries\glfw-3.3.8\include
    • C:\Libraries\glad\include(或您放置 GLAD 頭文件的位置)
    • C:\Libraries\opencv\opencv-4.x.x\build\install\include
    • C:\Libraries\opencv\opencv-4.x.x\build\install\include\opencv2
    • C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.Y\include(將 vX.Y 替換為您的 CUDA 版本)

b. 庫目錄(Library Directories)

  • 轉到 VC++ 目錄 > 庫目錄
  • 添加以下路徑:
    • C:\Libraries\glfw-3.3.8\lib-vc2019(或 GLFW 下載中與您 VS 版本對應的 lib-vcXXXX
    • C:\Libraries\opencv\opencv-4.x.x\build\install\x64\vc16\lib(或與您 VS 版本對應的 vcXX
    • C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.Y\lib\x64

c. 鏈接器 > 輸入 > 附加依賴項(Linker > Input > Additional Dependencies)

  • 轉到 鏈接器 > 輸入 > 附加依賴項
  • 添加以下 .lib 文件:
    • glfw3.lib
    • opengl32.lib(標準 Windows OpenGL 庫)
    • opencv_world4xx.lib(或調試版本 opencv_world4xxd.lib,將 4xx 替換為您的 OpenCV 版本,例如 opencv_world460.lib

d. 復制 DLL 文件(重要)

對于動態鏈接,您還需要確保相關的 DLL 文件在可執行文件旁邊或系統 PATH 中。

  • OpenCV DLLs:C:\Libraries\opencv\opencv-4.x.x\build\install\x64\vc16\bin 目錄下的所有 DLL 文件復制到您項目可執行文件(.exe)所在的目錄(通常是 DebugRelease 文件夾)。
  • CUDA DLLs: 通常 CUDA DLLs 已經添加到系統 PATH 中,但如果沒有,您可能需要將 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.Y\bin 添加到系統 PATH,或者將其中的 DLLs 復制到項目可執行文件目錄。
  • GLFW DLLs:C:\Libraries\glfw-3.3.8\lib-vc2019 目錄下的 glfw3.dll 復制到您項目可執行文件所在的目錄。

6. 示例代碼(測試)

現在您可以編寫一些簡單的代碼來測試您的安裝了。

OpenGL 和 GLFW 示例

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);#ifdef __APPLE__glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endifGLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}while (!glfwWindowShouldClose(window)){processInput(window);glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glfwSwapBuffers(window);glfwPollEvents();}glfwTerminate();return 0;
}void processInput(GLFWwindow *window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}

OpenCV 和 CUDA 示例

#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp> // For CUDA-accelerated image processing
#include <iostream>int main() {// Check if CUDA is availableif (cv::cuda::getCudaEnabledDeviceCount() > 0) {std::cout << "CUDA is available!" << std::endl;// Print device propertiescv::cuda::DeviceInfo info;std::cout << "GPU Device Name: " << info.name() << std::endl;std::cout << "Total Memory: " << info.totalGlobalMem() / (1024.0 * 1024.0) << " MB" << std::endl;// Example: Upload an image to GPU, convert to grayscale, download backcv::Mat hostImage = cv::imread("path/to/your/image.jpg", cv::IMREAD_COLOR); // Replace with a valid image pathif (hostImage.empty()) {std::cerr << "Error: Could not open or find the image!" << std::endl;return -1;}cv::cuda::GpuMat gpuImage;gpuImage.upload(hostImage); // Upload to GPUcv::cuda::GpuMat gpuGrayImage;cv::cuda::cvtColor(gpuImage, gpuGrayImage, cv::COLOR_BGR2GRAY); // Convert to grayscale on GPUcv::Mat hostGrayImage;gpuGrayImage.download(hostGrayImage); // Download back to CPUcv::imshow("Original Image", hostImage);cv::imshow("Grayscale Image (CUDA)", hostGrayImage);cv::waitKey(0);} else {std::cout << "CUDA is NOT available. Running CPU-only OpenCV." << std::endl;cv::Mat hostImage = cv::imread("path/to/your/image.jpg", cv::IMREAD_COLOR); // Replace with a valid image pathif (hostImage.empty()) {std::cerr << "Error: Could not open or find the image!" << std::endl;return -1;}cv::Mat hostGrayImage;cv::cvtColor(hostImage, hostGrayImage, cv::COLOR_BGR2GRAY);cv::imshow("Original Image", hostImage);cv::imshow("Grayscale Image (CPU)", hostGrayImage);cv::waitKey(0);}return 0;
}

重要提示: 在運行 OpenCV 示例之前,請確保將 path/to/your/image.jpg 替換為計算機上實際存在的圖像文件的路徑。


至此,您應該已經成功配置了 CMake、Visual Studio 2019 下的 OpenGL、OpenCV 和 CUDA 環境。如果在過程中遇到任何問題,請仔細檢查路徑和環境變量,這通常是問題所在。

您在設置過程中遇到任何具體問題了嗎?
在這里插入圖片描述

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

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

相關文章

視頻二維碼在產品設備說明書中的應用

在當今數字化的時代&#xff0c;傳統的產品設備說明書正面臨著一場變革。文字和圖片雖然能提供基本信息&#xff0c;但在復雜設備的安裝、操作和故障排除方面&#xff0c;往往顯得力不從心。而視頻二維碼的出現&#xff0c;為這一困境提供了完美的解決方案&#xff0c;它將冰冷…

【Pytest 使用教程】

pytest 使用 test_basic.py Pytest 完全實戰手冊 一、核心概念與基礎 1、在pytest框架下運行測試用例&#xff0c;最基礎的一共有三點。導入pytest的包寫一個方法&#xff0c;或者類。后面運行的時候&#xff0c;相當于運行這個方法&#xff0c;或者類里的方法&#xff0c;無需…

基于OpenOCD 的 STM32CubeIDE 開發燒錄調試環境搭建 DAPLINK/STLINK

需要部署一個開發環境,實現h7的板子通過daplink功能給目標板燒寫程序(同事要將這個過程用fpga實現),需要通過openocd+gdb+daplink stm32; 總結:單條命令執行太麻煩,參考4寫成腳本文件: 獨立腳本使用Openocd ? 在**“在Stm32CubeIDE環境下使用DAP-Link仿真”**一文中…

嵌入式硬件篇---zigbee無線串口通信問題

使用 ZigBee 進行無線串口通信時&#xff0c;接收異常&#xff08;如丟包、亂碼、完全無法接收&#xff09;是常見問題&#xff0c;其原因涉及射頻通信特性、網絡機制、硬件配置、環境干擾等多個層面。以下從具體機制出發&#xff0c;詳細分析可能的原因&#xff1a;一、射頻層…

【AI周報】2025年7月26日

【AI周報】2025年7月第四周觀察&#xff1a;GitHub Spark重塑開發范式&#xff0c;中美AI政策對壘升級 省流版靜態頁面周報&#xff0c;為方便各位看官快速食用&#xff0c;我準備了摘要版周報&#xff0c;歡迎訪問&#xff1a;20250726周報 引言&#xff1a;本周焦點速覽 2…

HTML:從 “小白” 到 “標簽俠” 的修煉手冊

目錄 一、HTML&#xff1a;網頁的 “骨架” 不是骷髏架 二、文本標簽&#xff1a;文字的 “華麗變身” 術 1. 標題標簽&#xff1a;文字界的 “領導班子” 2. 段落標簽&#xff1a;文字的 “專屬保姆” 3. 文本格式化標簽&#xff1a;給文字 “穿花衣” 三、鏈接標簽&…

python3GUI--基于YOLO的火焰與煙霧檢測系統By:PyQt5(詳細圖文介紹)

文章目錄一&#xff0e;前言1.引言2.正文二&#xff0e;核心內容1.數據集2.模型訓練3.界面窗口1.登錄注冊界面2.核心功能界面3.檢測告警提示窗口三&#xff0e;.核心界面模塊介紹1.頂部信息區域2.數據輸入3.參數配置4.告警設置5.操作臺6.關于7.指標變化8.異常速覽9.日志輸出10.…

基于Transform、ARIMA、LSTM、Prophet的藥品銷量預測分析

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主一、項目背景二、數據準備與預處理三、模型選擇與方法設計1. ARIMA 模型&#xff1a;傳統統計方法的基線構建2. LSTM 模型&#xff1a;引入記憶機制的深度學習方法3. Transformer 模型&#…

LLM隱藏層與logits數值的簡單理解

LLM的“隱藏層數值”和“logits數值” 代表什么,范圍是多少 “隱藏層數值”和“logits數值”是兩個關鍵概念——它們分別對應模型“理解信息”和“輸出決策”的核心環節。 一、先明確基礎:LLM的“思考”流程 LLM本質是“輸入文本→處理信息→輸出結果”的神經網絡。簡單說…

Vue》》@ 用法

使用 別名導入 // 導入 src/components/Button.vue import Button from /components/Button.vue// 導入 src/utils/helper.js import { helperFunc } from /utils/helper// 導入 src/store/index.js import store from /store

20250726-1-Kubernetes 網絡-Service存在的意義_筆記

一、Service控制器 1. Service存在的意義 1)基本場景 ?? 動態IP問題:Pod IP具有短暫性,銷毀重建后IP會變化(示例:原IP 169.130重建后變為169.132) 服務發現需求:需要穩定入口訪問同一服務的多個Pod,避免因Pod變動導致服務中斷 負載均衡需求:多個Pod副本需要統一訪…

在一個存在的包里面編寫msg消息文件

前言盡管最佳實踐是在專門的接口包中聲明接口&#xff0c;但有時在同一個包中完成接口的聲明、創建和使用會更為便捷。創建文件創建好msg/AddressBook.msg文件&#xff0c;在你的包的目錄下package.xml<buildtool_depend>rosidl_default_generators</buildtool_depend…

華為服務器操作系統openEuler介紹與安裝

一、openEuler概述 1.1、openEuler介紹 openEuler&#xff08;簡稱 “歐拉”&#xff09;是華為開源的服務器操作系統&#xff0c;是基于Linux穩定系統內核的、面向企業級的通用服務器架構平臺。能夠滿足客戶從傳統IT基礎設施到云計算服務的需求&#xff0c;打造了完善的從芯…

CUDA雜記--FP16與FP32用途

FP16&#xff08;半精度浮點數&#xff09;和FP32&#xff08;單精度浮點數&#xff09;是計算機中用于表示浮點數的兩種常見格式&#xff0c;它們在存儲空間、數值范圍、精度、計算效率等方面有顯著區別。以下從核心差異、適用場景等方面詳細說明&#xff1a; 一、核心差異&am…

Android開發中技術選型的落地方案

技術選型不是簡單地“哪個庫最火就用哪個”&#xff0c;而是一個需要綜合考慮業務、團隊、技術、維護、未來等多維度因素的系統工程。 核心目標&#xff1a; 選擇最適合當前及可預見未來項目需求的技術棧&#xff0c;確保應用高質量、高效率、可維護、可擴展、安全穩定地開發和…

Spring Boot 單元測試進階:JUnit5 + Mock測試與切片測試實戰及覆蓋率報告生成

在微服務架構盛行的今天&#xff0c;單元測試已成為保障代碼質量的核心環節。Spring Boot 生態提供了完整的測試工具鏈&#xff0c;結合 JUnit5 的現代化測試框架和 Mockito 的行為模擬能力&#xff0c;可實現從方法級到模塊級的全鏈路測試覆蓋。本文將通過實戰案例解析 JUnit5…

八股文整理——計算機網絡

目錄 OSI&#xff0c;TCP/IP&#xff0c;五層協議的體系結構 TCP/IP模型和OSI參考模型的對應關系 OSI每一層的作用如下&#xff08;理解順序依次往下&#xff09;&#xff1a; OSI分層及對應協議 以 “寄快遞” 為例類比七層模型 TCP與UDP的區別&#xff1f; TCP對應的…

進制間的映射關系

? 問題一&#xff1a;為什么不同進制之間會有特定的映射關系&#xff1f; ? 問題二&#xff1a;為什么八進制和十六進制可以被看作是二進制的簡化形式&#xff1f;&#x1f50d; 一、為什么不同進制之間有特定的映射關系&#xff1f; 這是因為 所有進制本質上只是表示數的不同…

RabbitMQ-交換機(Exchange)

作者介紹&#xff1a;簡歷上沒有一個精通的運維工程師。請點擊上方的藍色《運維小路》關注我&#xff0c;下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。中間件&#xff0c;我給它的定義就是為了實現某系業務功能依賴的軟件&#xff0c;包括如下部分:Web服務器代理…

分類預測 | MATLAB實現DBO-SVM蜣螂算法優化支持向量機分類預測

分類預測 | MATLAB實現DBO-SVM蜣螂算法優化支持向量機分類預測 目錄 分類預測 | MATLAB實現DBO-SVM蜣螂算法優化支持向量機分類預測 分類效果 基本介紹 算法步驟 參數設定 運行環境 應用場景 程序設計 參考資料 分類效果 基本介紹 該MATLAB代碼實現了基于蜣螂優化算法(DBO)優…