Gpu_1_PNSR和SSIM优化

本文介绍了GPU模块的基础,包括Gpu::GpuMat类、Stream类及其操作函数。强调了在GPU计算中避免不必要的数据传输和一次性内存分配的重要性。并特别讨论了如何在GPU上优化PNSR和SSIM的计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一Gpu模块介绍

Gpu有自己的存储叫做显存。当产生一个Mat对象时会存储到内存,这个对象由Cpu管理,这时Gpu并不能操作内存中的对象,Gpu只能操作分配在显存中的对象

1,基本类和函数

1>gpu::GpuMat类
相当于Mat
[1]不支持多维,只支持二维
[2]函数无法返回其引用
[3]没有表达式模板技术的支持

成员函数

//从m得到信息进行加载
void upload(const cv::Mat& m);
void upload(const CudaMem& m, Stream& stream);

//将信息保存到m
void download(cv::Mat& m) const;
void download(CudaMem& m, Stream& stream) const;

//exp:
Mat I1;         // 内存对象,可以用imread来创建
gpu::GpuMat gI; // GPU 矩阵 - 现在为空
gI1.upload(I1); //将内存数据上传到显存中

I1 = gI1;       //回传, gI1.download(I1) 也可以

很多时候,GPU函数只能接收单通道或者4通道的uchar或者float类型(CV_8UC1,CV_8UC4,CV_32FC1,CV_32FC4),GPU函数不支持双精度

如果函数只接收4通道或者单通道的图像而你的数据类型刚好是3通道的话,你能做的就是两件事:1.增加一个新的通道(使用char类型)或 2.将图像的三个通道切分为三个独立的图像,为每个图像调用该函数(推荐使用)。

2>gpu::Stream类
异步调用类

默认情况下,无论何时你调用一个GPU函数,系统都将等待调用完成并返回后继结果,这就意味着在GPU计算的时候CPU没干活。如果使异步调用,就会意味着它将调用后立即返回,并在后台异步执行,也就是说虽然CPU需要的数据还没从GPU返回,但是并不妨碍CPU进行其它的计算或者调用另一个函数。

可以异步进行类型转换,Mat与GpuMat,等其它操作

gpu::Stream stream;
//进行GpuMat的类型转换
stream.enqueueConvert(b.gI1, b.t1, CV_32F);   

3>操作函数
针对GpuMat,Gpu模块中对应了Cpu模块中的一部分操作函数,进行gpu操作时调用对应的函数

//进行异步通道分离
gpu::split(b.t1, b.vI1, stream);
//进行异步乘法              
gpu::multiply(b.vI1[i], b.vI1[i], b.I1_2, stream);        

2,操作原则

1>在现有对象上进行计算
在GPU中,任何小的数据传输都是一次大的开销,所以应该尽量避免不必要的数据传输。因此应该尽可能的在现有对象上计算(不创造新的显存对象)

//在下面的表达式中,会有一个隐性内存分配过程,调用乘法的结果必然要
//用一个临时对象储存,然后才能和*C1*相加
b.t1 = 2 * b.mu1_mu2 + C1;

//我们应该使用GPU处理函数代替算术表达式,
//从而避免额外创建不必要的临时对象
gpu::multiply(b.mu1_mu2, 2, b.t1); 
gpu::add(b.t1, C1, b.t1);

2>对gpu的对象尽量一次性分配完成

exp:
如果你需要创建一个调用多次的函数,

### 如何在 Visual Studio 中生成 `.pro` 文件 当安装 `Qt Visual Studio Tools` 后仍然无法看到 `Create Basic .pro File...` 选项时,可以按照以下方式解决问题并成功生成 `.pro` 文件。 #### 解决方案一:重新配置 Qt 插件设置 确保已正确安装 `Qt Visual Studio Tools` 并完成必要的配置。如果插件未正常工作,则可能需要手动调整其设置[^1]: 1. 打开 **工具 (Tools)** 菜单中的 **Options**。 2. 导航至 **Qt VS Tools -> Qt Versions** 部分。 3. 添加本地计算机上已经安装Qt 版本路径(例如 `C:\Qt\5.14.2\msvc2019_64`),并验证版本号是否匹配。 4. 如果上述操作仍未生效,尝试卸载当前版本的 `Qt Visual Studio Tools` 并重新安装最新稳定版。 #### 解决方案二:安装 Legacy 工具集 某些情况下,默认版本的 `Qt Visual Studio Tools` 不支持特定功能或存在兼容性问题。此时可考虑安装旧版(Legacy)工具集来恢复缺失的功能[^2]: - 下载地址通常可以通过官方文档或者社区资源获取。 - 安装完成后重启 Visual Studio 即会自动加载新增加的支持项,包括创建基本 `.pro` 文件的能力。 #### 自动化脚本辅助生成 对于高级开发者而言,也可以通过编写简单的批处理脚本来实现自动化`.pro`文件生成过程。下面是一个基础示例代码片段用于演示目的: ```batch @echo off set ProjectName=MyQtApp if exist %ProjectName%.pro del %ProjectName%.pro echo SOURCES += main.cpp >> %ProjectName%.pro echo HEADERS += myheader.h >> %ProjectName%.pro echo FORMS += form.ui >> %ProjectName%.pro pause ``` 此脚本将根据预定义的内容自动生成名为 MyQtApp 的项目对应的 pro 文件结构。 --- ### 注意事项 虽然以上方法适用于大多数场景下解决缺少 Create Basic .pro File 功能的问题,但在特殊环境下仍需注意其他潜在影响因素,比如操作系统差异、不同版本间的细微改动等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值