海思Hi3516--移动侦测原理与理解

计算方法与原理:

采用四连通

一 . 运动二值图

  1. 通过帧差法或者背景法、以及设定的阈值选出一个二值图像
  2. 每个框表示一个宏块
  3. 0表示无运动
  4. 1表示有运动

二. 四连通与八连通

    1. 四连通指的是上下左右四个点,如下图中红色区域为连通区,绿色也是连通区,但是两个连通区不属于同一个。

  2. 八连通中的是上下左右,左上,左下,右上,右下八个点,图中两个红色区域为一个连通区。

计算:

  1. 剔除面积较小的块(噪点引起)
  2.  计算剩下的块面积占整帧面积的百分比,判断是否发生移动侦测
  3. 实现:

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()//对比所选的块,上报警告

 

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页