nvJPEG压缩图像

基于nvJpeg编解码图片 NvJpeg库提供了高性能,基于GPU加速的JPEG编解码功能,通常用于深度学习及多媒体应用软件中的常用图像数据格式的处理。 阅读详情

定义用到的变量

nvjpegHandle_t nvjpeg_handle;         // nvjpeg句柄
nvjpegEncoderState_t encoder_state;   // 
nvjpegEncoderParams_t encoder_params; // 

准备图像数据,输入数据指针应该是显存指针,每个颜色分量分别存储

nvjpegImage_t input;
nvjpegInputFormat_t input_format = NVJPEG_INPUT_BGR;

int image_width = 2448;
int image_height = 2048;
int channel_size = image_width * image_height;
for (int i = 0; i < 3; i++)
{
	input.pitch[i] = image_width;
	cudaMalloc((void**)&(input.channel[i]), channel_size);
	// set value of this channel
	cudaMemset(input.channel[i], 50 * 40 * i, channel_size);
}

准备环境

nvjpegBackend_t backend = NVJPEG_BACKEND_DEFAULT;
nvjpegCreate(backend, nullptr, &nvjpeg_handle));
nvjpegEncoderStateCreate(nvjpeg_handle, &encoder_state, NULL);
nvjpegEncoderParamsCreate(nvjpeg_handle, &encoder_params, NULL);

设置参数

nvjpegEncoderParamsSetEncoding(encoder_params, nvjpegJpegEncoding_t::NVJPEG_ENCODING_PROGRESSIVE_DCT_HUFFMAN, NULL);
nvjpegEncoderParamsSetOptimizedHuffman(encoder_params, 1, NULL);
nvjpegEncoderParamsSetQuality(encoder_params, 70, NULL);
nvjpegEncoderParamsSetSamplingFactors(encoder_params, nvjpegChromaSubsampling_t::NVJPEG_CSS_420, NULL);

执行压缩

nvjpegEncodeImage(nvjpeg_handle, encoder_state, encoder_params, &input, input_format, image_width, image_height, NULL)

取出二进制数据

std::vector<unsigned char> obuffer;
size_t length;
nvjpegEncodeRetrieveBitstream( nvjpeg_handle, encoder_state, NULL, &length, NULL);

obuffer.resize(length);
nvjpegEncodeRetrieveBitstream( nvjpeg_handle, encoder_state, obuffer.data(), &length, NULL));

保存二进制数据

std::ofstream outputFile("result.jpg", std::ios::out | std::ios::binary);
outputFile.write(reinterpret_cast<const char *>(obuffer.data()), static_cast<int>(length));

完整代码

int testEncodeImage()
{
	nvjpegHandle_t nvjpeg_handle;
	nvjpegEncoderState_t encoder_state;
	nvjpegEncoderParams_t encoder_params;

	cudaEvent_t ev_start, ev_end;
	CHECK_CUDA(cudaEventCreate(&ev_start));
	CHECK_CUDA(cudaEventCreate(&ev_end));

	size_t pdata_len = 1024 * 1024;
	unsigned char *pdata_dev = nullptr;
	CHECK_CUDA(cudaMalloc((void**)&pdata_dev, pdata_len));
	

	nvjpegImage_t input;
	nvjpegInputFormat_t input_format = NVJPEG_INPUT_BGR;
	int image_width = 2448;
	int image_height = 2048;
	int channel_size = image_width * image_height;

	for (int i = 0; i < 3; i++)
	{
		input.pitch[i] = image_width;
		CHECK_CUDA(cudaMalloc((void**)&(input.channel[i]), channel_size));
		CHECK_CUDA(cudaMemset(input.channel[i], 50 * 40 * i, channel_size));
	}

	nvjpegBackend_t backend = NVJPEG_BACKEND_DEFAULT;

	CHECK_NVJPEG(nvjpegCreate(backend, nullptr, &nvjpeg_handle));
	
	CHECK_NVJPEG(nvjpegEncoderParamsCreate(nvjpeg_handle, &encoder_params, NULL));
	CHECK_NVJPEG(nvjpegEncoderStateCreate(nvjpeg_handle, &encoder_state, NULL));

	// set params
	nvjpegEncoderParamsSetEncoding(encoder_params, nvjpegJpegEncoding_t::NVJPEG_ENCODING_PROGRESSIVE_DCT_HUFFMAN, NULL);
	nvjpegEncoderParamsSetOptimizedHuffman(encoder_params, 1, NULL);
	nvjpegEncoderParamsSetQuality(encoder_params, 70, NULL);
	nvjpegEncoderParamsSetSamplingFactors(encoder_params, nvjpegChromaSubsampling_t::NVJPEG_CSS_420, NULL);

	CHECK_CUDA(cudaEventRecord(ev_start));
	CHECK_NVJPEG(nvjpegEncodeImage(nvjpeg_handle, encoder_state, encoder_params, &input, input_format, image_width, image_height, NULL));
	CHECK_CUDA(cudaEventRecord(ev_end));

	std::vector<unsigned char> obuffer;
	size_t length;
	CHECK_NVJPEG(nvjpegEncodeRetrieveBitstream(
		nvjpeg_handle,
		encoder_state,
		NULL,
		&length,
		NULL));

	obuffer.resize(length);
	CHECK_NVJPEG(nvjpegEncodeRetrieveBitstream(
		nvjpeg_handle,
		encoder_state,
		obuffer.data(),
		&length,
		NULL));

	std::ofstream outputFile("a.jpg", std::ios::out | std::ios::binary);
	outputFile.write(reinterpret_cast<const char *>(obuffer.data()), static_cast<int>(length));

	cudaEventSynchronize(ev_end);

	float ms;
	cudaEventElapsedTime(&ms, ev_start, ev_end);
	std::cout << "time spend " << ms << " ms" << std::endl;
	
	return 0;
}

 时间消耗

2440*2048大小的RGB三色图像压缩耗时4.33ms,使用CPU单线程压缩耗时98ms(opencv)。

使用nvjpeg解码jpeg图像 在深度学习的应用场景中,常常会涉及接收来自多个相机的图像数据,例如在监控系统、自动驾驶多传感器融合等领域。然而,大量的图像数据传输会消耗大量的带宽,为了解决这一问题,在传输过程中通常会对图像进行JPEG编码。通过这种编码方式,可以在保证一定图像质量的前提下,大大减少数据量,从而加快数据传输速度。但这也带来新的问题:在对图像进行模型推理之前,我们需要先对这些JPEG编码的数据进行解码,然后再开展后续的预处理和推理工作。图像的解码效率在很大程度上直接影响整个系统的执行速度。 阅读详情

相关推荐

NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库

NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库 Leveraging the Hardware JPEG Decoder and NVIDIA nvJPEG Library on NVIDIA A100 GPUs 根据调查,平均每个人产生1.2万亿张图片,这些图片是由手机或数码相机拍摄的。这种图像的存储,特别是以高分辨率的原始格式存储,占用了大量的内存。 JPEG指的是联合摄影专家组(Joint Photography Experts Group),该组于2017年庆祝了

吴建明wujianming_110117 3022

nvjpeg 压缩图片成jpeg格式

最主要的工作,是把GRB三色通道中的对应值(YUV中对应的颜色表述值)存储到vjpegImage_t 结构中对应的值,其他按照用例就可以了。我这里采用的cuda版本是11.7以上,应该11.2以上就应该没问题了。// 用完销毁,避免显存泄露。

xiaohei1119的博客 1135

nvJPEG Codec库

nvJPEG Codec库 nvJPEG库是高性能的GPU加速库,用于解码,编码和转码JPEG格式的图像。nvJPEG2000库用于解码JPEG 2000格式的图像。与单CPU解码相比,依赖nvJPEG或nvJPEG2000进行解码的应用程序可提供更高的吞吐量和更低的延迟。 nvJPEG nvJPEG库为计算机视觉应用中使用的常见JPEG格式(例如图像分类,对象检测和图像分割)提供低延迟解码,编码和转码。 nvJPEG主要功能 • 同时使用CPU和GPU的混合解码 • 在A100 GPU上进行基线JPEG解

吴建明wujianming_110117 850

彩色24位图像编码/压缩(基于nvjpeg.h库)

3、通过调节CHECK_NVJPEG(nvjpegEncoderParamsSetQuality(encoder_params, 80, NULL));输出图像:彩色24位JPG/JPEG图像(其他格式的图像如PNG应该也可以,不过我没测试,可以自己试试。1、运行环境:cuda11.6+opencv3.4.16+vs2022。输入图像:彩色24位RGB颜色空间的BMP图像。函数中的质量因子,可调节图像的压缩比。

weixin_53173024的博客 643

nvJPEG库

nvJPEG库 GPU加速的JPEG解码器,编码器和代码转换器 nvJPEG库是高性能的GPU加速库,用于解码,编码和转码JPEG格式的图像。nvJPEG2000库用于解码JPEG 2000格式的图像。与仅CPU解码相比,依赖nvJPEG或nvJPEG2000进行解码的应用程序,可提供更高的吞吐量和更低的延迟。 nvJPEG nvJPEG库为计算机视觉应用中使用的常见JPEG格式(例如图像分类,对象检测和图像分割)提供低延迟解码,编码和转码。 nvJPEG主要功能 • 同时使用CPU和GPU的混合解码 •

吴建明wujianming_110117 3197

ROS图像传输优化:如何用CompressedImage减少80%带宽消耗(附代码对比)

本文深入探讨了ROS中CompressedImage的应用,通过三种主流压缩方案(cv_bridge、手动OpenCV编码、image_transport)的技术对比与实战代码,展示了如何优化图像传输以减少80%带宽消耗。特别适合机器人视觉和无人机图传等场景,帮助开发者实现高效数据传输。

weixin_42525289的博客 338

图像压缩之NVJPEG

使用JPEG图像数据流作为输入;从数据流中检索图像的宽度和高度,并使用检索到的信息来管理 GPU 内存分配和解码。提供专用 API 用于从原始 JPEG 图像数据流中检索图像信息。nvJPEG 库支持以下内容:JPEG 选项:基线和渐进式 JPEG 解码/编码8 位像素霍夫曼比特流解码多达 4 通道 JPEG 比特流8 位和 16 位量化表以下是 3 个颜色通道 Y、Cb、Cr(Y、U、V)的色度子采样:4:4:44:2:24:2:04:4:04:1:1。

qq_41627642的博客 932

在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库

在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库 根据调查,普通人产生的1.2万亿张图像可以通过电话或数码相机捕获。这样的图像的存储,尤其是以高分辨率的原始格式,会占用大量内存。 JPEG指的是联合图像专家组,该组织于2017年庆祝成立25周年。JPEG标准指定了编解码器,该编解码器定义了如何将图像压缩为字节的位流并解压缩回图像。 JPEG编解码器的主要目的是最小化照片图像文件的文件大小。JPEG是一种有损压缩格式,这意味着它不存储原始图像的完整像素数据。JPEG的优点

吴建明wujianming_110117 2682

模型部署——ros 压缩图像解码加速

解码JPEG压缩图像通常使用的工具包括 OpenCV、Pillow 和 libjpeg 和 cuda版本的 nvjpeg等库。1.调用cv::imdecode 解码 ,耗时太大。

xiaohu的博客 691

使用 GPU 加速的 nvImageCodec 推进医学影像解码

本文将深入分析 DICOM 医学影像的解码功能。AWS HealthImaging 利用 NVIDIA 的来实现此功能。我们将深入探讨图像解码的复杂性,并介绍 AWS HealthImaging,以及 GPU 加速解码解决方案带来的进步。通过 GPU 加速的 nvJPEG2000 库,踏上在 AWS HealthImaging 中提高吞吐量和降低医疗影像解密成本的旅程,代表着在云环境中实现运营效率的一大步。这些创新有望节省大量成本,预测表明此类工作负载的潜在成本降低总计数亿美元。

大模型 1352

CUDA:使用nvJPEG解码多张图片的实例

/ -------------------使用nvJPEG进行解码--------------------// -------------------从文件读取JPEG数据-------------------

James_CODER的博客 957

CUDA nvjpeg库编码jpeg图像

本文介绍了基于GPU加速的JPEG编解码库nvJPEG及其性能测试。该库通过CUDA技术实现高性能JPEG编解码,特别适用于深度学习和大规模图像处理。实验对比了nvJPEG与OpenCV在AMD Ryzen7处理器和RTX5060显卡上的编码性能,测试采用4096x4096分辨率的三通道图像。文中详细给出了Visual Studio环境配置指南和完整的C++实现代码,包括错误处理、内存管理等关键环节。测试结果表明,nvJPEG相比OpenCV传统方法在编解码速度上有显著提升,为需要处理大批量图像的应用提供了

weixin_54474317的博客 718

使用CUDA的nvJPEG库进行图像编码

NVIDIA提供了一个高性能的图像编码库,即nvJPEG库,它利用CUDA技术来加速图像编码操作。这样,您就可以使用CUDA的nvJPEG库进行图像编码了。首先,确保您的系统中已经安装了CUDA,并正确设置了CUDA环境。从NVIDIA的开发者网站下载适用于您的CUDA版本的nvJPEG库,并按照提供的安装说明进行安装。在您的CUDA项目中,包含nvJPEG库所需的头文件和库文件。请注意,上述代码示例仅为演示目的,并可能需要根据您的具体应用进行适当的修改和调整。使用CUDA的nvJPEG库进行图像编码。

YOLO_CODE的博客 1108

当传统图像处理遇上GPU:nvJPEG在医疗影像中的降本增效实践

本文探讨了如何利用NVIDIA nvJPEG库优化医疗影像处理,特别是在DICOM解码中的高效转换。通过GPU加速解码、零拷贝内存管理和智能批处理技术,显著提升了医疗影像处理的吞吐量和延迟性能,为AI辅助诊断系统提供了强有力的支持。

code8的博客 615

使用CUDA将NV12格式转换为JPEG的代码

使用CUDA,将NV12格式的缓冲区编码为JPEG。代码可以编译,并直接运行。代码是https://blog.youkuaiyun.com/mikedai/article/details/79084092,进行了接口、对齐、编译功能。

使用nvm离线安装、管理node多版本以及配置环境变量(亲测)

使用nvm离线安装、管理node多版本以及配置环境变量(亲测)

JMHJAVA的专栏 1326

几天速通nvJPEG2000:GPU并行处理JEPG2000压缩算法

第四步最关键,这个库只能支持bmp等编码好的二进制格式,不能支持raw格式。通过阅读源码发现,本质上也是读取bmp等格式为像素数据,那么也无需将raw格式的dng图片转为bmp,再jpeg2000编码。几天整明白了nvJPEG这个库,并且在arm架构的英伟达jetson开发板,采用gpu并行,实际将DNG图片压缩为jpeg2000的格式:j2k。要做到移植,还需要保证安装的包(opencv等)也是arm架构,并且版本要合适。第五步,源码是按照批次循环处理的。然而,官方的例子给出的支持架构是x86。

qq_43658820的博客 511

IWR6843ISK+DCA1000EVM 本人遇到的所有报错和解决方案

本文详解了初次使用DCA1000EVM和mmave studio遇到的一系列的问题以及解决方法

2301_77883976的博客 3295

CUDALibrarySamples入门指南:10个技巧快速掌握GPU加速计算

CUDALibrarySamples是NVIDIA提供的开源项目,包含丰富的GPU加速库示例,涵盖数学运算、图像处理、信号处理、线性代数和数据压缩等多个领域。通过这些示例,开发者可以快速掌握如何利用CUDA库实现高效的GPU加速计算,提升应用程序性能。 ## 一、认识CUDALibrarySamples项目结构 CUDALibrarySamples项目结构清晰,包含多个子目录,每个子目录对应不

gitblog_00050的博客 1048

均匀直线阵的常规波束形成matlab

常规波束形成概述 波束形成是将基阵各阵元输出进行一定的处理,从而形成基阵空间指向性的技术。一个波束形成器可以对空间某方位的信号有响应,而抑制其他方位的信号,所以又被称为空域滤波。一般分为常规波束形成(CBF)和自适应波束形成(ABF)。 常规波束形成较为基础,一般又可以根据实现的途径不同,分为时延波束形成和频移波束形成。 时延波束形成 在各阵元间添加时延使波束控制于不同方位的方法成为时延波束形成。设定一个目标方向,当信号来源方向在该目标方向时,响应最大;信号来源于其他方向时,响应较小。将这种响应大小

Xujing1143的博客 2万+

STM32鱼塘水质监测系统设计与实现

物联网技术在农业领域的应用正逐步深入,其中传感器网络作为关键基础设施,通过实时数据采集与传输实现环境监测。基于STM32微控制器的嵌入式系统因其高性能和低功耗特性,成为物联网终端设备的理想选择。该系统通过DS18B20水温传感器、PH传感器和浊度传感器组成的多参数检测网络,配合4G通信模块实现水质数据的远程监控。在农业物联网场景中,这种解决方案不仅大幅降低了传统人工检测的成本,更能通过实时预警有效预防养殖损失。本文介绍的鱼塘水质监测系统正是这一技术的典型应用,展示了如何通过STM32和常见传感器构建高性价比

weixin_42173218的博客 620

14 年真题考频数据在手,408 复习规划还能凭感觉吗?

408 复习最大的成本,是把几百小时平均分给 4 门课、30 多个章节。cs-408 这个仓库把 2009 到 2022 年 14 年真题按考点逐题登记成了考频统计,再配上四科的章节笔记、刷题本和 OneNote 笔记,足够你把复习规划从"平均用力"改成"按数据下注"。这篇指南只做一件事:用仓库里的考频数据,给你排一轮能执行的三轮复习日程。 ## 摸底:先打开考频统计,给 408 做一次体检

gitblog_00805的博客 442

YOLO26科研优化:多损失函数(EIoU、SIoU等)融合,让边界框回归精度再上台阶

将原有损失函数替换为我们编写的MultiLoss。例如,在bbox_loss。

LXY_LOVE36的博客 170
上一篇: TensorRT入门介绍
下一篇: 使用LibTorch训练模型(pytorch c++)
Ango_Cango
博客等级 码龄15年 93粉丝 38原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ango_Cango

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值