计算方法与原理:
采用四连通
一 . 运动二值图
- 通过帧差法或者背景法、以及设定的阈值选出一个二值图像
- 每个框表示一个宏块
- 0表示无运动
- 1表示有运动
二. 四连通与八连通
1. 四连通指的是上下左右四个点,如下图中红色区域为连通区,绿色也是连通区,但是两个连通区不属于同一个。
2. 八连通中的是上下左右,左上,左下,右上,右下八个点,图中两个红色区域为一个连通区。
计算:
- 剔除面积较小的块(噪点引起)
- 计算剩下的块面积占整帧面积的百分比,判断是否发生移动侦测
- 实现:
for(i = 0; i < pstCCBLOB->u8RegionNum; i++) // i < 总的连通区域个数
for (k = 0; k < pstCur->u16Height; k += bound_value_y) // 找出连通区域所属的块
for (m = 0; m < pstCur->u16Width; m += bound_value_x)
判断两个矩形是否有重叠区域
计算重叠区域面积
每个块运动的面积per_block_area[index] += area.
g_md_args->precent[i] = (per_block_area[i]*10000) / per_block_sum_area; //每个块所占 该块面积的比例
for (i = 0; i < strlen(g_md->cur_cfg.configStr); i++)
{
if (g_md->cur_cfg.configStr[i] == '1')
{
precent += g_md->precent[i];
count++;
}
} //根据imcs / NVR 标记的块 进行叠加 标记的块为1
if (precent >= ((100 - g_md->cur_cfg.md_sensitivity) * 100 * DOWN_SCALE))
g_md->md_flag = MOT_HAPPEN; //有移动
初始化过程:
1. enc_sal_md_init()
g_md_args->fps = cap->vi.fps;
g_md_args->bind_phy_chn = cap->md.bindPhyChn;
g_md_args->width = cap->md.width;
g_md_args->height = cap->md.height;
g_md_args->block_h = block_h;
g_md_args->block_v = block_v;
2. md_enable_chn()
stChnAttr.s32SrcFrameRate = g_md_args->fps;
stChnAttr.s32DstFrameRate = (g_md_args->fps > 5) ? 5 : g_md_args->fps;
stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER;
stVpssChnMode.bDouble = HI_FALSE;
stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
stVpssChnMode.u32Width = g_md_args->width;
stVpssChnMode.u32Height = g_md_args->height;
stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE;
HI_MPI_VPSS_SetChnAttr();
3. md_alloc_mem()
md_create_image
md_create_image//申请存放待处理图像缓冲区
md_create_memInfo //申请存放处理的结果数据
4. HI_IVS_MD_Init
5. md_start
stMdAttr.enAlgMode = MD_ALG_MODE_BG; //背景帧
stMdAttr.enSadMode = IVE_SAD_MODE_MB_4X4;
stMdAttr.enSadOutCtrl = IVE_SAD_OUT_CTRL_THRESH;
stMdAttr.u16SadThr = 128; //阈值SAD
stMdAttr.u16Width = g_md_args->width;
stMdAttr.u16Height = g_md_args->height;
stMdAttr.stAddCtrl.u0q16X = 32768; //加权系数
stMdAttr.stAddCtrl.u0q16Y = 32768;
stMdAttr.stCclCtrl.u16InitAreaThr = 4; //初始化连通区域面积fa
stMdAttr.stCclCtrl.u16Step = 4; //步伐
stMdAttr.stCclCtrl.enMode = IVE_CCL_MODE_8C; //8联通
pstMdAttr->u16SadThr = 传参
pstMdAttr->stCclCtrl.u16InitAreaThr = 传参
HI_IVS_MD_CreateChn
6. md_proc
HI_MPI_VPSS_GetChnFrame
HI_MPI_VPSS_GetChnFrame //获取两帧图像信息 进行对比
HI_MPI_IVE_DMA
HI_IVS_MD_Process
md_calc_block//连通区域的面积对比
tp_md_calc()//对比所选的块,上报警告
tp_md_check_end()//对比所选的块,上报警告