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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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)优…