JPG图片转YUV422数据文件
读取JPG图片文件,转成YUV422数据格式后,保存成数据文件。
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int save_image_data(unsigned char* data_buf, unsigned int image_size, const char* file_name)
{
FILE* fp = fopen(file_name, "wb+");
if (!fp) {
printf("(Error):%s Cannot open file %s\n", __func__, file_name);
return 1;
}
int ret = fwrite(data_buf, sizeof(unsigned char), image_size, fp);
if (ret != image_size) {
printf("write %s failed\n", file_name);
fclose(fp);
return 2;
}
fclose(fp);
return 0;
}
#define PHOTO_width 640
#define PHOTO_height 512
int main()
{
Mat src_s_img = imread("E:\\1.jpg");
Mat src_img;
resize(src_s_img, src_img, Size(PHOTO_width, PHOTO_height));
Mat yuv422[3];
cv::Mat yuv;
cvtColor(src_img, yuv, CV_BGR2YUV);
cv::split(yuv, yuv422);
cv::resize(yuv422[1], yuv422[1], cv::Size(yuv.cols / 2, yuv.rows));
cv::resize(yuv422[2], yuv422[2], cv::Size(yuv.cols / 2, yuv.rows));
unsigned char yuv_data[PHOTO_width * PHOTO_height * 2];
unsigned char* y_data = yuv422[0].data;
unsigned char* v_data = yuv422[1].data;
unsigned char* u_data = yuv422[2].data;
for (int i = 0; i < PHOTO_width * PHOTO_height; i++) {
if (i % 2) {
yuv_data[i * 2 + 0] = *u_data;
u_data++;
}
else {
yuv_data[i * 2 + 0] = *v_data;
v_data++;
}
yuv_data[i * 2 + 1] = *y_data;
y_data++;
}
save_image_data(yuv_data, PHOTO_width * PHOTO_height * 2, "img.raw");
return 0;
}