hisi3516下yuv图片到nnie bgr_u8c3格式转换

2023-05-16

首先要看的sdk文档(HiIVE API 参考)
其中详细说明了 IVE_IMAGE_TYPE_YUV420SP,IVE_IMAGE_TYPE_YUV420P,IVE_IMAGE_TYPE_YUV422SP,IVE_IMAGE_TYPE_U8C3_PACKAGE,IVE_IMAGE_TYPE_U8C3_PLANAR等文件格式,而我们也需要使用IVE提供的 HI_MPI_IVE_CSC 进行图片格式的转换,那么我们来看看这个函数:

/*****************************************************************************
*   Prototype    : HI_MPI_IVE_CSC
*   Description  : YUV2RGB\YUV2HSV\YUV2LAB\RGB2YUV color space conversion are supported.
*   Parameters   : IVE_HANDLE         *pIveHandle       Returned handle ID of a task         
*                  IVE_SRC_IMAGE_S    *pstSrc           Input source data:
*                                                       1. SP420\SP422 type for YUV2RGB\YUV2HSV\YUV2LAB;
*                                                       2. U8C3_PACKAGE\U8C3_PLANAR type for RGB2YUV;
*                  IVE_DST_IMAGE_S    *pstDst           Output result:
*                                                       1. U8C3_PACKAGE\U8C3_PLANAR typed for YUV2RGB\YUV2HSV\YUV2LAB;
*                                                       2. SP420\SP422 type for RGB2YUV;
*                  IVE_CSC_CTRL_S     *pstCscCtrl       Control parameters for CSC
*                  HI_BOOL             bInstant         For details, see HI_MPI_IVE_DMA.
*   Return Value : HI_SUCCESS: Success;Error codes: Failure.
*   Spec         : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels.
*                  The physical addresses of the input data and output data must be 16-byte-aligned. 
*                  The stride must be 16-pixel-aligned.

*****************************************************************************/

由于我们模型使用的是 IVE_IMAGE_TYPE_U8C3_PLANAR 此种数据格式,因此只能使用YUV2RGB,也就是注释中的第一种情况中的 SP420 to U8C3_PLANAR

再来看看从摄像头出来的图片格式吧,将图片7yuv打开,发现是YUV420 planar I420,对应到ive里的图片格式为IVE_IMAGE_TYPE_YUV420P.

因此在使用 HI_MPI_IVE_CSC 之前要先进行图片转换,简单一点,我们先将IVE_IMAGE_TYPE_YUV420P转换为IVE_IMAGE_TYPE_YUV420SP,再使用.

具体demo代码如下:

typedef struct tag_csc_s
{
        HI_S32  sWidth;
        HI_S32  sHeight;
        IVE_SRC_IMAGE_S stSrc;
        IVE_DST_IMAGE_S stDst;
        IVE_CSC_CTRL_S stCtrl;
}CSC_S;

void CreateCSC(CSC_S* pstCSC, HI_S32 sWidth, HI_S32 sHeight)
{
        HI_S32 s32Ret;
        HI_U32 u32Size;

        pstCSC->sWidth = sWidth;
        pstCSC->sHeight = sHeight;

        // input image
        memset(&pstCSC->stSrc,0,sizeof(IVE_SRC_IMAGE_S));
        pstCSC->stSrc.enType        = IVE_IMAGE_TYPE_YUV420SP;

        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&pstCSC->stSrc.au64PhyAddr[0], (HI_VOID **)&pstCSC->stSrc.au64VirAddr[0],
                                                                                 "InputImage", HI_NULL, sWidth * sHeight * 3 / 2);
        if(s32Ret != HI_SUCCESS)
        {
                printf("can't alloc InputImage memory for %x\n",s32Ret);
        }                        
        pstCSC->stSrc.u32Width      = sWidth;
        pstCSC->stSrc.u32Height     = sHeight;
        pstCSC->stSrc.au32Stride[0]  = sWidth;

        // SP420
        pstCSC->stSrc.au32Stride[1] = pstCSC->stSrc.au32Stride[0];
        pstCSC->stSrc.au64PhyAddr[1] = pstCSC->stSrc.au64PhyAddr[0] + pstCSC->stSrc.au32Stride[0] * pstCSC->stSrc.u32Height;
        pstCSC->stSrc.au64VirAddr[1] = pstCSC->stSrc.au64VirAddr[0] + pstCSC->stSrc.au32Stride[0] * pstCSC->stSrc.u32Height;

        // output image
        memset(&pstCSC->stDst,0,sizeof(IVE_DST_IMAGE_S));
        u32Size = sWidth * sHeight * 3;
        pstCSC->stDst.enType        = IVE_IMAGE_TYPE_U8C3_PLANAR;
        s32Ret = HI_MPI_SYS_MmzAlloc(&pstCSC->stDst.au64PhyAddr[0], (void**)&pstCSC->stDst.au64VirAddr[0],
                "OutputImage", HI_NULL, u32Size);
        if(s32Ret != HI_SUCCESS)
        {
                printf("can't alloc OutputImage memory for %x\n",s32Ret);
        }
        pstCSC->stDst.u32Width      = sWidth;
        pstCSC->stDst.u32Height     = sHeight;
        pstCSC->stDst.au32Stride[0]  = sWidth;

        pstCSC->stDst.au64VirAddr[1] = pstCSC->stDst.au64VirAddr[0] + pstCSC->stDst.u32Height * pstCSC->stDst.au32Stride[0];
        pstCSC->stDst.au64PhyAddr[1] = pstCSC->stDst.au64PhyAddr[0] + pstCSC->stDst.u32Height * pstCSC->stDst.au32Stride[0];
        pstCSC->stDst.au32Stride[1] = pstCSC->stDst.au32Stride[0];

        pstCSC->stDst.au64VirAddr[2] = pstCSC->stDst.au64VirAddr[1] + pstCSC->stDst.u32Height * pstCSC->stDst.au32Stride[1];       
        pstCSC->stDst.au64PhyAddr[2] = pstCSC->stDst.au64PhyAddr[1] + pstCSC->stDst.u32Height * pstCSC->stDst.au32Stride[1];
        
        pstCSC->stDst.au32Stride[2] = pstCSC->stDst.au32Stride[0];
       
        // ctrl
        memset(&pstCSC->stCtrl, 0, sizeof(IVE_CSC_CTRL_S));
        pstCSC->stCtrl.enMode = IVE_CSC_MODE_PIC_BT601_YUV2RGB;
}

void DestoryCSC(CSC_S* pstCSC)
{
        if (pstCSC->stSrc.au64PhyAddr[0] != NULL)
        {
                HI_MPI_SYS_MmzFree(pstCSC->stSrc.au64PhyAddr[0], pstCSC->stSrc.au64VirAddr[0]);
        }

        if (pstCSC->stDst.au64VirAddr[0] != NULL)
        {
                HI_MPI_SYS_MmzFree(pstCSC->stDst.au64PhyAddr[0], pstCSC->stDst.au64VirAddr[0]);
        }
}

void ReadYUV420pFile(IVE_IMAGE_S *pstImg, FILE *pFp)
{
        HI_U16 y;
        HI_U8 *pU8;
        HI_U16 height;
        HI_U16 width;
        HI_U8 *pUBuf;
        HI_U8 *pVBuf;
        HI_U16 x;
        int nShift;

        width = pstImg->u32Width;
        height = pstImg->u32Height;
        pU8 = pstImg->au64VirAddr[0];
        for (y = 0; y < height; y++)
        {
                if ( 1 != fread(pU8,width,1,pFp))
                {
                        printf("Read file fail\n");
                        return ;
                }

                pU8 += pstImg->au32Stride[0];
        }

        pUBuf = malloc(width * height / 4);
        pVBuf = malloc(width * height / 4);
        fread(pUBuf, 1, width * height / 4, pFp);
        fread(pVBuf, 1, width * height / 4, pFp);

        pU8 = pstImg->au64VirAddr[1];
        for (y = 0; y < height/2; y++)
        {
                nShift = y * width /2 ;
                for(x = 0; x < width/2; x++)
                {
                        pU8[2*x+0] = pVBuf[nShift + x];
                        pU8[2*x+1] = pUBuf[nShift + x];
                }
                pU8 += pstImg->au32Stride[1];
        }
        
        free(pUBuf);
        free(pVBuf);
}


void WriteYUV420spFile(IVE_IMAGE_S *pstImg, FILE *pFp)
{
        HI_U16 y;
        HI_U8 *pU8;
        HI_U16 height;
        HI_U16 width;

        width = pstImg->u32Width;
        height = pstImg->u32Height *3 /2;
        pU8 = pstImg->au64VirAddr[0];
        for (y = 0; y < height; y++)
        {
                if ( 1 != fwrite(pU8,width,1,pFp))
                {
                        printf("write file error, y = %d\n", y);
                        return ;
                }

                pU8 += pstImg->au32Stride[0];
        }
}

void WriteBGRPackFile(IVE_IMAGE_S *pstImg, FILE *pFp)
{
        HI_U16 y;
        HI_U8 *pU8;
        HI_U16 height;
        HI_U16 width;

        width = pstImg->u32Width;
        height = pstImg->u32Height*3;
        pU8 = pstImg->au64VirAddr[0];
        for (y = 0; y < height; y++)
        {
                if ( 1 != fwrite(pU8,width,1,pFp))
                {
                        printf("write file error, y = %d\n", y);
                        return ;
                }

                pU8 += pstImg->au32Stride[0];
        }
}

void TestCSC(HI_U8 * pu8VirAddr)
// void TestCSC()
{
    IVE_HANDLE hIveHandle;
    CSC_S stCSC;
    FILE *fIn;
    FILE *fOut;
    FILE *fMid;
    HI_CHAR *pchSrcFileName = "./pipe0_chn0_w1920_h1080_P420.yuv";
    HI_CHAR *pchDstFileName = "./pipe0_chn0_w1920_h1080_RGB.bgr";

    HI_CHAR *pchMidFileName = "./pipe0_chn0_w1920_h1080_SP420.yuv";


    fIn = fopen(pchSrcFileName,"rb");
    if(HI_NULL == fIn)
    {
        printf("Open in file %s fail\n",pchSrcFileName);
                return;
    }
    printf("aaaaaaaaaaaaaaaaaaaaa\n");
    fOut = fopen(pchDstFileName,"wb");
    if(HI_NULL == fOut)
    {
        printf("Open out file %s fail\n",pchDstFileName);
        fclose(fIn);
                return;
    }

    fMid = fopen(pchMidFileName,"wb");
    if(HI_NULL == fOut)
    {
        printf("Open out file %s fail\n",pchMidFileName);
        fclose(fIn);
                return;
    }



    int sWidth = 1920;
    int sHeight = 1080;

    printf("aaaaaaaaaaaaaaaaaaaaa\n");
    CreateCSC(&stCSC, sWidth,sHeight);
    ReadYUV420pFile(&stCSC.stSrc, fIn);

    WriteYUV420spFile(&stCSC.stSrc,fMid);
    HI_MPI_IVE_CSC(&hIveHandle, &stCSC.stSrc, &stCSC.stDst, &stCSC.stCtrl, HI_TRUE);

    //B
    memcpy(pu8VirAddr,stCSC.stDst.au64VirAddr[0],sWidth * sHeight);
    //G
    memcpy(pu8VirAddr+sWidth * sHeight,stCSC.stDst.au64VirAddr[1],sWidth * sHeight);
    //R
    memcpy(pu8VirAddr+sWidth * sHeight*2,stCSC.stDst.au64VirAddr[2],sWidth * sHeight);
    

    WriteBGRPackFile(&stCSC.stDst, fOut);
    DestoryCSC(&stCSC);

    fclose(fIn);
    fclose(fOut);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hisi3516下yuv图片到nnie bgr_u8c3格式转换 的相关文章

  • xcode6制作framework(使用第三方依赖框架)

    这两天由于会用到framework所以研究了一下framework的制作 xff0c 我用到了xcode6 1 AFNetworing 转载请注明http blog csdn net mengxiangyue 废话不多说了 xff0c 下面
  • OC项目中使用Swift

    OC项目中使用Swift 本文版权归作者所有 xff0c 如需转载请联系孟祥月 CSDN博客 xff1a http blog csdn net mengxiangyue 独立博客 xff1a http mengxiangyue com 最近
  • iOS9-by-Tutorials-学习笔记六:UIStackView-Auto-Layout-Changes

    iOS9 by Tutorials 学习笔记六 xff1a UIStackView Auto Layout Changes 本文版权归作者所有 xff0c 如需转载请联系孟祥月 CSDN博客 xff1a http blog csdn net
  • Java多线程4—线程同步问题+火车票售票系统

    在上一篇文章中写到了许多线程共享同一数据 xff0c 这种情况在现实的生活中也是经常发生的 xff0c 比如火车站的火车票售票系统 火车票售票系统是一个常年运行的系统 xff0c 为了满足乘客的需求 xff0c 我们不能只设一个窗口 xff
  • Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先

    首先我们先介绍一下这三个算法 xff0c 先来先服务是指按照进程到来的时间 xff0c 谁先来谁执行 短作业优先是指作业服务时间短的先执行 高响比优先是根据公式计算出优先权选出优先权最高的执行 xff0c 计算高响比优先权的公式 xff1a
  • Java中JTbale使用—设置单元格对齐方式

    作者 xff1a 孟祥月 博客 xff1a http blog csdn net mengxiangyue import java awt Color import java awt Component import javax swing
  • Spring Cloud 入门(1)-- 第一个 Kotlin 微服务

    最近公司需要使用 Spring Cloud 开发后台应用 xff0c 为了以后能够看懂后台代码 xff0c 所以决定学习一下 Spring Cloud 对于Spring Cloud和微服务的介绍 xff0c 各位自行网上搜索吧 本系列文章是
  • Spring Cloud 入门(2)-- 编写服务消费者

    上一篇文章创建了一个 user service 微服务 xff0c 本文编写一个消费者 xff0c 本文比较简单 1 目标 创建一个 movie service xff0c 该服务器也能够查询用户信息 xff0c 但是内部是通过调用 use
  • jquerymobile-7 导航和多页面固定导航

    在开发的过程中 xff0c 我们经常会遇到在页面的底部有一排按钮 xff0c 我们可以根据这些按钮切换页面 xff0c 或者执行一些动作 在jquerymobile中我们可以在footer和header上添加这样的导航 下面看一个例子代码
  • phonegap入门--4 Camera 摄像头

    今天周六了 每次到了周六就不知道干嘛去 好没劲啊 有在北京的如果周六也没劲的 可以联系我大家一起出去玩 qq598660766 没事干 那就写写博客吧 今天介绍一下Camera这个对象 camera对象提供对设备默认摄像头应用程序的访问 C
  • android focusableInTouchMode设置为true导致OnClick事件失效,点击两次生效

    在开发中遇到focusableInTouchMode ture导致OnClick事件 点击两次生效 导致达不到效果 所以要分析源码解决问题 当在xml布局文件中 设置focusableInTouchMode ture 时 表示触摸事件可以让
  • Android自定义控件基础

    采用自定义控件解决重复编写代码的问题 总共分三步 1 写好一个自定义模板布局 title XML span class hljs pi lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34
  • String,StringBuffer,StringBuilder的区别(优缺点)

    最近学习到StringBuffer xff0c 心中有好些疑问 xff0c 搜索了一些关于String xff0c StringBuffer xff0c StringBuilder的东西 xff0c 现在整理一下 关于这三个类在字符串处理中
  • Android真机获得root权限修改文件权限

    好久没有更新博客了 xff0c 最近因为重装了系统导致所有的配置都不存在了 xff0c 当要修改Android权限去查看数据库文件的时候 xff0c 发现又忘记了怎么去获得修改权限 xff08 其实第一次弄这个内容的时候就费了很大的劲 xf
  • Android完全自定义控件并且实现监听事件

    本篇文章带来Android的完全自定义控件 载体是自定义一个开关的控件 xff0c 并且能够响应事件 xff0c 首先我们先创一个项目 xff0c 名字就叫ToggleView xff0c 修改MainActivity span class
  • Android屏幕适配实战

    说一下在项目里面遇到的一个问题 xff0c 和解决思路 需求来源于运营小姐姐 xff0c 她们希望在App的搜索关键字前面加上图片醒目效果图如下 布局很简单左边一个SimpleDraweeView xff0c 右边一个TextView xf
  • 定制阿里代码检查,实现你自己的代码规范检查

    几个月前 xff0c 阿里开源了p3c xff0c 我也接到了老大交给我的技术改造 是这样的 xff0c app是老项目了 xff0c 半年前接入了ARouter xff0c 由于Activity繁多 xff0c 就没有去全局支持ARout
  • Fresco内部诟病引起的初次从网络加载PNG图片失败

    如题描述 xff0c 这个问题在项目中存在已久 xff0c 今天由于自己的功能在首页 xff0c 初次启动的体验极其糟糕 xff0c 所以硬下头皮把这个问题解决了 先来描述一下怎么样一个差的体验吧 就是当我第一次加载网络PNG xff08
  • 华为OpenEuler体验系列(20)-树莓派 安全渗透测试环境安装

    一 下载镜像 xff1a 地址 xff1a https www openeuler org zh download 二 格式化TF卡和烧录系统 使用过的SD卡 xff0c 用SD Card Formatter格式化SD卡 选择好SD卡后格式
  • Ubuntu开机没有图形界面 进入tty的拯救方法

    Ubuntu开机没有图形界面 进入tty的拯救方法 1 从命令行模式登录2 检查是否可以连网3 安装图形界面参考 由于卸载软件的过程中误删了系统图形界面相关的文件 xff0c 导致开机无法进入图形界面 xff0c 需要通过命令重新安装 1

随机推荐

  • 什么是人工智能?

    Extinguished philosophies lie about the cradle of every science as the strangled snakes beside that of Hercules adapted
  • android 11.0 SystemUI手势上滑显示导航栏和隐藏导航栏

    1 概述 在11 0的产品开发中 对于SystemUI导航栏状态栏的功能定制需求 有要求需要通过上滑来控制导航栏显示 然后3秒钟后自动消失导航栏 实现一个通过手势上滑显示导航栏的需求 2 SystemUI手势上滑显示导航栏和隐藏导航栏相关核
  • 电脑专业英语

    电脑专业英语 1 file n 文件 xff1b v 保存文件 2 command n 命令 xff0c 指令 3 use v 使用 xff0c 用途 4 program n 程序 5 line n 数据 xff0c 程序 行 xff0c
  • 关于极大连通子图与极小连通子图的解释

    对于极大连通子图 xff0c 我们可以把它分成3各部分来看 1 必须是子图 xff08 子图中的顶点 边都是原图的子集 xff09 2 连通 xff08 对于两个顶点u v xff0c 如果存在u到v的边 xff0c 那这两个点就是连通的
  • 公司信息系统架构建设规划

    企业的信息化建设的基础是构建企业的信息系统架构 xff08 也可称之为信息化架构 xff09 xff0c 信息系统架构又由应用架构 数据架构 技术架构和治理架构4部分组成 xff0c 本建议书主要以技术架构 应用架构以及技术架构为对象加以说
  • C#使用rabbitmq (简单例子)

    首先在visual studio项目里面用nuget工具加入 easyNetQ DLL 然后做一个help类 using System using System Collections Generic using System Linq u
  • 我的2013,梦在路上

    我的2013 xff0c 在路上 今年最后一次给姐姐打电话 xff0c 她在那里像我炫耀自己和爸爸妈妈一起跨年 xff0c 说1314的意义 xff0c 而我还在北京苦逼着 回想2013年对于我来说 xff0c 或许是不错的一年 这一年我进
  • 事务是什么?

    事务 xff1a 简单来说 xff0c 事务就是几个操作要作为一个处理单元来完成 xff0c 要么全部完成 xff0c 要么全部不完成 事务可以是一条SQL语句 xff0c 也可以是多条SQL语句或者整个程序 事务日志 xff1a 重做日志
  • 各种加解密算法比较

    一 加密 算法介绍 对称加密算法 对称加密算法用来对敏感数据等信息进行加密 xff0c 常用的算法包括 xff1a DES xff08 Data Encryption Standard xff09 xff1a 数据加密标准 xff0c 速度
  • 系统提示缺少libltdl.so.3

    今天安装heartbeat pils 2 1 4 11 el5 i386 rpm时 xff0c 显示 因为重新安装的linux xff0c 所以以前的一些操作都丢失了 xff0c 安装了一大堆的开发工具 34 Development lib
  • 安装的虚拟机没有了VMnet1

    虚拟的东西终归时有其缺陷的 xff0c 大家安装好虚拟机之后 xff0c 网络适配器中是有VMnat1和VMnat8俩块网卡的 xff0c VMnat1负责主机域虚拟机的host only通信 xff0c 而VMnat8则负责和虚拟机的na
  • mount:No medium found

    使用vmware时 xff0c 科技将iso作为系统的镜像 但是 xff0c 在配置yum源的时候 xff0c 可能会遇到这样的问题 究其原因 xff0c 是由于镜像文件未启动 解决方法 xff1a 右击 xff0c 点击连接 xff0c
  • Android 9.0 Settings 搜索功能屏蔽某个app

    1 概述 在9 0的系统rom产品定制化开发过程中 在系统Settings的开发功能中 最近产品需求要求去掉搜索中屏蔽某个app的搜索 就是根据包名 不让搜索出某个app 在系统setting中 搜索功能中 根据包名过滤掉某个app的搜索功
  • 什么叫跨平台语言

    什么叫跨平台语言呢 xff1f 今天就个人理解简单谈一下 xff0c 还望指正 简单的说 xff0c 就像插座和插头 xff0c 这世界上有没有完全通用的插座呢 xff1f 没有 但是比如某家公司 xff0c 制作了插座和插头 xff0c
  • rpm包管理功能全解

    通常在linux系统中 xff0c 服务是要通过程序来提供的 xff0c 通过调用各种接口编译好之后的源码包文件 xff0c 需要使用rpm xff08 redhat package manager xff09 命令来安装并提供相应的服务
  • 加密

    lt div id 61 34 article content 34 class 61 34 article content clearfix csdn tracking statistics 34 data pid 61 34 blog
  • Ubuntu加域后域账号登录账号串号

    Ubuntu加域后域账号登录账号串号 错误实例原因分析解决办法 错误实例 例如这里用账号test01登录Ubuntu桌面 xff0c 进入桌面后进入终端 test02 64 PCtest01 这里可以看出账号不是test01 原因分析 加入
  • 虚拟机迁移提示设备 “HD audio“ 的备用类型不受支持

    错误原因 尝试 vMotion 虚拟机失败并显示以下错误 xff1a 设备 HD audio 的备用类型不受支持 HD 音频设备在 ESXi 的虚拟机上不受支持 xff0c 并且不能作为通过 vSphere Client 添加的设备 因为图
  • 获取windows10远程桌面记录的用户名密码

    Windows 密码恢复工具 单击此下载链接 输入 download 作为用户名 xff0c 然后 39 nirsoft123 39 作为密码 下载软件包后 xff0c 使用以下密码从中提取文件 xff1a nirsoft123 双击net
  • hisi3516下yuv图片到nnie bgr_u8c3格式转换

    首先要看的sdk文档 xff08 HiIVE API 参考 xff09 其中详细说明了 IVE IMAGE TYPE YUV420SP IVE IMAGE TYPE YUV420P IVE IMAGE TYPE YUV422SP IVE I