机器视觉-实验四报告-运动分析和检测

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()

相关文档
最新文档