机器视觉-实验四报告-运动分析和检测
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四报告运动分析和检测
一、实验目的
采用帧间差分法和累积差图像法对运动物体进行运动分析,并将分析结果用:矢量场、运动矢量直方图和运动轨迹等三种运动表达法表示。
二、实验设备
微机
三、实验内容及步骤
采用帧间差分法和累积差图像法对运动物体进行运动分析,并将分析结果用:矢量场、运动矢量直方图和运动轨迹等三种运动表达法表示。
实验原理见第7章ppt,实验图片自己网上下载
1.上机编写程序。
2.调试程序。
3.根据实验结果,撰写实验报告。
四、实验报告
1.源代码
//下面的函数用以检测视频中运动的目标
void CtraceDlg::OnBnClickedTracing()
{
IplImage* pFrame=NULL;//声明当前帧
IplImage* pFrImg=NULL;//声明前景图像
IplImage* pBkImg=NULL;//声明背景图像
//声明对应的图像矩阵
CvMat* pFrameMat=NULL;
CvMat* pFrMat=NULL;
CvMat* pBkMat=NULL;
CvCapture* pCapture=NULL; //声明视频捕捉器,用以读取视频内容int nFrmNum=0;
if(!(pCapture=cvCaptureFromFile(aviFilePath)))
{
MessageBox(_T("请先打开视频文件"));
return;
}
//create video windows
cvNamedWindow("Video",1);
cvNamedWindow("Background",1);
cvNamedWindow("Foreground",1);
cvMoveWindow("Video", 30, 0);
cvMoveWindow("Background", 360, 0);
cvMoveWindow("Foreground", 690, 0);
//read every frame
while(pFrame=cvQueryFrame(pCapture))
{
nFrmNum++;
if(nFrmNum==1)
{
//存放背景图像(灰度)
pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
//存放前景图像(灰度)
pFrImg=cvCreateImage(cvSize(pFrame->width,pFrame-
>height),IPL_DEPTH_8U,1);
//图像对应的矩阵都是一维的
pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); //将彩色图像转化为灰度图像
cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
//将灰度图像存入矩阵,灰度图像是单通道的
cvConvert(pFrImg, pFrameMat);
cvConvert(pFrImg, pFrMat);
cvConvert(pBackground, pBkMat);
}
else
{
cvCvtColor(pFrame,pFrImg,CV_BGR2GRAY);
cvConvert(pFrImg,pFrameMat);
//高斯滤波
cvSmooth(pFrameMat,pFrameMat,CV_GAUSSIAN,3,0,0,0);
//当前帧减去背景图像并取绝对值
cvAbsDiff(pFrameMat,pBkMat,pFrMat);
//二值化前景图像
cvThreshold(pFrMat, pFrImg, 20, 255.0, CV_THRESH_BINARY); //形态学滤波,去噪
cvErode(pFrImg, pFrImg, 0, 1);
cvDilate(pFrImg, pFrImg, 0, 2);
cvErode(pFrImg,pFrImg,0,1);
//滑动平均更新背景(求平均)
cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);
//将背景矩阵转化为图像格式,用以显示
cvConvert(pBkMat,pBkImg);
//保持图像的旋转方向
//pBkImg->origin=pFrImg->origin=pFrame->origin;
//显示图像
cvShowImage("Video",pFrame);
cvShowImage("Background",pBackground);
cvShowImage("Foreground",pFrImg);
if(cvWaitKey(200)>=0)
break;
}
}
cvDestroyWindow("Video"); cvDestroyWindow("Background"); cvDestroyWindow("Foreground"); cvReleaseImage(&pFrImg); cvReleaseImage(&pBkImg); cvReleaseMat(&pFrameMat); cvReleaseMat(&pFrMat); cvReleaseMat(&pBkMat); cvReleaseCapture(&pCapture);
}
//下面的函数用来跟踪视频中的目标
void CtraceDlg::OnBnClickedButton2()