|
视频中的运动目标检测不到,求大神指导一下,是哪个地方出错了,程序编译正常
#include <iostream.h>
#include <math.h>
#include <stdio.h>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
int main(int argc,char* argv[])
{
cvNamedWindow("RealTraking",0);
IplImage* FirstImage=NULL;//作为背景
IplImage* SecondImage=NULL;//作为前景
IplImage* pFrame = NULL;//全景图像获取
IplImage* TempImage=NULL;//临时存储图像
CvMat* FirstMat=NULL;
CvMat* SecondMat=NULL;
CvMat* TempMat=NULL;
//CvMat* pFrameMat=NULL;
CvPoint RECT1;
CvPoint RECT2;
CvPoint RECT3;
CvPoint RECT4;
CvPoint RECT5;
CvPoint RECT6;
CvRect AndRect=cvRect(0,0,0,0);//目标的外接矩形
CvMemStorage *storage=cvCreateMemStorage(0);
CvSeq * contour = 0;
int XDiff=0;
int YDiff=0;
int middle_x=0;
int middle_y=0;
CvCapture* pCapture = NULL;//摄像头图像/视频获取
int FrameNumber=0;
if( argc > 2 )
{
fprintf(stderr, "Usage: bkgrd [video_file_name]\n");
return -1;
}
//打开摄像头
/*if(argc ==1)
if( !(pCapture = cvCaptureFromCAM(-1)))
{
fprintf(stderr, "Can not open camera.\n");
return -2;
}
*/
//打开视频文件
if(argc == 2)
if( !(pCapture=cvCaptureFromFile(argv[1])))
{
fprintf(stderr, "Can not open video file %s\n", argv[1]);
return -2;
}
//逐帧读取视频
while(pFrame = cvQueryFrame( pCapture ))
{
FrameNumber++;
//如果是第一帧,需要申请内存,并初始化
if(FrameNumber == 1)
{
FirstImage = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);//创建背景图像
SecondImage = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);//创建前景图像
TempImage = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
FirstMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//创建背景数据矩阵
SecondMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//创建前景矩阵
TempMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//临时存储矩阵
//pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//当前帧存储空间
//转化成单通道图像再处理
cvCvtColor(pFrame, FirstImage, CV_BGR2GRAY);//第一帧作为背景图像,并将颜色转化为灰度
cvCvtColor(pFrame, SecondImage, CV_BGR2GRAY);//第一帧作为前景图像,并将颜色转化为灰度
cvCvtColor(pFrame,TempImage,CV_RGB2GRAY);
//cvConvert(FirstImage, pFrameMat);//图像转化为数据矩阵
cvConvert(FirstImage, FirstMat);//
cvConvert(SecondImage, SecondMat);//
cvConvert(TempImage,TempMat);//
}
else//(FrameNumber>=2)
{
cvCvtColor(pFrame, SecondImage, CV_BGR2GRAY);//帧的图片内容转化为灰度图像并存到SecondImage.
cvConvert(SecondImage, SecondMat);//当前帧内容转化为矩阵数据
//高斯滤波先,以平滑图像
cvSmooth(SecondMat, SecondMat, CV_GAUSSIAN, 3, 0, 0);
//当前帧跟背景图相减
cvAbsDiff(SecondMat, FirstMat, TempMat);
//cvConvert(TempMat,TempImage);
//二值化前景图
cvThreshold(TempMat, TempImage, 150, 255.0, CV_THRESH_BINARY);
//图像形态学处理---腐蚀与膨胀
//cvErode(TempImage,TempImage,0,1);
//cvDilate(TempImage,TempImage,0,1);
//提取前景边缘\轮廓
int count=cvFindContours(TempImage,storage,&contour,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
if(count!=0)
{
AndRect=cvBoundingRect(contour);
RECT1.x=AndRect.x;
RECT1.y=AndRect.y;
RECT2.x=AndRect.x+AndRect.width;
RECT2.y=AndRect.y+AndRect.height;
cvRectangle(pFrame, RECT1, RECT2, CV_RGB(255,0,0),1,8,0 );
middle_x =(int)(RECT1.x+AndRect.width)/2;
middle_y =(int)(RECT1.y+AndRect.height)/2;
/*RECT3.x=middle_x+15;
RECT3.y=middle_y;
RECT4.x=middle_x-15;
RECT4.y=middle_y;
cvLine(pFrame,RECT3,RECT4,CV_RGB(255,0,0),1,8);
RECT5.x=middle_x;
RECT5.y=middle_y+15;
RECT6.x=middle_x;
RECT6.y=middle_y-15;
cvLine(pFrame,RECT5,RECT6,CV_RGB(255,0,0),1,8);
*/
XDiff=(int)(pFrame->width/2-middle_x);
YDiff=(int)(pFrame->height/2-middle_y);
cout<<"XDiff:"<<XDiff<<'\n';
cout<<"YDIff:"<<YDiff<<'\n';
}
/* else//目标静止则与前一帧作相同处理
{
cvRectangle(pFrame, RECT1, RECT2, CV_RGB(255,0,0),1,8,0 );
cvLine(pFrame,RECT3,RECT4,CV_RGB(255,0,0),1,8);
cvLine(pFrame,RECT5,RECT6,CV_RGB(255,0,0),1,8);
cout<<"XDiff:"<<XDiff<<'\n';
cout<<"YDIff:"<<YDiff<<'\n';
}
*/
//更新背景
cvRunningAvg(SecondMat, FirstMat, 0, 0);
//将背景转化为图像格式,用以显示
//cvConvert(FirstMat, FirstImage);
//显示图像
cvShowImage("RealTracking", pFrame);
//如果有按键事件,则跳出循环
//此等待也为cvShowImage函数提供时间完成显示
//等待时间可以根据CPU速度调整
if( cvWaitKey(0) >= 0 )
break;
}
}
//销毁窗口
cvDestroyWindow("RealTracking");
//释放图像和矩阵
cvReleaseImage(&FirstImage);
cvReleaseImage(&SecondImage);
cvReleaseImage(&TempImage);
//cvReleaseMat(&pFrameMat);
cvReleaseMat(&FirstMat);
cvReleaseMat(&SecondMat);
cvReleaseMat(&TempMat);
cvReleaseMemStorage(&storage);
//cvClearSeq(contour);
cvReleaseCapture(&pCapture);
return 0;
} |
|