Virtual Gate使用说明

Version 3.0


1. 功能说明

  • 虚拟线段

    用于检测是否有物体穿越设置的警报线。

  • 区域入侵

    用于检测是否有物体穿越设置的警报区域。


2. 相机设置

  • 架设位置

    请尽量设置于物体的正上方。

  • 角度

    与侦测物体角度 ≤ 45°。

  • 距离

    与侦测物体的距离 >2.5m。

    下图为相机正确设置拍摄结果。

  • 错误位置

    下图架设位置会导致目标物过大,会造成计算量过大,不易侦测等问题。


3. 相关参数


3.1. function_state

此参数决定使用哪一种功能,有虚拟线段与区域入侵两种侦测模式。

  1. 若function_state = VG_VIRTUAL_GATE,表示模式为虚拟线段。

  2. 若function_state = VG_REGION_INVASION,表示模式为区域入侵。


3.2. object_size_thd

此参数决定滤除物体占感兴趣区域的百分比大小,被滤除物体越小(大),灵敏度越高(低),目前支持五种模式。

  1. VG_SENSITIVELY_MIN = 物体面积小于感兴趣区域的30%则会忽略不计算。

  2. VG_SENSITIVELY_LOW = 物体面积小于感兴趣区域的10%则会忽略不计算。

  3. VG_SENSITIVELY_MIDDLE = 物体面积小于感兴趣区域的5%则会忽略不计算。

  4. VG_SENSITIVELY_HIGH = 物体面积小于感兴趣区域的1%则会忽略不计算。

  5. VG_SENSITIVELY_MAX = 物体面积小于感兴趣区域的0.5%则会忽略不计算。

注意:

  1. 考虑到算法处理的影像只有320x180,且侦测到的对象体积都会比实际体积小,设定时请依照比实际情况增高一段的灵敏度设定。

  2. 若无法准确评估实际物体大小来推算灵敏度,也可采用距离的方式来决定。

本案例可设VG_SENSITIVELY_HIGH。

本案例可设VG_SENSITIVELY_MIDDLE。


3.3. indoor

此参数设定相机架设区域,室内请设为1,室外请设为0,但在室外且相机与虚拟线段距离<6m,也请设为1。

3.4. line_number

此参数设定虚拟线段的数目,支持1到4条虚拟线段。

3.5. region_dir

此参数设定区域入侵的方向,目前有进入、离开及穿越三种方向可以选择。

  1. 若region_dir = VG_REGION_ENTER,表示要进入警报区域才触发警报。

  2. 若region_dir = VG_REGION_LEAVING,表示要离开警报区域才触发警报。

  3. 若region_dir = VG_REGION_CROSS,表示只要穿越警报区域就触发警报


4. 虚拟坐标设置


4.1. 设置位置

请设置在干净且可让物体穿越时不会受到干扰的出入口位置,可参考以下实际场景中设置的虚拟线段位置。


4.2. 虚拟线段

正确位置:

错误位置:

  1. 离边界太近,物体一进入及跨越了虚拟线段,无法及时判断有无跨越虚拟线段。

  2. 设置在反射的光影中,会影响物体侦测的准确度,无法准确判断是否穿越。


4.3. 区域入侵

正确位置:

错误位置:

配置建议:

设置区域入侵的警报区域时,可以想象成是四条虚拟线段的结合,因此错误的虚拟线段同样不适合设置为警报区域。


5. 穿越条件

物体中心穿越虚拟线段才会认定为穿越并触发警报。以下图标为物体刚穿越警报线并触发警报的瞬间。


6. 虚拟线段设置


6.1. 配置说明

请准确设置虚拟线段的相关参数。


6.2. 结构体说明

typedef struct _VG_Point_t
{
        int32_t x;            // x 坐标
        int32_t y;            // y 坐标
} MI_VG_Point_t;

typedef struct _VG_Line_t
{
        MI_VG_Point_t px;   // 第一个线段点
        MI_VG_Point_t py;   // 第二个线段点
        MI_VG_Point_t pdx;  // 第一个方向点
        MI_VG_Point_t pdy;  // 第二个方向点
} MI_VgLine_t;

6.3. 程序范例说明

MI_VgLine_t line1, line2;

line1.px.x = 100;        // 第一条虚拟线段的第一个线段点的 x 坐标
line1.px.y = 40;         // 第一条虚拟线段的第一个线段点的 y 坐标
line1.py.x = 100;        // 第一条虚拟线段的第二个线段点的 x 坐标
line1.py.y = 170         // 第一条虚拟线段的第二个线段点的 y 坐标
line1.pdx.x = 160;       // 第一条虚拟线段的第一个方向点的 x 坐标
line1.pdx.y = 120;       // 第一条虚拟线段的第一个方向点的 y 坐标
line1.pdy.x = 20;        // 第一条虚拟线段的第二个方向点的 x 坐标
line1.pdy.y = 110;       // 第一条虚拟线段的第二个方向点的 y 坐标

line2.px.x = 220;        // 第二条虚拟线段的第一个线段点的 x 坐标
line2.px.y = 40;         // 第二条虚拟线段的第一个线段点的 y 坐标
line2.py.x = 220;        // 第二条虚拟线段的第二个线段点的 x 坐标
line2.py.y = 100;        // 第二条虚拟线段的第二个线段点的 y 坐标    
line2.pdx.x = 170;       // 第二条虚拟线段的第一个方向点的 x 坐标
line2.pdx.y = 50;        // 第二条虚拟线段的第一个方向点的 y 坐标
line2.pdy.x = 270;       // 第二条虚拟线段的第二个方向点的 x 坐标
line2.pdy.y = 50;        // 第二条虚拟线段的第二个方向点的 y 坐标

注意: 若需要设置第三或第四条虚拟线段,需再用MI_VgLine_t type宣告变量,并按上述范例增加坐标配置。


6.4. 虚拟线段的产生

虚拟线段的第一个线段点和第二个线段点连起来即为设置的虚拟线段,示意图如下 :

目前程序有支持特定方向和无特定方向,可任意根据相向点进行配置。

  • 特定方向

    第一个配置的方向点为方向起始点,第二个配置的方向点为方向终点,起始点往终点的移动方向即为配置的方向,若有侦测物体也以相同方向穿越虚拟线段即会触发警报。

    1. 虚拟线段的左侧往右侧

    2. 虚拟线段的右侧往左侧

  • 无特定方向

    只要侦测物体穿越警报线及触发警报。

    1. 第一个和第二个方向点的坐标相同

    2. 第一个和第二个方向点在虚拟线段的同一侧。

    3. 第一个和第二个方向点刚好在虚拟线段之上。


7. 警报区域设置


7.1. 配置说明

请正确设置区域入侵的相关参数。


7.2. 结构体说明

typedef struct _VG_Region_t
{
        MI_VG_Point_t p_one;    //point one
        MI_VG_Point_t p_two;    //point two
        MI_VG_Point_t p_three;   //point three
        MI_VG_Point_t p_four;    //point four

        int region_dir;            //Region direction;
} MI_VgRegion_t;

7.3. 程序范例说明

MI_VgRegion_t vg_region;

vg_region.p_one.x = 230;       //区域中左上角点的 x 坐标
vg_region.p_one.y = 30;        //区域中左上角点的 y 坐标
vg_region.p_two.x = 280;       //区域中右上角点的 x 坐标
vg_region.p_two.y = 30;        //区域中右上角点的 y 坐标
vg_region.p_three.x = 280;      //区域中右下角点的 x 坐标
vg_region.p_three.y = 80;       //区域中右下角点的 y 坐标
vg_region.p_four.x = 250;       //区域中左下角点的 x 坐标
vg_region.p_four.y = 100;       //区域中左下角点的 y 坐标

vg_region.region_dir = VG_REGION_ENTER;  //决定区域入侵的方向

注意:

  1. VG_REGION_ENTER = 进入区域触发警报。

  2. VG_REGION_LEAVING = 离开区域触发警报。

  3. VG_REGION_CROSS = 穿越区域触发警报 (包含进入和离开)。


7.4. 警报区域的产生

使用者从左上角点开始,顺时针方向依序设置完4个点,这四点连成的区域即为区域入侵的警报区域。

注意:

  1. 设置的四个坐标点有先后和大小的关系,请从左上角点开始顺时针方向设置。

  2. 四个角点的关系如下:

    角点 1 的 x 坐标 < 角点 2 的 x 坐标。

    角点 1 的 y 坐标 < 角点 4 的 y 坐标。

    角点 2 个 x 坐标 > 角点 1 的 x 坐标。

    角点 2 的 y 坐标 < 角点 3 的 y 坐标。

    角点 3 的 x 坐标 > 角点 4 的 x 坐标。

    角点 3 的 y 坐标 > 角点 2 的 y 坐标。

    角点 4 的 x 坐标 < 角点 3 的 x 坐标。

    角点 4 的 y 坐标 > 角点 1 的 y 坐标。

目前配置方向支持特定进入、离开和穿越三种指定方向。

  • 区域进入

    将方向参数设定为VG_REGION_ENTER,表示物体从任意方向进入警报区域皆会触发警报.

  • 区域离开

    将方向参数设定为VG_REGION_LEAVING,表示物体从警报区域中的任意方向离开警报区域皆会触发警报

  • 区域穿越

    将方向参数设定为VG_REGION_CROSS,表示物体任意进入和离开警报区域皆会触发警报

注意: 此模式下警报区域中四个边的方向都是一起的,设定为进入,则都是进入,设为离开则都是离开,若希望四个边的方向性能不同,则可使用虚拟线段模式,自行设置4条虚拟线段连成一个警报区域,这样四个边的方向性则可个别独立配置。


8. 感兴趣区域

计算方式:

-> ROI_Size = ROI_width   ROI_height

-> ROI_width = max_x - min_x + 1

-> ROI_height = max_y - min_y + 1

-> min_x = ori_min_x  30 
(ori_min_x = 输入虚拟线段两个端点中较小的x坐标值)

-> max_x = ori_max_x + 30 
(ori_max_x = 输入虚拟线段两个端点中较大的x坐标值)

-> min_y = ori_min_y  30
(ori_min_y = 输入虚拟线段两个端点中较小的y坐标值)

-> max_y = ori_max_y + 30 
(ori_max_y =输入虚拟线段两个端点中较大的y坐标值)

注意:

若ori_min_x = 15,ori_max_x = 115,ori_min_y = 95,ori_max_y = 95

min_x = 0,max_x = 159,min_y = 65,max_y = 125

ROI_width = 160,ROI_height = 61

ROI_size = 9760

min_x、max_x、min_y和max_y皆不会超出画面范围。


9. 限制条件


9.1. 环境限制

  1. 雨滴会影响判断。

  2. 速度过快容易侦测不到。

  3. 目标物体过大(过小)容易造成误判(侦测不到)。

  4. 光线产生的阴影会造误判。

  5. 亮度不够容易侦测不到。

  6. 地面、墙壁或是背景的反射光会造成误判。

  7. 光线的快速变化容易误判。

注意: 若物体大于画面影像的⅓,即表示过大。


9.2. 背景限制

VG的准确度很依赖完美的背景,因此当VG启动并建立背景时,请短时间(约10秒)维持画面干净无干扰。