cv::cuda::GpuMat()
cv::cuda::GpuMat 是 OpenCV 库中的一个类,用于在 GPU 上存储和处理图像数据,使得用户能够利用 GPU 加速图像处理算法。
特点:
1:GPU 内存管理:cv::cuda::GpuMat 是一个封装了 GPU 内存的类,它允许用户直接在 GPU 上分配、释放和操作图像数据。
2:高效的数据传输:该类提供了在 CPU 和 GPU 之间高效传输数据的方法,如 upload() 和 download(),这些方法用于将数据从 CPU 内存传输到 GPU 内存,或者从 GPU 内存传输回 CPU 内存。
3:与 CPU 上的 cv::Mat 兼容:cv::cuda::GpuMat 的设计使其与 CPU 上的 cv::Mat 类兼容,便于在两者之间进行转换和操作。
4:CUDA 加速的图像处理函数:OpenCV CUDA 模块提供了一系列 CUDA 加速的图像处理函数,这些函数可以直接操cv::cuda::GpuMat 对象。
将图片从CPU内存加载到GPU内存
cv::cuda::GpuMat gpu_image;
gpu_image.upload(host_image); // 将图像从 CPU 内存上传到 GPU 内存
或者
cv::cuda::GpuMat gpu_img1(host_image);
语句cv::cuda::GpuMat gpu_img1(img1);做了以下几件事情:
1:它声明了一个cv::cuda::GpuMat类型的变量gpu_img1。
2:它使用img1这个cv::Mat对象来初始化gpu_img1。这里,img1应该是一个已经加载到内存中的图像。
3:在初始化过程中,图像数据img1会被上传到GPU的显存中,以便后续在GPU上进行处理。
需要注意的是,这个操作只是创建了一个GPU上的图像容器并将数据从CPU内存复制到GPU显存,并没有实际改变图像的内容或执行任何图像处理操作。
将图片从GPU内存加载到CPU内存
cv::Mat result_host;
gpu_result.download(result_host); // 将处理后的图像从 GPU 内存下载到 CPU 内存
或者
cv::Mat result(gpu_result);
完整示例
#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
int main()
{
cv::Mat host_image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
if (host_image.empty())
{
std::cerr << "Error: Could not read image file." << std::endl;
return -1;
}
cv::cuda::GpuMat gpu_image;
gpu_image.upload(host_image); // 将图像从 CPU 内存上传到 GPU 内存
// 在 GPU 上执行图像处理操作(例如,使用 CUDA 加速的滤波器)
cv::cuda::GpuMat gpu_result;
cv::cuda::CannyEdgeDetector detector(50, 150);
detector.detect(gpu_image, gpu_result);
cv::Mat result_host;
gpu_result.download(result_host); // 将处理后的图像从 GPU 内存下载到 CPU 内存
// 显示或保存结果图像
cv::imshow("Result", result_host);
cv::waitKey(0);
return 0;
}
注意:要使用 OpenCV 的 CUDA 模块,你需要在编译时链接到相应的 CUDA 库,并且你的系统需要安装有支持 CUDA 的 NVIDIA GPU 和相应的 CUDA 工具包。