海思IVE算法原理解析一--遮挡检测(occlusiondeection)
海思IVE算法原理解析⼀--遮挡检测(occlusiondeection)前⾔
这个算法就是满⾜摄像头遮挡报警这个功能需求
代码分析
0xfffffffLL是个长整形, 如果你也好奇这个写法的话。
流程
创建灰度图像的积分图计算任务
算出图像灰度值的平均值,均⽅差,u, v
再拿u,v计算不相似度。
不相似度>50%认为 有遮挡
不相似度的计算标准:
输⼊图像灰度值的平均值 >80(为什么是写死的值), 不相似度+1
代码
static HI_VOID* SAMPLE_IVE_OdProc(HI_VOID* pArgs)
{
HI_S32 s32Ret;
HI_U32 i, j;
SAMPLE_IVE_OD_S* pstOd;
VIDEO_FRAME_INFO_S stBaseFrmInfo;
VIDEO_FRAME_INFO_S stExtFrmInfo;
HI_S32 s32VpssGrp = 0;
HI_S32 as32VpssChn[] = {VPSS_CHN0, VPSS_CHN1};
HI_S32 s32MilliSec = 20000;
IVE_DATA_S stSrc;
IVE_DATA_S stDst;
IVE_HANDLE IveHandle;
HI_BOOL bFinish = HI_FALSE;
HI_BOOL bBlock = HI_TRUE;
HI_BOOL bInstant = HI_TRUE;
POINT_S stChar[IVE_CHAR_NUM];
POINT_S astPoints[10] = {{0, 0}};
IVE_LINEAR_DATA_S stIveLinerData;
HI_U64* pu64VirData = HI_NULL;
IVE_DMA_CTRL_S stDmaCtrl = {IVE_DMA_MODE_DIRECT_COPY, 0, 0, 0, 0};
HI_U64 u64TopLeft, u64TopRight, u64BtmLeft, u64BtmRight;
HI_U64* pu64TopRow, *pu64BtmRow;
HI_U64 u64BlockSum, u64BlockSq;
HI_FLOAT fSqVar;
HI_S32 s32VoLayer = 0;
HI_S32 s32VoChn = 0;
pstOd = (SAMPLE_IVE_OD_S*)(pArgs);
pu64VirData = SAMPLE_COMM_IVE_CONVERT_64BIT_ADDR(HI_U64,pstOd->stInteg.au64VirAddr[0]);
stIveLinerData.pstLinearPoint = &astPoints[0];
stIveLinerData.s32LinearNum = 2;
stIveLinerData.s32ThreshNum = IVE_CHAR_NUM / 2;
stIveLinerData.pstLinearPoint[0].s32X = 80;
stIveLinerData.pstLinearPoint[0].s32Y = 0;
stIveLinerData.pstLinearPoint[1].s32X = 80;
stIveLinerData.pstLinearPoint[1].s32Y = 20;
while (HI_FALSE == s_bStopSignal)
{
s32Ret = HI_MPI_VPSS_GetChnFrame(s32VpssGrp, as32VpssChn[1], &stExtFrmInfo, s32MilliSec);
if(HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Error(%#x),HI_MPI_VPSS_GetChnFrame failed, VPSS_GRP(%d), VPSS_CHN(%d)!\n",
s32Ret,s32VpssGrp, as32VpssChn[1]);
continue;
}
s32Ret = HI_MPI_VPSS_GetChnFrame(s32VpssGrp, as32VpssChn[0], &stBaseFrmInfo, s32MilliSec);
SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!=s32Ret, EXT_RELEASE,
"Error(%#x),HI_MPI_VPSS_GetChnFrame failed, VPSS_GRP(%d), VPSS_CHN(%d)!\n",
s32Ret,s32VpssGrp, as32VpssChn[0]);
stSrc.u64VirAddr = stExtFrmInfo.stVFrame.u64VirAddr[0];
stSrc.u64PhyAddr = stExtFrmInfo.stVFrame.u64PhyAddr[0];
stSrc.u32Stride = stExtFrmInfo.stVFrame.u32Stride[0];
stSrc.u32Width = stExtFrmInfo.stVFrame.u32Width;
stSrc.u32Height = stExtFrmInfo.stVFrame.u32Height;
stDst.u64VirAddr = pstOd->stSrc.au64VirAddr[0];
stDst.u64PhyAddr = pstOd->stSrc.au64PhyAddr[0];
stDst.u32Stride = stExtFrmInfo.stVFrame.u32Stride[0];
stDst.u32Width =  stExtFrmInfo.stVFrame.u32Width;
stDst.u32Height = stExtFrmInfo.stVFrame.u32Height;
bInstant = HI_FALSE;
s32Ret = HI_MPI_IVE_DMA(&IveHandle, &stSrc, &stDst, &stDmaCtrl, bInstant);比喻句摘抄
SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!=s32Ret, BASE_RELEASE,
"Error(%#x),HI_MPI_IVE_DMA failed!\n", s32Ret);
bInstant = HI_TRUE;
/
/创建灰度图像的积分图计算任务
s32Ret = HI_MPI_IVE_Integ(&IveHandle, &pstOd->stSrc, &pstOd->stInteg,
&pstOd->stIntegCtrl, bInstant);
SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!=s32Ret, BASE_RELEASE,
"Error(%#x),HI_MPI_IVE_Integ failed!\n", s32Ret);
s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock);
while (HI_ERR_IVE_QUERY_TIMEOUT == s32Ret)
{
usleep(100);
s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock);
}
SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!=s32Ret, BASE_RELEASE,
"Error(%#x),HI_MPI_IVE_Query failed!\n", s32Ret);
//Tag :? IVE_CHAR_CALH = 8
for (j = 0; j < IVE_CHAR_CALH; j++)
{
pu64TopRow = (0 == j) ? (pu64VirData) : ( pu64VirData + (j * pstOd->u32H - 1) * pstOd->stInteg.au32Stride[0]);            pu64BtmRow = pu64VirData + ((j + 1) * pstOd->u32H - 1) * pstOd->stInteg.au32Stride[0];
for (i = 0; i < IVE_CHAR_CALW; i++)
{
u64TopLeft  = (0 == j) ? (0) : ((0 == i) ? (0) : (pu64TopRow[i * pstOd->u32W - 1]));
u64TopRight = (0 == j) ? (0) : (pu64TopRow[(i + 1) * pstOd->u32W - 1]);
u64BtmLeft  = (0 == i) ? (0) : (pu64BtmRow[i * pstOd->u32W - 1]);
cba大牌外援
u64BtmRight = pu64BtmRow[(i + 1) * pstOd->u32W - 1];
//长长整形 LL
u64BlockSum = (u64TopLeft & 0xfffffffLL) + (u64BtmRight & 0xfffffffLL)
- (u64BtmLeft & 0xfffffffLL) - (u64TopRight & 0xfffffffLL);
u64BlockSq  = (u64TopLeft >> 28) + (u64BtmRight >> 28)
u64BlockSq  = (u64TopLeft >> 28) + (u64BtmRight >> 28)
- (u64BtmLeft >> 28) - (u64TopRight >> 28);
// mean
//stChar{s32X, s32Y} (u, sigmoid)
stChar[j * IVE_CHAR_CALW + i].s32X = u64BlockSum / (pstOd->u32W * pstOd->u32H);
国庆节放假2020安排/
/ sigma=sqrt(1/(w*h)*sum((x(i,j)-mean)^2)= sqrt(sum(x(i,j)^2)/(w*h)-mean^2)
fSqVar = u64BlockSq / (pstOd->u32W * pstOd->u32H) - stChar[j * IVE_CHAR_CALW + i].s32X * stChar[j * IVE_CHAR_CALW + i].s32X;                stChar[j * IVE_CHAR_CALW + i].s32Y = (HI_U32)sqrt(fSqVar);
}
}
// HI_S32 SAMPLE_IVE_Linear2DClassifer(POINT_S* pstChar, HI_S32 s32CharNum, \
POINT_S* pstLinearPoint, HI_S32 s32Linearnum )
什么是双减//&stChar[0] address
s32Ret = SAMPLE_IVE_Linear2DClassifer(&stChar[0], IVE_CHAR_NUM,
stIveLinerData.pstLinearPoint, stIveLinerData.s32LinearNum);
//IVE_CHAR_NUM / 2 = 32
if (s32Ret > stIveLinerData.s32ThreshNum)
{
SAMPLE_PRT("\033[0;31m Occlusion detected!\033[0;39m\n");
}
s32Ret = HI_MPI_VO_SendFrame(s32VoLayer, s32VoChn, &stBaseFrmInfo,s32MilliSec);
SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!=s32Ret, BASE_RELEASE,
"Error(%#x),SAMPLE_VO_SendFrame failed!\n", s32Ret);
BASE_RELEASE:
最好的进口牛奶s32Ret = HI_MPI_VPSS_ReleaseChnFrame(s32VpssGrp,as32VpssChn[0], &stBaseFrmInfo);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Error(%#x),HI_MPI_VPSS_ReleaseChnFrame failed,Grp(%d) chn(%d)!\n",
s32Ret,s32VpssGrp,as32VpssChn[0]);
}
EXT_RELEASE:
s32Ret = HI_MPI_VPSS_ReleaseChnFrame(s32VpssGrp,as32VpssChn[1], &stExtFrmInfo);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Error(%#x),HI_MPI_VPSS_ReleaseChnFrame failed,Grp(%d) chn(%d)!\n",
s32Ret,s32VpssGrp,as32VpssChn[1]);
}
}
return HI_NULL;
}
总结
鸡肋, 误判率应该挺⾼的
还不如像⼿机⼀样加传感器。
欢迎勘误。
迪莫怎么抓

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。