在 CMake 和 Visual Studio 2019 环境下安装和配置 OpenGL、OpenCV 以及 CUDA 可能会有些复杂,因为涉及的组件多且相互依赖。以下是一个详细的指南,帮助您逐步完成安装和配置。
1. 前提条件
在开始之前,请确保您已安装以下软件:
- Visual Studio 2019: 安装时请选择“使用 C++ 的桌面开发”工作负载。如果您计划进行更广泛的图形编程,也可以考虑包含“使用 C++ 的游戏开发”工作负载,因为它包含了一些 OpenGL 相关组件。
- C++ 编译器: Visual Studio 2019 自带 MSVC,我们将使用它。
2. 安装 OpenGL
OpenGL 本身是一个规范,而不是一个传统意义上的库。您通常会使用 GLAD(OpenGL 加载器)来管理函数指针,并使用 GLFW(图形库框架)来处理窗口和输入。
a. GLFW 安装
- 下载 GLFW: 访问 GLFW 官网,下载适用于 Visual Studio 2019 的预编译二进制文件(例如:“64-bit Windows binaries”)。
- 解压: 将下载的 ZIP 文件解压到一个方便的位置,例如
C:\Libraries\glfw-3.3.8
。 - 结构: 解压后的文件夹中会包含
include
(用于头文件)和lib
(用于库文件)。
b. GLAD 安装
- 访问 GLAD 官网: 前往 GLAD 官网。
- 选择选项:
- 语言: C/C++
- 规范: OpenGL
- API: 选择一个版本(例如
4.6
)。请务必选择“Core”配置文件。 - 扩展: 基本设置无需选择任何特定扩展。
- 加载器: 勾选“Generate a loader”。
- 生成: 点击“Generate”并下载 ZIP 文件。
- 解压: 解压 ZIP 文件的内容。您会发现一个
include
文件夹,其中包含KHR
、glad
和GLFW
相关的头文件。 - 复制头文件: 将解压后的
include
目录中的glad
和KHR
文件夹复制到您的项目include
目录中,或者一个公共的include
目录(例如C:\Libraries\glad\include
)。
3. 安装 CUDA Toolkit
CUDA 对于利用 NVIDIA GPU 进行加速计算至关重要。
- 检查 GPU 兼容性: 确保您的 NVIDIA GPU 支持 CUDA。您可以在 NVIDIA CUDA GPU 页面 上查看。
- 下载 CUDA Toolkit: 访问 NVIDIA CUDA Toolkit 下载页面。
- 选择您的操作系统(Windows)、架构(x86_64)和 Visual Studio 版本(VS2019 对应 10.0)。
- 选择“local”安装程序进行完整下载。
- 运行安装程序: 执行下载的安装程序。
- 在安装过程中,选择自定义安装。
- 重要提示: 如果安装程序试图安装比您当前 Visual Studio 版本更旧的集成,请取消选择 Visual Studio 集成。您需要最新的集成,这应该随您的 VS2019 安装提供,或者由 Visual Studio 自身更新。通常,让 CUDA 安装程序处理核心 CUDA 组件和驱动程序更安全。
- 按照屏幕上的提示完成安装。
- 验证安装:
- 打开命令提示符,输入
nvcc -V
。您应该会看到 CUDA 编译器版本信息。 - 检查您的系统
PATH
环境变量。您应该能看到类似C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.Y\bin
和C:\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 源代码
- 下载 OpenCV: 访问 GitHub 上的 OpenCV 发布页面,下载最新稳定版本的源代码(例如
opencv-4.x.x.zip
)。 - 下载 OpenCV Contrib: 如果您需要额外的模块(如 SIFT、SURF 等,这些模块因专利问题已移至 contrib),也请从 OpenCV Contrib 发布页面 下载相应的
opencv_contrib-4.x.x.zip
。 - 解压: 创建一个文件夹,例如
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
安装 CMake: 如果您尚未安装,请从 CMake 官网 下载并安装 CMake。选择 Windows 安装程序。
创建构建目录: 在您的
C:\Libraries\opencv\opencv-4.x.x
文件夹中,创建一个新的空文件夹,命名为build
。因此路径将是C:\Libraries\opencv\opencv-4.x.x\build
。打开 CMake-GUI: 启动 CMake 图形用户界面(CMake-GUI)。
- 源代码路径: 浏览到
C:\Libraries\opencv\opencv-4.x.x
。 - 构建二进制文件路径: 浏览到
C:\Libraries\opencv\opencv-4.x.x\build
。
- 源代码路径: 浏览到
配置:
- 点击 Configure。
- 选择您的生成器:选择
Visual Studio 16 2019
。 - 选择平台:选择
x64
。 - 点击 Finish。
设置 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
:(可选)取消勾选以加快构建速度。
重新配置并生成:
- 再次点击 Configure,确保所有选项都已正确设置。红色条目应该会消失。
- 点击 Generate。这将在您的
build
目录中生成 Visual Studio 解决方案文件。
在 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
的路径)。
- 在 Visual Studio 2019 中打开
5. 设置 Visual Studio 2019 项目
现在所有组件都已安装,让我们在 Visual Studio 中创建一个新项目并链接到这些库。
- 创建新项目:
- 打开 Visual Studio 2019。
- 点击“创建新项目”。
- 选择“控制台应用”(适用于 C++)。
- 为您的项目命名并选择位置。
- 配置项目属性:
- 在“解决方案资源管理器”中,右键单击您的项目,然后选择属性。
- 确保将配置设置为
所有配置
,平台设置为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
)所在的目录(通常是Debug
或Release
文件夹)。 - 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);
#endif
GLFWwindow* 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 available
if (cv::cuda::getCudaEnabledDeviceCount() > 0) {
std::cout << "CUDA is available!" << std::endl;
// Print device properties
cv::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 back
cv::Mat hostImage = cv::imread("path/to/your/image.jpg", cv::IMREAD_COLOR); // Replace with a valid image path
if (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 GPU
cv::cuda::GpuMat gpuGrayImage;
cv::cuda::cvtColor(gpuImage, gpuGrayImage, cv::COLOR_BGR2GRAY); // Convert to grayscale on GPU
cv::Mat hostGrayImage;
gpuGrayImage.download(hostGrayImage); // Download back to CPU
cv::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 path
if (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 环境。如果在过程中遇到任何问题,请仔细检查路径和环境变量,这通常是问题所在。
您在设置过程中遇到任何具体问题了吗?