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

   实现运动侦测功能实际上就是采用帧间差分的方法来判断相邻两帧或多帧差异是否大于某个事先设定的值,如果是就认为有运动行为发生。本人经过多次实验,发现采用连续两帧的差分,误差比较大,稳定性不是很好,容易误判。而采用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,实验表明,采取这种方式,计算量小,效果非常的不错。可惜就是必须要背景要是相对固定的,如果背景前景都在运动,那可能就要用复杂的背景建模算法了,下次有空准备尝试实验下。

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

你可能感兴趣的:(图像处理,平台,算法,file,buffer)