在实际的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