很遗憾第一次实战并没有达到我想要的效果,想要达到的目的是把一个n帧的3840*1920的YUV420p的图像均分成64份。
首先来看一下YUV4:2:0格式的存储格式,首先可以参照大神写的http://blog.csdn.net/lin453701006/article/details/53053185这篇博文了解一下YUV格式。
简单来讲,假设有个4*4的像素点,对于420P而言,不妨假设这四个像素点Y值都为1,U值为2,V值为3
那么YUV的实际存储方式为
1111
1111
1111
1111
22
22
33
33
也就是一个4*4的矩阵加两个长宽为这个矩阵一半的矩阵。
下面就是实际的代码:
首先是主函数,其中while(1)和readsize控制按帧读取,读取到3840*1920的一帧后,要把它们分成64个小文件输出,因此设置了ij表示第i行第j列的第几个小块。其中filename函数可以根据ij设置输出的文件名。YUVslice函数的功能是将图像的64分之一放到output_buff中。
#include "YUV.h"
#define _CRT_SECURE_NO_WARNINGS
#define IMAGEWIDTH 3840 //图像的宽
#define IMAGEHEIGHT 1920 //高
#define NUM 64
//#define Y_SIZE (IMAGEWIDTH*IMAGEHEIGHT)
#define YUV420_SIZE (Y_SIZE*3/2) //4:2:0格式
int main()
{
FILE * input_yuvfile; //输入YUV420文件的指针
if (NULL == (input_yuvfile = fopen("Driving_in_Country_3840x1920_388p.yuv", "rb")))
{
printf("File input is can't open!\n");
return -1;
}
int readsize;
unsigned char *input_buff;
input_buff = (unsigned char *)malloc(YUV420_SIZE *