Intel IPP 图像空间转换
Posted 那个人好像一条狗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Intel IPP 图像空间转换相关的知识,希望对你有一定的参考价值。
一、 背景
用QuickSync VPP模块做RGBA到NV12的颜色空间转换导致文字显示蒙上一层颜色的问题, 暂时怀疑是VPP自身的问题,因为参数设置都是按官方demo设置的。所以尝试使用IPP来做RGBA到NV12的转化。
二、IPP 探索历程
1. 下载IPP安装包, google “IPP”,即可找到下载链接。
2.安装, 执行 install.sh。 如果有问题,看看文档,安装环境是否满足安装需求。
3.编写测试程序(可在官网找到),需要关注头文件和库的目录,在安装目录下都可以找到。
三、RGBA到NV12的转换
1. 头文件ippcc.h, 库文件 libippcc.so
2. 实例:
void Rgb2NV12(const unsigned char I[], const int image_width, const int image_height, unsigned char J[]) { //memcpy(J, I, image_width*image_height*3); IppStatus ipp_status; int srcStep = image_width*3; int dstYStep = image_width; int dstCbCrStep = image_width; IppiSize roiSize = {image_width, image_height}; const Ipp8u* pSrc = (Ipp8u*)I; Ipp8u *pDstY = (Ipp8u*)J; //Y color plane is the first image_width*image_height pixels of J. Ipp8u *pDstCbCr = (Ipp8u*)&J[image_width*image_height]; //In NV12 format, UV plane starts below Y. ipp_status = ippiRGBToYCbCr420_8u_C3P2R(pSrc, srcStep, pDstY, dstYStep, pDstCbCr, dstCbCrStep, roiSize); if (ipp_status != ippStsNoErr) { memset(J, 128, image_width*image_height*3/2); } }
上面实例是转RGB24到NV12的接口
IPPAPI(IppStatus, ippiRGBToYCbCr420_8u_C3P2R,( const Ipp8u* pRGB, int rgbStep, Ipp8u* pY, int YStep,Ipp8u* pCbCr, int CbCrStep, IppiSize roiSize ))// RGB24-->NV12 IPPAPI(IppStatus, ippiRGBToYCbCr420_8u_C4P2R,( const Ipp8u* pRGB, int rgbStep, Ipp8u* pY, int YStep,Ipp8u* pCbCr, int CbCrStep, IppiSize roiSize ))// ARGB-->NV12 IPPAPI(IppStatus, ippiBGRToYCbCr420_8u_C3P2R,( const Ipp8u* pRGB, int rgbStep, Ipp8u* pY, int YStep,Ipp8u* pCbCr, int CbCrStep, IppiSize roiSize ))// BGR24-->NV12 IPPAPI(IppStatus, ippiBGRToYCbCr420_8u_AC4P2R,( const Ipp8u* pRGB, int rgbStep, Ipp8u* pY, int YStep,Ipp8u* pCbCr, int CbCrStep, IppiSize roiSize ))// ABGR-->NV12
实际结果以测试结果为准。
有一些分辨率在把NV12编码成h264时需要对齐行像素,此时可以更改YStep,CbCrStep进行对齐。例如:
IppiSize roiSize; roiSize.width = m_mfxEncParams.mfx.FrameInfo.CropW; roiSize.height = m_mfxEncParams.mfx.FrameInfo.CropH; mfxU16 pitch = m_pVPPSurfacesVPPOutEnc[nEncSurfIdx].Data.Pitch; ippiBGRToYCbCr420_8u_AC4P2R( (Ipp8u*)pInputBuffer, roiSize.width*4, (Ipp8u*)m_pVPPSurfacesVPPOutEnc[nEncSurfIdx].Data.Y, pitch, (Ipp8u*)m_pVPPSurfacesVPPOutEnc[nEncSurfIdx].Data.UV,pitch, roiSize);
上面的Data.Pitch就是编码器对特定分辨率下的行对齐的字节宽度。
以上是关于Intel IPP 图像空间转换的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 3.0 - 错误:(-215) scn == 3 || scn == 4 在函数 ipp_cvtColor
在进行 C 到 Intel x86 程序集转换时,堆栈上的数组分配占用的空间超过了所需的空间 [重复]