YUV422转BGR888(海思3516平台)

265 篇文章 0 订阅
60 篇文章 0 订阅
#include "hi_comm_ive.h"
#include "mpi_ive.h"

#pragma pack(1)

typedef struct{
    short type;
    int size;
    short reserved1;
    short reserved2;
    int offset;
} BMPHeader;

typedef struct{
    int size;
    int width;
    int height;
    short planes;
    short bitsPerPixel;
    unsigned compression;
    unsigned imageSize;
    int xPelsPerMeter;
    int yPelsPerMeter;
    int clrUsed;
    int clrImportant;
} BMPInfoHeader;

#pragma pack()


int saveBMPFile(unsigned char* src, int width, int height, const char* name){
	BMPHeader hdr;
	BMPInfoHeader infoHdr;
    int ret = 0;

	FILE* fp = NULL;
    if(NULL == src) 
    {
		return (-1);
    }

    fp = fopen(name,"wb");
	if(NULL == fp)
    {
		printf("saveBMPFile: Err: Open!\n");
		return (-1);
	}

	infoHdr.size	= sizeof(BMPInfoHeader);
	infoHdr.width	= width;
	infoHdr.height	= 0 - height;
	infoHdr.planes	= 1;
	infoHdr.bitsPerPixel	= 24;
	infoHdr.compression		= 0;
	infoHdr.imageSize		= width*height;
	infoHdr.xPelsPerMeter	= 0;
	infoHdr.yPelsPerMeter	= 0;
	infoHdr.clrUsed			= 0;
	infoHdr.clrImportant	= 0;

	hdr.type	= 0x4D42;
	hdr.size	= 54 + infoHdr.imageSize*3;
	hdr.reserved1	= 0;
	hdr.reserved2	= 0;
	hdr.offset	= 54;


    //BGR2RGB
    int i;
    int temp;
    for(i = 0;i < width*height;i++)
    {
        temp = src[i*3];
        src[i*3] = src[i*3 + 2];
        src[i*3 + 2] = temp;
    }

	fwrite(&hdr, sizeof(hdr), 1, fp);
  	fwrite(&infoHdr, sizeof(infoHdr), 1, fp);
 	fwrite(src, sizeof(unsigned char), width*height*3, fp); //TODO:
    fflush(fp);

	if(ferror(fp)){
		printf("saveBMPFile: Err: Unknown!***\n");
	}

	fclose(fp);
    fp = NULL;

	return 0;
}

int main()
{
    HI_VOID *pVirtSrc = NULL;
	HI_VOID *pVirtDst = NULL;
	IVE_SRC_INFO_S stSrc;
	IVE_MEM_INFO_S stDst;
    unsigned int * pImage = NULL;

    stSrc.enSrcFmt = IVE_SRC_FMT_SP422;
    stSrc.stSrcMem.u32Stride = nWidth;
    stSrc.stSrcMem.u32PhyAddr = frameInfo->phyAddr;
    stSrc.u32Width = nWidth;
    stSrc.u32Height = nHeight;

    stDst.u32Stride = nWidth;

    IVE_HANDLE IveHandle;
    HI_BOOL bInstant = HI_TRUE;
    IVE_CSC_CTRL_S stCscCtrl;
    stCscCtrl.enOutFmt = IVE_CSC_OUT_FMT_PACKAGE;
    stCscCtrl.enCscMode = IVE_CSC_MODE_VIDEO_BT601_AND_BT656;

    //s32Ret = HI_MPI_SYS_MmzAlloc_Cached (&pstSrc->stSrcMem.u32PhyAddr,&pVirtSrc,"User", HI_NULL, pstSrc->u32Height * pstSrc->stSrcMem.u32Stride*2);
    //memset(pVirtSrc,1,pstSrc->u32Height * pstSrc->stSrcMem.u32Stride);
    ret = HI_MPI_SYS_MmzAlloc_Cached (&stDst.u32PhyAddr, &pVirtDst,"User", HI_NULL, stSrc.u32Height * stDst.u32Stride);
    //s32Ret = HI_MPI_IVE_DMA(&IveHandle, &stSrc, &stDst, bInstant);
    //HI_MPI_SYS_MmzFree(stSrc.stSrcMem.u32PhyAddr, pVirtSrc);
    HI_MPI_SYS_MmzFree(stDst.u32PhyAddr, pVirtDst);
    ret=HI_MPI_IVE_CSC(&IveHandle,&stSrc,&stDst,&stCscCtrl,bInstant);
    if(ret==HI_FAILURE)
    {
        printf("YUV Convert to RGB failed!\n");
        return HI_FAILURE;
    }

    pImage = HI_MPI_SYS_Mmap(stDst.u32PhyAddr, nLengthImage/2*3);
    if(NULL == pImage)
    {
        msg_print( "HI_MPI_SYS_Mmap err!\n");
        return NVD_FALSE;
    }

    ret = saveBMPFile((Byte*)pImage, nWidth, nHeight, "/mnt/rgb.dib");
    if(0 != ret)
    {
        printf( "saveBMPFile error\n");
        return;
    }
    printf("saveBMPFile done!\n");

    //uninit();
}


 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: YUV422和RGB888表示两种不同的图像格式。YUV422是一种颜色格式,也称为YUV分量格式,它将图像分为明亮度(Y)和两个色度(U、V)分量。而RGB888则是一种原色格式,包含红色(R)、绿色(G)和蓝色(B)三个色彩分量。 将YUV422换为RGB888,需要进行以下步骤: 1. 首先,从YUV422图像中提取出Y、U和V三个分量。 2. 对于每个像素点,将U和V的值进行插值,使其与Y的分辨率相同。这是因为Y分量的分辨率通常是U和V的两倍。 3. 使用以下公式将YUV分量换为RGB分量: R = Y + 1.402*(V-128) G = Y - 0.344136*(U-128) - 0.714136*(V-128) B = Y + 1.772*(U-128) 其中,Y的范围是0~255,U和V的范围是-128~127。 4. 对于每个像素点,将得到的RGB分量的值进行截断操作,使其范围限制在0~255之间。 5. 将得到的RGB888格式图像保存或使用。 需要注意的是,由于YUV422和RGB888之间的颜色空间换是有损的,因此在换过程中会存在一定的色彩信息的丢失。此外,还需要考虑图像的显示设备和显示算法对颜色空间的支持和适配问题。 总结起来,将YUV422换为RGB888需要从YUV422图像中提取出分量,并使用相应的换公式将其换为RGB分量。这种换常用于视频处理、图像处理和计算机视觉应用中。 ### 回答2: YUV422和RGB888是两种不同的颜色编码格式。YUV422是一种亮度和色度分离的编码格式,其中每个亮度采样点对应两个色度采样点。而RGB888是一种将红、绿和蓝三个颜色通道分别编码的格式。 要将YUV422换为RGB888,需要进行一定的计算和处理。具体步骤如下: 1. 读取YUV422数据,其中Y表示亮度分量,U和V表示色度分量。 2. 对每个亮度值Y进行处理,将其换为范围为0-255的RGB亮度值。可以使用以下公式进行换: R = Y + 1.402 * (V - 128) G = Y - 0.344136 * (U - 128) - 0.714136 * (V - 128) B = Y + 1.772 * (U - 128) 其中,R、G和B分别表示红、绿和蓝通道的亮度值。 3. 对于每一个U和V值,由于UV分量的采样是每两个Y像素共用一个UV像素,需要复制两次。即对于U和V值,需要将其复制到每个对应的Y像素点上。 4. 对于计算得到的RGB亮度值,将其存储为RGB888格式,即每个像素包含8位红、绿和蓝三个通道。 5. 重复步骤2-4,直到所有YUV422数据都被换为RGB888格式。 通过以上步骤,就可以将YUV422格式的图像数据换为RGB888格式的图像数据。需要注意的是,换过程中需要考虑范围的问题,确保所有数值在正确的范围内。 ### 回答3: YUV422和RGB888都是存储和处理图像的色彩模式。YUV422采用亮度(Y)和色度(UV)两个分量来表示图像的颜色信息,相比于RGB模式具有较低的数据传输和存储需求。而RGB888则使用红、绿、蓝三个分量来表示图像的颜色信息,每个分量占用8个位(即每个分量的取值范围为0-255)。 将YUV422换为RGB888的过程主要分为两步:首先是将YUV422分量换为YUV444格式,然后再将YUV444格式换为RGB888格式。 YUV422YUV444的换可以通过简单的插值来实现,可以将传输模式从“YUYV…”换为“YUV…”。换过程中,将每一个YUV422像素点扩展成两个UV分量,将原来的Y分量复制到新的像素点中,然后插入新增的UV分量。 接下来,将得到的YUV444格式换为RGB888格式。首先,将YUV444中的每个分量减去所需的偏移量以调整范围,然后使用相应的矩阵乘法运算将YUV444换为RGB。 具体的换过程如下: 1. 将Y分量调整为0-255范围内的亮度值。 2. 对U和V分量进行调整:减去128后乘以相应的系数,得到U'和V'。 3. 根据以下矩阵乘法计算R、G、B分量的值: R = Y + 1.402 * (V' - 128) G = Y - 0.34414 * (U' - 128) - 0.71414 * (V' - 128) B = Y + 1.772 * (U' - 128) 通过上述步骤,我们成功将YUV422格式的图像换为RGB888格式的图像,完成了色彩空间的换。这样,我们就可以使用RGB888格式的图像进行后续的图像处理和显示。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值