V4L2获取摄像头数据,数据格式为YUYV,但是需要保存为jpg使用;
上一次我们讲了如何编译安装libjpeg库,这次提供了示例代码,供测试,经过实际测试使用已经转换成功。
#include <stdio.h>
#include <jpeglib.h>
void yuyv_to_jpeg(unsigned char* yuyv_data, int width, int height, int quality, const char* output_file) {
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
JSAMPROW row_pointer[1];
FILE *outfile = fopen(output_file, "wb");
if (!outfile) {
printf("Error opening output jpeg file\n");
return;
}
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);
cinfo.image_width = width;
cinfo.image_height = height;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE);
jpeg_start_compress(&cinfo, TRUE);
JSAMPLE* rgb_data = (JSAMPLE*)malloc(width * height * 3);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x += 2) {
int yuyv_index = y * width * 2 + x * 2;
int rgb_index = y * width * 3 + x * 3;
int y1 = yuyv_data[yuyv_index];
int u = yuyv_data[yuyv_index + 1];
int y2 = yuyv_data[yuyv_index + 2];
int v = yuyv_data[yuyv_index + 3];
rgb_data[rgb_index] = y1 + 1.402 * (v - 128); // R
rgb_data[rgb_index + 1] = y1 - 0.344136 * (u - 128) - 0.714136 * (v - 128); // G
rgb_data[rgb_index + 2] = y1 + 1.772 * (u - 128); // B
rgb_data[rgb_index + 3] = y2 + 1.402 * (v - 128); // R
rgb_data[rgb_index + 4] = y2 - 0.344136 * (u - 128) - 0.714136 * (v - 128); // G
rgb_data[rgb_index + 5] = y2 + 1.772 * (u - 128); // B
}
row_pointer[0] = &rgb_data[y * width * 3];
jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
fclose(outfile);
free(rgb_data);
}
int main() {
// 读取yuyv数据
unsigned char* yuyv_data; // 假设已经读取到yuyv图像数据
int width, height; // 假设已经获得图像的宽度和高度
// 转换为jpg图像
const char* output_file = "output.jpg";
int quality = 80; // 图像质量[0-100],100表示最高质量
yuyv_to_jpeg(yuyv_data, width, height, quality, output_file);
return 0;
}
请注意,上述代码假设你已经获得了yuyv格式的图像数据,并提供了图像的宽度和高度。此代码将数据转换为RGB格式,并使用libjpeg库来编码为jpg图像文件。编码后的图像文件将保存在output.jpg
中。你可以根据实际情况进行修改和扩展。
代码来源于Chat AI
如何移植libjpeg,请点这里jpeglib库编译移植-优快云博客