1. 业界目前实现形式

移动侦测的主要使用场景大多是在NVR行业,目前大概分为两种实现形式:

  1. 由摄像机端做移动侦测计算,汇总事件类型,上报相关事件至服务器,并开启录像实时上传音视频流至服务器。
  2. 摄像机端一直不停的向服务端推流,由服务端去做移动侦测计算,根据事件类型决定是否保存流到硬盘,并下发事件关联的指令给摄像机端。

2. 实现思路及优缺点分析

目前整理的算法大概分为两大类:一类是基于图像对比差异算法的简单图像比较、另一类是基于人形识别技术的更为精确的动作事件识别。第二类识别技术对于非图像处理行业从业人员门槛太高,无力考虑。以下仅对第一类侦测算法进行探索。

1.像素比对法

  1-1. 基础思路:

在固定间隔时间内对视频流采集帧图像数据,之后对所采集到的两帧画面进行像素级比对,如果比对结果一致性在一个大于一个既定的相似率(比如90%),则认定视频中无移动,反之则认为发生移动事件。伪代码逻辑示例如下:

public class PicCompare {
   	 public static final int PIXEL_OFFSET = 5;
   	 public static final float SAME_OFFSET = 0.1f;
   
    	public void start() {
   	     Bitmap pic1 = new BitmapFactory().decodeFile("pic1");
    	    Bitmap pic2 = new BitmapFactory().decodeFile("pic2");
    	    compare(getPixelArray(pic1), getPixelArray(pic2));
   	 }

 	   public boolean compare(int[] p1, int[] p2) {
  	      int def = 0;
   	     for (int i = 0; i < p1.length; i++) {
   	          if (Math.abs(p1[1] - p2[i]) > PIXEL_OFFSET) {
   	             def++;
   	          }
   	     }
   	     if (def / p1.length > SAME_OFFSET) {
    	        return false;
   	     }
   	     return true;
  	  }

   	 public int[] getPixelArray(Bitmap pic) {
   	     int[] pixels = new int[pic.getWidth() * pic.getHeight()];
    	    pic.getPixels(pixels, 0, pic.getWidth(), 0, 0, pic.getWidth(), pic.getHeight());
    	    return pixels;
  	  }
}

  1-2. 减少运算量方法

  • 对采集的图片进行缩放,以保证在不影响最终结果的情况下最大程度减少运算量
  • 对图片切块,拆解计算量。

  1-3. 该算法的优缺点

  • 优点:
  1. 技术难度相对难度较低,终端网络占用低,仅在有事件发生时推流。
  2. 计算量可以根据画面帧采集间隔的调整适当调整
  • 缺点:
  1. 像素对比法仅能对比图像数据差异,无法做到真正的移动侦测;计算结果有可能受环境光线、成像曝光度及其他无关因素影响。
  2. 摄像头分辨率高及采样频率高时运算量大,采用减少运算量的方法优化后可能会影响计算结果精确度。

2. 直方图对比法

   2-1. 算法思路

 public float compareHistogram(int[] s1, int[] s2) {
        try {
            float result = 0F;
            for (int i = 0; i < 256; i++) {
                int abs = Math.abs(s1[i] - s2[i]);
                int max = Math.max(s1[i], s2[i]);
                result += (1 - ((float) abs / (max == 0 ? 1 : max)));
            }
            return result / 256;
        } catch (Exception exception) {
            return 0;
        }
    }

    public int[] getHistogram(Bitmap bitmap){
        int[] data = new int[256];
        for (int x = 0; x < bitmap.getWidth(); x++) {
            for (int y = 0; y < bitmap.getHeight(); y++) {
                int color = bitmap.getPixel(x, y);
                int r = (color & 0xff0000) >> 16;
                int g = (color & 0x00ff00) >> 8;
                int b = (color & 0x0000ff);
                data[(r + g + b) / 3]++;
            }
        }
        return data;
    }

   2-2. 算法优缺点

  • 优点:

相比第一种方法计算量相对更小,能够获得更快的处理结果

  • 缺点:

该方法是一种特征码抽取对比方法,对结果精确度有一定影响。依旧只能是对比图像差异,无法判断事件类型。

文章作者: 嘿手大叔
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 i·Space
学习记录 Android
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝