xHiveAI Jetson NX盒子:jpeg图片编码

该文介绍了在AI处理中如何使用Nvidia的jpegencoder库以及一个名为libjpegenc.so的库进行JPEG图片的转换和压缩。libjpegenc.so提供了一站式的图片转换和压缩API,简化了操作流程。文章详细阐述了库的使用方法,包括初始化、图片处理和释放句柄的步骤,并给出了示例代码供参考。
摘要由CSDN通过智能技术生成

在实际的AI处理中,经常有保存和上传jpeg报警图片的操作。Nvidia提供的jpeg encoder库中只能对YUV图片来操作,我们盒子中的libjpegenc.so库提供了图片转换和jpeg压缩一体化的操作,一个API接口可以完成整个操作流程,大大简化了上层软件的操作。

获取示例代码

git clone https://github.com/apoidea-xhiveai/jetson.git

图片转换的代码路径为:jetson/jpeg_encoder

编译示例代码

copy代码到盒子上

scp -r pic_converter root@<ai box ip address>:/root

ssh登录盒子后,执行以下命令来编译代码:

cd /root/jpeg_encoder

make

编译成功后,生成可执行文件:jpeg_encoder

libjpegenc库的说明 

在代码树中,库的头文件为:jpegenc.h

1) 基本使用流程为,首先根据配置来创建一个jpeg操作句柄

/*
* Initialize the jpeg encoder
*/
JPEGEN_HANDLE_t JpegEncoderInit(JPEGEN_IN JpegEnSetting_t *config);

配置信息定义在JpegEnSetting_t结构体中: 

typedef struct _JpegEnSetting_t {
    int                 width;              
    int                 height;
    JpegEnPicFormat_t   fmt;     /*default: JPEGEN_PIC_FMT_YUV420*/
    JpegEnPicScale_t    scale;
    JpegEnPicCropRect_t crop;

    int                 quality; /*0: [75(default)]*/
    int                 play_id; /*multiple channel: 1, 2, 3...*/
} JpegEnSetting_t;

width:  输入图片的宽度

height: 输入图片的高度

fmt: 默认是JPEGEN_PIC_FMT_YUV420,如果图片格式为其他,在库内会自动实现像素格式的转换。

scale: 输出图片的resizing尺寸

crop: 裁剪图片的定义尺寸

quality: 默认是75. 最好的jpeg图片质量为100,但是更耗时。数字越低jpeg图片质量越差,但是压缩速度越快

play_id: 多路处理的id号

2) 对于每帧输入图片,调用下面一个API来实现jpeg图片的转换和压缩

这两个API本质实现一样的jpeg压缩操作,但是JpegEncoderProc_ffmpeg()直接接收ffmpeg decode出来的avframe,方便处理。JpegEncoderProc()则是接收一个填满图片数据的buffer。

/*
* Encode the YUV format picture into the jpeg format picture
*
* JPEGEN_HANDLE_t handle: the jpeg encoder handler
* void *src_pic:          YUV420/NV12 format picture data
* void **dest_jpeg:       return the encoded jpeg picture data
* int *dest_jpeg_sz:      the size of the jpeg picture
*/
int JpegEncoderProc(JPEGEN_IN JPEGEN_HANDLE_t handle,
                                   JPEGEN_IN  void           *src_pic,
                                   JPEGEN_OUT void        **dest_jpeg,
                                   JPEGEN_OUT int           *dest_jpeg_sz);

/*
* Encode the YUV format picture into the jpeg format picture
*
* JPEGEN_HANDLE_t handle: the jpeg encoder handler
* void *avframe:          ffmpeg AVFrame*
* void **dest_jpeg:       return the encoded jpeg picture data
* int *dest_jpeg_sz:      the size of the jpeg picture
*/
int JpegEncoderProc_ffmpeg(JPEGEN_IN JPEGEN_HANDLE_t handle,
                                                JPEGEN_IN  void           *avframe,
                                                JPEGEN_OUT void        **dest_jpeg,
                                                JPEGEN_OUT int           *dest_jpeg_sz);

3)转换全部完成后,释放句柄

/*
* Release the jpeg encoder
*/
void JpegEncoderRelease(JPEGEN_IN  JPEGEN_HANDLE_t handle); 

执行示例代码 

示例程序实现了一个简单的jpeg图片压缩功能:从文件读入某个尺寸的YUV420图片(从ffmpeg示例程序输出的yuv文件),然后压缩成jpeg图片,写入输出文件。

命令的格式如下:

./jpeg_encoder

./jpeg_encoder (compiled Jul 20 2022)

Usage ./jpeg_encoder [OPTION]

 -i <yuv420p file> 

 -o <jpeg file> 

 -w <the width of picture> 

 -h <the height of picture> 

例子:

./jpeg_encoder -i /root/ffmpeg/out.yuv -o 1.jpeg -w 1920 -h 1080 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值