1 对 IVE_IMAGE_S 的分析
这部分内容来自海思文档 HiIVE API 参考 ,文档中有更多图像类型的说明内容。
说明
定义二维广义图像信息。
定义
typedef struct hiIVE_IMAGE_S
{
HI_U64 au64PhyAddr[3]; /* RW;The physical address of the image */
HI_U64 au64VirAddr[3]; /* RW;The virtual address of the image */
HI_U32 au32Stride[3]; /* RW;The stride of the image */
HI_U32 u32Width; /* RW;The width of the image */
HI_U32 u32Height; /* RW;The height of the image */
IVE_IMAGE_TYPE_E enType; /* RW;The type of the image */
}IVE_IMAGE_S;
成员
成员名称 | 描述 |
---|---|
au64PhyAddr[3] | 广义图像的物理地址数组 |
au64VirAddr[3] | 广义图像的虚拟地址数组 |
au32Stride[3] | 广义图像的跨度 |
u32Width | 广义图像的宽度 |
u32Height | 广义图像的高度 |
enType | 广义图像的图像类型 |
二维广义图像类型表
类型 | 图像描述 | 内存地址 | 跨度 |
---|---|---|---|
IVE_IMAGE_TYPE_U8C1 | 8bit 无符号单通道图像 | 仅用到 IVE_IMAGE_S 中的 au64PhyAddr[0]、au64VirAddr[0] | 仅用到 u32Stride[0] |
图像描述
如果图片类型为 IVE_IMAGE_TYPE_U8C1 时,n 取 8。
关于对 Width 和 Stride 的理解,请参考 yuv 图像里的stride和plane的解释
2 代码实现
根据上一小节的分析,我们知道 Width 是小于等于 Stride 的。当输入的图片格式是 U8C1 时,图片的 Width 等于 Stride。当然下面的代码也可以进一步简化。
这里的代码是想参考 opencv 的 countNonZero 函数,返回值是灰度值不为0的像素数。同时也打印出各个像素点的灰度值。
但是此方法耗时过长,对720x576的图像处理一次时间为0.28s,推荐使用3 使用海思 IVE 实现 countNonZero
代码
/*
As we all know, au32Stride[0] greater than u32Width
*/
static HI_U32 CountNonZero(IVE_IMAGE_S *pstImg)
{
HI_U16 u16Row;
HI_U16 u16List;
HI_U8* u8copy; //read
HI_U8* u8origin; //change line
HI_U16 height;
HI_U16 width;
HI_U16 NonZeroCount = 0;