前言

这个算法就是满足摄像头遮挡报警这个功能需求

代码分析

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 = 8for (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]);u64BtmRight = pu64BtmRow[(i + 1) * pstOd->u32W - 1];//长长整形 LL   u64BlockSum = (u64TopLeft & 0xfffffffLL) + (u64BtmRight & 0xfffffffLL)- (u64BtmLeft & 0xfffffffLL) - (u64TopRight & 0xfffffffLL);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);// 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] addresss32Ret = SAMPLE_IVE_Linear2DClassifer(&stChar[0], IVE_CHAR_NUM,stIveLinerData.pstLinearPoint, stIveLinerData.s32LinearNum);//IVE_CHAR_NUM / 2 = 32if (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;
}

总结

鸡肋, 误判率应该挺高的
还不如像手机一样加传感器。
欢迎勘误。

海思IVE算法原理解析一--遮挡检测(occlusion deection)相关推荐

  1. p.563算法原理解析

    p.563算法原理解析 1.概览 ​ 下图展示了,人工主观语音评估mos-lqs,双端和单端客观语音评估mos-lqo这三种方法的差异. ​ p563算法可以被想象成一个专家使用测试设备如传统的听筒侦 ...

  2. 索引算法原理解析(B-tree以及磁盘存储原理)

    刚开始学习的时候,百度去查,但发现好多说得太复杂不好理解,结合各个文章总结一下(建议大概看文字,不理解不要紧,然后再看图的执行步骤然后在结合文字,这样一切就清晰好多) B-tree,B是balance ...

  3. python文件去重算法_使用Python检测文章抄袭及去重算法原理解析

    在互联网出现之前,"抄"很不方便,一是"源"少,而是发布渠道少:而在互联网出现之后,"抄"变得很简单,铺天盖地的"源"源 ...

  4. 海思IVE函数使用-1 (DMA使用 HI_MPI_IVE_DMA)

    海思IVE函数使用1 (DMA使用 HI_MPI_IVE_DMA) 1 结构体定义 //灰度图像定义 typedef struct {unsigned char *pu8Data; //虚拟地址uns ...

  5. python去重算法_使用Python检测文章抄袭及去重算法原理解析

    在互联网出现之前,"抄"很不方便,一是"源"少,而是发布渠道少:而在互联网出现之后,"抄"变得很简单,铺天盖地的"源"源 ...

  6. 海思IVE遮挡报警算法(OD)

    大家越来越不喜欢分享了好像. 随便写写吧. OK , fine, 先看原处理线程 while (...){......s32Ret = HI_MPI_IVE_Integ(&IveHandle, ...

  7. 海思屏幕HAL代码解析

    显示屏幕(LCD)模块提供屏幕相关功能接口,调用者为上层应用模块(含 init.状态机.ui),上下文依赖关系,如图 3-7 所示. 系统框架为 linux+Huawei LiteOS 双系统架构,媒 ...

  8. LruCache算法原理解析

    本来想写关于LruCache算法的原理解析文章,但是看到卡神的作品,写的太好了.所以这里我还是转载一下吧. 史上最详细LrcCache算法解析:https://blog.csdn.net/carson ...

  9. 非常详细的sift算法原理解析

    尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun 转自:http://blog.csdn.net/zddblog/ ...

最新文章

  1. php汉字的截取,php汉字截取
  2. Django——restframework(serializers序列化工具)
  3. 日期格式化{0:yyyy-MM-dd HH:mm:ss.fff}和{0:yyyy-MM-dd hh:mm:ss.fff}的区别
  4. 上云迁移-海量数据迁移解决方案
  5. oracle创建用户需要什么权限,Oracle 创建普通用户,并赋予权限
  6. 《教师教学究竟靠什么--谈新课程的教学观》之交往与互动的教学观 心得体会三...
  7. 一个情怀引发的生产事故(续)
  8. 前端学习(2001)vue之电商管理系统电商系统之获取商品分类数据
  9. 快1倍,我在 M1 Max 上开发 iOS 应用有了这些发现
  10. Delphi 常用API 函数
  11. 统计有几个连通分量--hdu 1213 并查集
  12. linux系统cpu文件,Linux_学堂:当前Linux系统运行的各种参数, 1、CPU   在文件“/proc/ - phpStudy...
  13. Mac下mysql登陆问题
  14. SCCM部署前的IIS、WSUS等准备
  15. 2.PHP7内核剖析 --- SAPI
  16. Python之猜数字游戏
  17. 新路由3 newifi d2 潘多拉PandoraBox固件,带鸡血驱动
  18. CSU 2202 EL PSY CONGROO
  19. 服务器租用多少钱一年呢?
  20. 华为手机怎么使用分屏_这是一份华为手机必备小技巧使用说明

热门文章

  1. 剖析5G云游戏技术瓶颈与机会
  2. banq修复_设计模式builder(Banq)
  3. Swiftui:自定义Tabbar
  4. 分享一个gui或app designer实时显示simulink仿真波形和实时进度的方法
  5. Android 谷歌相册-云照片-分享到应用 方法
  6. arm9 中断向量 重定位_ARM的启动和中断向量表
  7. 数据可视化课程大纲和教学设计及源代码
  8. 基于stm32电梯管理系统设计
  9. java如何解析带时区的日期,java – Joda时间解析一个带时区的日期,并保留该时区...
  10. windows下cmd清屏命令cls