[23] cuda应用之 nppi 实现图像缩放

[23] cuda应用之 nppi 实现图像缩放

  • NPP(NVIDIA Performance Primitives)是一个由 NVIDIA 提供的库,专门用于加速图像和信号处理任务。NPP 提供了许多高效的图像处理函数,包括图像缩放。使用 NPP 实现图像缩放可以充分利用 GPU 的并行计算能力,从而加速处理过程。

  • 以下是一个使用 NPP 实现图像缩放的简单示例,主要流程如下:

    • 加载图像拷贝到设备内存
    • nppi实现图像缩放
    • 设备内存拷贝到主机内存

1. nppi实现图像缩放

/*
* 测试nppi实现图像缩放
*/#include <opencv2/opencv.hpp> // OpenCV 用于加载和保存图像
#include <nppi.h>             // NPP 库
#include <nppi_geometry_transforms.h> // NPP 图像几何变换
#include <cuda_runtime.h>     // CUDA 运行时
#include <iostream>int main() 
{//0. 主机分配内存示例// 假设输入图像是 8 位灰度图像/* unsigned char* h_inputImage = new unsigned char[INPUT_IMAGE_WIDTH * INPUT_IMAGE_HEIGHT];unsigned char* h_outputImage = new unsigned char[OUTPUT_IMAGE_WIDTH * OUTPUT_IMAGE_HEIGHT];*/// 1. 使用 OpenCV 加载图像std::string inputImagePath = "images/autumn.tif"; // 输入图像路径//cv::Mat h_srcImage = cv::imread(inputImagePath, cv::IMREAD_GRAYSCALE); // 以灰度模式加载图像cv::Mat h_srcImage = cv::imread(inputImagePath);if (h_srcImage.empty()) {std::cerr << "Error: Could not load image!" << std::endl;return -1;}int srcWidth = h_srcImage.cols;  // 输入图像宽度int srcHeight = h_srcImage.rows; // 输入图像高度int srcChannel = h_srcImage.channels(); //输入图像通道数// 2. 定义输出图像尺寸//int dstWidth = srcWidth / 2;  // 输出图像宽度(缩放为一半)//int dstHeight = srcHeight / 2; // 输出图像高度int dstWidth = srcWidth * 2;  // 输出图像宽度(缩放为2倍)int dstHeight = srcHeight * 2; // 输出图像高度int dstChannel = srcChannel;cv::Mat h_dstImage;if (srcChannel == 1){h_dstImage = cv::Mat(dstHeight, dstWidth, CV_8UC1); // 输出图像(灰度)}else if (srcChannel == 3){h_dstImage = cv::Mat(dstHeight, dstWidth, CV_8UC3); // 输出图像(彩色)}// 3. 分配设备内存unsigned char* d_srcImage;unsigned char* d_dstImage;cudaMalloc((void**)&d_srcImage, srcWidth * srcHeight * srcChannel * sizeof(unsigned char)); // 输入图像设备内存cudaMalloc((void**)&d_dstImage, dstWidth * dstHeight * dstChannel * sizeof(unsigned char)); // 输出图像设备内存// 4. 将输入图像数据从主机复制到设备cudaMemcpy(d_srcImage, h_srcImage.data, srcWidth * srcHeight * srcChannel * sizeof(unsigned char), cudaMemcpyHostToDevice);// 5. 使用 NPP 进行图像缩放NppiSize srcSize = { srcWidth, srcHeight }; // 输入图像尺寸NppiRect srcROI = { 0, 0, srcWidth, srcHeight }; // 输入图像 ROINppiSize dstSize = { dstWidth, dstHeight }; // 输出图像尺寸NppiRect dstROI = { 0, 0, dstWidth, dstHeight }; // 输出图像 ROIint interpolationMode = NPPI_INTER_LINEAR; // 使用线性插值// 调用 NPP 图像缩放函数NppStatus status;if (srcChannel == 1){status = nppiResize_8u_C1R(d_srcImage, srcWidth, srcSize, srcROI,d_dstImage, dstWidth, dstSize, dstROI,interpolationMode);}else if (srcChannel == 3){status = nppiResize_8u_C3R(d_srcImage, srcWidth * srcChannel, srcSize, srcROI,d_dstImage, dstWidth * dstChannel, dstSize, dstROI,interpolationMode);}if (status != NPP_SUCCESS) {std::cerr << "NPP Image Resize failed with error code: " << status << std::endl;return -1;}// 6. 将缩放后的图像数据从设备复制回主机cudaMemcpy(h_dstImage.data, d_dstImage, dstWidth * dstHeight * dstChannel * sizeof(unsigned char), cudaMemcpyDeviceToHost);// 7. 保存或显示结果std::string outputImagePath = "output.jpg"; // 输出图像路径cv::namedWindow("dst", 0);cv::imshow("dst", h_dstImage);cv::waitKey(0);cv::imwrite(outputImagePath, h_dstImage); // 保存缩放后的图像std::cout << "Resized image saved to: " << outputImagePath << std::endl;// 8. 释放设备内存cudaFree(d_srcImage);cudaFree(d_dstImage);return 0;
}

2.相关函数介绍

  • nppiResize 系列函数用于缩放图像,支持不同的图像格式和插值方式,以决定在缩放过程中如何计算像素值。常见的插值方法包括:
NPPI_INTER_NEAREST:最近邻插值,最快,但质量较差。
NPPI_INTER_LINEAR:线性插值,速度较快,质量适中。
NPPI_INTER_CUBIC:立方插值,计算量较大,但质量较高。
NPPI_INTER_LANCZOS:Lanczos 插值,计算量较大,图像质量非常好。
  • nppiResize_8u_C1R 用于缩放单通道(灰度图像)8位无符号整数图像。
NppStatus nppiResize_8u_C1R(const Npp8u* pSrc, NppiSize oSrcSize, int nSrcStep,NppiSize oDstSize, Npp8u* pDst, int nDstStep,NppiInterpolationMode eInterpolation);
- 参数
pSrc:输入图像数据的指针。
oSrcSize:输入图像的宽度和高度。
nSrcStep:输入图像的步长(通常为宽度 * 通道数)。
oDstSize:目标图像的宽度和高度。
pDst:输出图像数据的指针。
nDstStep:输出图像的步长。
eInterpolation:插值方法(如 NPPI_INTER_LINEAR)。
  • nppiResize_8u_C3R 用于缩放三通道(如 RGB 彩色图像)8位无符号整数图像。
NppStatus nppiResize_8u_C3R(const Npp8u* pSrc, NppiSize oSrcSize, int nSrcStep,NppiSize oDstSize, Npp8u* pDst, int nDstStep,NppiInterpolationMode eInterpolation);- 参数:
pSrc:输入图像数据的指针。
oSrcSize:输入图像的宽度和高度。
nSrcStep:输入图像的步长。
oDstSize:目标图像的宽度和高度。
pDst:输出图像数据的指针。
nDstStep:输出图像的步长。
eInterpolation:插值方法。
  • nppiResize_16u_C1R 用于缩放单通道16位无符号整数图像。
NppStatus nppiResize_16u_C1R(const Npp16u* pSrc, NppiSize oSrcSize, int nSrcStep,NppiSize oDstSize, Npp16u* pDst, int nDstStep,NppiInterpolationMode eInterpolation);- 与 nppiResize_8u_C1R 类似,只是支持 16 位图像数据。
  • nppiResize_32f_C1R / nppiResize_32f_C3R 用于处理单通道或三通道32位浮点图像的缩放。
NppStatus nppiResize_32f_C1R(const Npp32f* pSrc, NppiSize oSrcSize, int nSrcStep,NppiSize oDstSize, Npp32f* pDst, int nDstStep,NppiInterpolationMode eInterpolation);
- 参数:与 nppiResize_8u_C1R 类似,只是数据类型变为 32 位浮点
  • nppiResize_8u_P2C3R 适用于处理图像中的区域进行缩放的函数,处理的是图片的矩形区域。
NppStatus nppiResize_8u_P2C3R(const Npp8u* pSrc, NppiSize oSrcSize, int nSrcStep,NppiSize oDstSize, Npp8u* pDst, int nDstStep,NppiInterpolationMode eInterpolation, NppiSize oROI);- 参数:
oSrcSize:输入图像的尺寸。
oDstSize:目标图像的尺寸。
eInterpolation:插值方法。
pDstBufferSize:返回所需的缓冲区大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【产品经理学习案例——AI翻译棒出海业务】

前言&#xff1a; 本文主要讲述了硬件产品在出海过程中&#xff0c;翻译质量、翻译速度和本地化落地策略是硬件产品规划需要考虑的核心因素。针对不同国家&#xff0c;需要优化翻译质量和算法&#xff0c;关注市场需求和文化差异&#xff0c;以便更好地满足当地用户的需求。同…

CH340G上传程序到ESP8266-01(S)模块

文章目录 概要ESP8266模块外形尺寸模块原理图模块引脚功能 CH340G模块外形及其引脚模块引脚功能USB TO TTL引脚 程序上传接线Arduino IDE 安装ESP8266开发板Arduino IDE 开发板上传失败上传成功 正常工作 概要 使用USB TO TTL&#xff08;CH340G&#xff09;将Arduino将程序上传…

AI推理性能之王-Groq公司开发的LPU芯片

Groq公司开发的LPU&#xff08;Language Processing Unit&#xff0c;语言处理单元&#xff09;芯片是一种专为加速大规模语言模型&#xff08;LLM&#xff09;和其他自然语言处理任务而设计的新型AI处理器。以下是对其技术特点、性能优势及市场影响的深度介绍&#xff1a; 技…

rk3506 sd卡启动

1 修改系统配置文件,打开ext4 #SDMMC RK_ROOTFS_TYPE"ext4" RK_ROOTFS_INSTALL_MODULESy RK_WIFIBT_CHIP"AIC8800" # RK_ROOTFS_LOG_GUARDIAN is not set RK_UBOOT_CFG_FRAGMENTS"rk3506_tb" RK_UBOOT_SPLy RK_KERNEL_CFG"rk3506_defconfi…

Docker 安装详细教程(适用于CentOS 7 系统)

目录 步骤如下&#xff1a; 1. 卸载旧版 Docker 2. 配置 Docker 的 YUM 仓库 3. 安装 Docker 4. 启动 Docker 并验证安装 5. 配置 Docker 镜像加速 总结 前言 Docker 分为 CE 和 EE 两大版本。CE即社区版&#xff08;免费&#xff0c;支持周期7个月&#xff09;&#xf…

【玩转 Postman 接口测试与开发2_017】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(下)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证8 导入官方契约测试集合9 契约测试集合的详细配置9.1 env-apiKey 的创建与设置9.2 env-workspaceId 的设置9.3 Mock 服务器及 env-server 的配置9.4 API 测试实例的配置…

使用DeepSeek R1 + 了解部署

官网注册 R1模型&#xff0c;推理模型 参考视频理解 理解大语言模型的本质 大模型在训练时是将内容token化的大模型知识是存在截止时间的大模型缺乏自我认知、自我意识记忆有限输出长度有限 智商理解&#xff0c;例如下面的DeepSeek的测试&#xff1a; 用DeepSeek 官网手…

2024年12月 Scratch 图形化(三级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;三级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、选择题(共18题&#xff0c;共50分) 第 1 题 气温和对应的穿衣建议如下表所示&#xff0c;下列选项能正确给出穿衣建议的是&#xff1f;&#xff08; &#xff09; A. …

Gauss高斯:建表语法,存储方式,OLTP和OLAP,系统时间,数组,分组(grouping set,rollup)

数据库和表的语法 数据库 表 oracle,高斯, hive的默认存储方式都是列式存储 存储方式 高斯数据库&#xff08;GaussDB&#xff09;支持列式存储和行式存储 OLTP 与 OLAP OLTP&#xff08;联机事务处理&#xff0c;Online Transaction Processing&#xff09;是一种用于管理…

数据中心服务器对PCIe测试的需求、挑战和应用

人工智能和机器学习技术的迅猛发展&#xff0c;尤其是大语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;对计算资源和数据传输速度提出了更高的要求&#xff0c;从而激发了对更高带宽解决方案的迫切需求。PCIe作为数据中心服务器间互联的主力军&#xff0c;承担着高速数…

(9)下:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同。小例子的实验

&#xff08;4&#xff09;本实验代码的蓝本&#xff0c;是伊圣雨老师里的课本里的代码&#xff0c;略加改动而来的。 以下是 服务器端的代码&#xff1a; 每当收到客户端的报文时&#xff0c;就测试一下对应的 epoll 事件里的事件标志&#xff0c;不读取报文内容&#xff0c;…

【C语言篇】“三子棋”

一、游戏介绍 三子棋&#xff0c;英文名为 Tic - Tac - Toe&#xff0c;是一款简单而经典的棋类游戏。游戏在一个 33 的棋盘上进行&#xff0c;两名玩家轮流在棋盘的空位上放置自己的棋子&#xff08;通常用 * 和 # 表示&#xff09;&#xff0c;率先在横、竖或斜方向上连成三个…

wsl+phpstorm+xdebug|windows子系统配置phpstorm开发调试|断点调试

安装wsl 安装apache php 安装xdebug扩展&#xff0c;并配置 这里是通过宝塔9.4面板安装的xdebug3.0 [xdebug] xdebug.modedebug xdebug.start_with_requesttrue xdebug.discover_client_hosttrue xdebug.client_host127.0.0.1配置PHPSTORM 注意&#xff1a;新建服务器一定要…

20250204将Ubuntu22.04的默认Dash的shell脚本更换为bash

20250204将Ubuntu22.04的默认Dash的shell脚本更换为bash 2025/2/4 23:45 百度&#xff1a;dash bash https://blog.csdn.net/2201_75772333/article/details/136955776 【Linux基础】dash和bash简介 Dash&#xff08;Debian Almquist Shell&#xff09;和 Bash&#xff08;Bou…

Meta财报解读:营收超预期,用户增长放缓,AI与元宇宙仍是烧钱重点

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

如可安装部署haproxy+keeyalived高可用集群

第一步&#xff0c;环境准备 服务 IP 描述 Keepalived vip Haproxy 负载均衡 主服务器 Rip&#xff1a;192..168.244.101 Vip&#xff1a;192.168.244.100 Keepalive主节点 Keepalive作为高可用 Haproxy作为4 或7层负载均衡 Keepalived vip Haproxy 负载均衡 备用服务…

LabVIEW如何有效地进行数据采集?

数据采集&#xff08;DAQ&#xff09;是许多工程项目中的核心环节&#xff0c;无论是测试、监控还是控制系统&#xff0c;准确、高效的数据采集都是至关重要的。LabVIEW作为一个图形化编程环境&#xff0c;提供了丰富的功能来实现数据采集&#xff0c;确保数据的实时性与可靠性…

整个 PVE 系统崩溃后,怎么恢复 PVE 给虚拟机分配的虚拟硬盘中的数据

背景 我有一块 ssd 用于 PVE 系统和 虚拟机 安装&#xff0c;还有一块 HDD 用来存储数据。这个HDD按照 把 PVE 下的机械硬盘&#xff08;非SSD系统盘&#xff09;分配给虚拟机使用 进行挂载和配置。主要过程是 PVE中 “数据中信” -> “存储” -> “添加” -> “目录…

Linux: 网络基础

1.协议 为什么要有协议&#xff1a;减少通信成本。所有的网络问题&#xff0c;本质是传输距离变长了。 什么是协议&#xff1a;用计算机语言表达的约定。 2.分层 软件设计方面的优势—低耦合。 一般我们的分层依据&#xff1a;功能比较集中&#xff0c;耦合度比较高的模块层…

Python sider-ai-api库 — 访问Claude、llama、ChatGPT、gemini、o1等大模型API

目前国内少有调用ChatGPT、Claude、Gemini等国外大模型API的库。 Python库sider_ai_api 提供了调用这些大模型的一个完整解决方案&#xff0c; 使得开发者能调用 sider.ai 的API&#xff0c;实现大模型的访问。 Sider是谷歌浏览器和Edge的插件&#xff0c;能调用ChatGPT、Clau…