在安霸平台上实现运动侦测的功能
2010-09-20 15:51
246 查看
实现运动侦测功能实际上就是采用帧间差分的方法来判断相邻两帧或多帧差异是否大于某个事先设定的值,如果是就认为有运动行为发生。本人经过多次实验,发现采用连续两帧的差分,误差比较大,稳定性不是很好,容易误判。而采用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,实验表明,采取这种方式,计算量小,效果非常的不错。可惜就是必须要背景要是相对固定的,如果背景前景都在运动,那可能就要用复杂的背景建模算法了,下次有空准备尝试实验下。
不管怎样,常规的运动侦测已经实现了,客户已经非常满意我的这个功能了!
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,实验表明,采取这种方式,计算量小,效果非常的不错。可惜就是必须要背景要是相对固定的,如果背景前景都在运动,那可能就要用复杂的背景建模算法了,下次有空准备尝试实验下。
不管怎样,常规的运动侦测已经实现了,客户已经非常满意我的这个功能了!
相关文章推荐
- Python平台下调用阿里云API参数实现DDNS功能
- .Net语言 APP开发平台——Smobiler学习日志:如何在手机上实现电子签名功能
- .Net语言 APP开发平台——Smobiler学习日志:如何快速实现手机上的资源上传功能
- .Net语言 APP开发平台——Smobiler学习日志:在手机应用开发中如何快速实现应用间的分享功能
- 展讯的8825平台 在TP上实现距离传感器的功能
- .Net语言 APP开发平台——Smobiler学习日志:如何快速实现Timer计时功能
- .Net语言 APP开发平台——Smobiler学习日志:如何快速实现按钮组功能
- 微信小程序实现运动步数排行功能(可删除)
- Android 使用百度鹰眼实现运动轨迹功能
- EasyMap平台-08-测量功能实现
- 在安霸A2S70平台上用纯软件实现面部识别功能
- 点滴积累【JS】---JS小功能(JS实现多物体缓冲运动)
- IT忍者神龟之Java通过SMS短信平台实现发短信功能
- 使用MVP模式实现B/S和C/S平台的功能通用
- 利用第三方服务平台实现简单的短信验证功能
- Java通过SMS平台实现短信发送功能
- MTK平台动态加载功能实现
- 基于qualcomm平台实现心率变化的检测功能
- 【Android进阶】使用第三方平台 ShareSDK 实现新浪微博的一键分享功能
- Java通过SMS短信平台实现发短信功能