C语言学习笔记(8)——第一次个人实战(YUV图像分割)

本文记录了一次使用C语言处理YUV420p图像的实战经历,尝试将3840*1920的图像均分为64份。通过解析YUV格式的存储方式,实现图像分割。在实现过程中遇到的问题是仅能输出第一帧的左上角部分,后续调试发现代码bug并修复,最终成功实现了图像分割功能。
摘要由CSDN通过智能技术生成

很遗憾第一次实战并没有达到我想要的效果,想要达到的目的是把一个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 * 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值