TI中文支持网
TI专业的中文技术问题搜集分享网站

VICP颜色空间转换函数使用

您好,我在使用VICP库函数:

 

Int32 CPIS_colorSpcConv(

CPIS_Handle *handle,

CPIS_BaseParms *base,

CPIS_colorSpcConvParms *params,

CPIS_ExecType execType

);

使用过程中发现了两个问题,希望您能给与解答。首先介绍下我是如何用的,我想实现YUV444P向RGB的转换。各种参数如下(该参数我用C自己实现过了,能够实现YUV转RGB操作)。

 

Int16 g_VICP_iCoeffMatrix[9] = {1192, 1192, 1192, 0, -401, 2065, 1634, -833, 0}; //系数矩阵

Int16 g_VICP_i16PreOffset[3] = {-16, -128, -128}; //运算前输入加上的值

 

Int16  g_VICP_i16PostOffset[3] = {0, 0, 0}; //运算后输出加上的值

Int16  g_VICP_i16SignedInput[3] = {0, 0, 0}; //输入数据符号

Int16  g_VICP_i16SignedOutput[3] = {0, 0, 0}; //输出数据符号

 

Uint32 g_VICP_ui32QShift = 10; //结果左移10位

SpacConvBase->srcFormat[0] = CPIS_YUV_444P;

SpacConvBase->srcBuf[0].ptr = pui8YComponent;

SpacConvBase->srcBuf[0].stride = iWidth;

SpacConvBase->srcBuf[1].ptr = (char*)pui8UComponent;

SpacConvBase->srcBuf[1].stride = iWidth;

SpacConvBase->srcBuf[2].ptr = (char*)pui8VComponent;

SpacConvBase->srcBuf[2].stride = iWidth;

 

SpacConvBase->dstFormat[0] = CPIS_RGB_P; //

SpacConvBase->dstBuf[0].ptr = pui8RComponent;

SpacConvBase->dstBuf[0].stride = iWidth;

SpacConvBase->dstBuf[1].ptr = pui8GComponent;

SpacConvBase->dstBuf[1].stride = iWidth;

SpacConvBase->dstBuf[2].ptr = pui8BComponent;

SpacConvBase->dstBuf[2].stride = iWidth;

 

SpacConvBase->roiSize.width = iWidth;

SpacConvBase->roiSize.height = iHeight;

SpacConvBase->procBlockSize.width = g_VICP_ui32BlockWidth;

SpacConvBase->procBlockSize.height = g_VICP_ui32BlockHeight;

SpacConvBase->numInput = (iWidth * iHeight);

SpacConvBase->numOutput = (iWidth * iHeight);

SpacConvParams->matrix[0] = g_VICP_i16CoeffMatrixff[0];

SpacConvParams->matrix[1] = g_VICP_i16CoeffMatrixff[1];

SpacConvParams->matrix[2] = g_VICP_i16CoeffMatrixff[2];

SpacConvParams->matrix[3] = g_VICP_i16CoeffMatrixff[3];

SpacConvParams->matrix[4] = g_VICP_i16CoeffMatrixff[4];

SpacConvParams->matrix[5] = g_VICP_i16CoeffMatrixff[5];

SpacConvParams->matrix[6] = g_VICP_i16CoeffMatrixff[6];

SpacConvParams->matrix[7] = g_VICP_i16CoeffMatrixff[7];

SpacConvParams->matrix[8] = g_VICP_i16CoeffMatrixff[8];

SpacConvParams->qShift = g_VICP_ui32QShift;

SpacConvParams->preOffset[0] = g_VICP_i16PreOffset[0];

SpacConvParams->preOffset[1] = g_VICP_i16PreOffset[1];

SpacConvParams->preOffset[2] = g_VICP_i16PreOffset[2];  

SpacConvParams->postOffset[0] = g_VICP_i16PostOffset[0];

SpacConvParams->postOffset[1] = g_VICP_i16PostOffset[1];

SpacConvParams->postOffset[2] = g_VICP_i16PostOffset[2];

SpacConvParams->signedInput[0] = g_VICP_i16SignedInput[0];

SpacConvParams->signedInput[1] = g_VICP_i16SignedInput[1];

SpacConvParams->signedInput[2] = g_VICP_i16SignedInput[2];

SpacConvParams->signedOutput[0] = g_VICP_i16SignedOutput[0];

SpacConvParams->signedOutput[1] = g_VICP_i16SignedOutput[1];

SpacConvParams->signedOutput[2] = g_VICP_i16SignedOutput[2];

SpacConvParams->colorDsMode = g_VICP_ColorDsMode;

 

利用VICP库函数实现的图像颜色不正确。分析原因如下:

1、VICP对于输出为负数的值不会置为0,而是将其转换为无符号数

2、VICP运算过程中,对于单步运算的结果为负值时,也会将其转换为无符号数进行下一步运算。

具体分析见附件。

 

希望您能对这些问题给予解答,另外还请指导如何使用VICP库函数,VICP给的例程只是随机产生的一组数据,没有办法验证该函数的正确性,不知您是否有相关的例程。谢谢。

 

 

Chris Meng:

VICP是可以设置上限下限,以及到门限后钳制到某个值的。请尝试在运行转换前调用imxenc_set_saturation,该函数具体信息可以在SPRUGN1C.pdf里面找到

tianxing hou:

回复 Chris Meng:

我在E2E上咨询了一下,回复如下:

 

There could be a bug in _colorSpcConv.c, line 303:

info.cmdlen+= imxenc_color_spc_conv( info.comp[0], info.coefptr, outputPtr, width, height, 3, width, height, 3, width, height, offsetComp, width, offsetComp, width, IMXTYPE_UBYTE,  -> IMXTYPE_BYTE  IMXTYPE_SHORT, IMXOTYPE_BYTE, params->qShift, info.cmdptr + info.cmdlen );

Could you make the change and recompile src/src_hw/build/imgproclib.pjt ?

根据回复我修改了相应代码,但是又出现了新的问题,就是最终的输出还是会有负数,在图像中会出现大量的红点、绿点或者蓝点。图像如下:

然后我在源码的info.cmdlen+= imxenc_color_spc_conv()前加入了一条语句  info.cmdlen+=imxenc_set_saturation(255, 255, 0, 0, info.cmdptr + info.cmdlen);

 

但是图像颜色又不正确了。图像如下:

我在E2E上帖子的地址:http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/99/t/188100.aspx

comeback:

回复 tianxing hou:

LZ你好!我在尝试使用VICP LIB,但编译始终有问题。请问你能否给个简单的例程,让我看看怎么使用VICP LIB?

tianxing hou:

回复 comeback:

TI给提供了例子,就在VICP安装目录下,vicplib_v330\test\build\

建议你对vicp的文件结构了解一下,TI提供了例程以及VICP的源码,还有GPP是C语言实现的相应功能。

请问,报的那些错误?能否将源码贴出来看看。

comeback:

回复 tianxing hou:

LZ你好!我在CCS 5中导入vicplib_v330\test\build\中的fillMem_DM6446.pjt,但编译时出现错误:

tianxing hou:

回复 comeback:

我是在CCS3.3下编译运行的。从报错来看,是有两个库你没有添加。请注意VICP用刀了EDMA资源。你是在DM6446上运行吗?在DM648的库目录下能找到这两个库,DM6446的目录下没有。

赞(0)
未经允许不得转载:TI中文支持网 » VICP颜色空间转换函数使用
分享到: 更多 (0)