在安霸平台上实现运动侦测的功能

   实现运动侦测功能实际上就是采用帧间差分的方法来判断相邻两帧或多帧差异是否大于某个事先设定的值,如果是就认为有运动行为发生。本人经过多次实验,发现采用连续两帧的差分,误差比较大,稳定性不是很好,容易误判。而采用3帧差分的算法则效果比较好,借鉴OPENCV的方法,成功在安霸A2S70平台上实现运动侦测的功能。现记录如下:

int MotionDetect(IplImage *img)
{
 int i, idx1 = last, idx2;
 CvSize size = cvSize(img->width,img->height);
 FILE *p_file;
 char p_file_name[50], pUniName[50];
 static int sFileNum = 0;
 printk("MotionDetect../n");
 if( motion_buf == 0 )
 {
  motion_buf = (IplImage**)malloc(N*sizeof(motion_buf[0]));
  memset( motion_buf, 0, N*sizeof(motion_buf[0]));
  for( i = 0; i < N; i++ )
  {
              cvReleaseImage( &motion_buf[i] );
              motion_buf[i] = cvCreateImage( size, IPL_DEPTH_8U, 1 );
              cvZero( motion_buf[i] );
  }
  }

 cvCopy( img, motion_buf[last], 0 );
 idx2 = (last + 1) % N; // index of (last - (N-1))th frame
 last = idx2;
 silh = motion_buf[idx2];
 cvAbsDiff( motion_buf[idx1], motion_buf[idx2], silh ); // get difference between frames
 cvThreshold( silh, silh, 30, 255.0, CV_THRESH_BINARY ); // and threshold it
 if(!FindROIArea( silh,20))return 0;
  return 1;
}
连续帧数据的获取是通过中断的方式,抓取YUV buffer里的Y分量数据,即Y的RAW DATA,实验表明,采取这种方式,计算量小,效果非常的不错。可惜就是必须要背景要是相对固定的,如果背景前景都在运动,那可能就要用复杂的背景建模算法了,下次有空准备尝试实验下。

    不管怎样,常规的运动侦测已经实现了,客户已经非常满意我的这个功能了!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值