数字视频处理实验报告

  • 格式:pdf
  • 大小:302.07 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5
{ imgSize = cvSize(m_pImage->width, m_pImage->height); // 获取原图大小 m_pResult = cvCreateImage(imgSize, IPL_DEPTH_8U, 1); // 变量初始化分配大小深度通道 m_pResultT = cvCreateImage(imgSize, IPL_DEPTH_8U,3); } number++; if(1==number)// 标记取第一帧为背景 { foreimage= cvCreateImage(imgSize, IPL_DEPTH_8U, 1);// 前景图像申请内存初始化 backimage= cvCreateImage(imgSize, IPL_DEPTH_8U, 1);// 背景图像申请内存初始化 cvCvtColor(m_pImage,backimage, CV_BGR2GRAY); imagemat = cvCreateM at(m_pImage->height,m_pImage->width,CV_32FC1);// 矩阵申请内存初始化 foremat= cvCreateM at(m_pImage->height,m_pImage->width,CV_32FC1);// 前景矩阵申请内存初始化 backmat= cvCreateM at(m_pImage->height,m_pImage->width,CV_32FC1);// 背景矩阵申请内存初始化 cvConvert(backimage, backmat); } else // 第二帧开始 { cvCvtColor(m_pImage,foreimage, CV_BGR2GRAY); cvConvert(foreimage,imagemat); /高斯滤波,平滑图像 cvSmooth(imagemat,imagemat,CV_GAUSSIAN,9,9); /当前跟背景差分 cvAbsDiff(imagemat,backmat,foremat); cvConvert(foremat,foreimage);// 矩阵转换为图像 二值化 cvThreshold(foreimage,foreimage,60,255.0,CV_THRESH_BINARY);// 提前设定阈值 cvThreshold(foreimage,foreimage,60,255.0,CV_THRESH_BINARY_INV);// 提前设定 /进行形态学滤波,去掉噪音 cvDilate(foreimage, foreimage, 0, 1); cvErode(foreimage, foreimage, 0, 1); cvErode(foreimage, foreimage, 0, 1); cvDilate(foreimage, foreimage, 0, 1);
2
颜色检测:人皮肤的颜色 3)运动检测原理 依据是否有运动来检测目标;运动目标不一定是所需要的 4)检测方法:帧差法;背景差;运动估计 (1)帧差法 原理 相邻两帧求差 d(x, y) = | I (x, y, t+dt) – I(x, y, t) | 对差值图二值化 if d(x, y) > T d(x, y) = 1 else d(x, y) = 0 (2)背景差(本次实验所用方法) 原理 当前帧与背景图像求差 d(x, y) = |B (x, y) – I(x, y, t)| 类似帧差法对差值图进行二值化 首先需要获得背景图 背景图中没有目标;可能是视频第一帧 应用范围 视频监控、智能监控等;比帧差法稍广泛
if (j<xll) xll=j; else xll=xll;
if (i<yll) yll=i; else yll=yll; } else { //ptr[j]=0; sum=sum; xsum=xsum; ysum=ysum; } } }
int xaxis; int yaxis; if(sum==0) {xaxis=0; yaxis=0;}
数字视频处理
实验报告
实验成员:
2012 年 11 月 7 日
运动目标检测
——OpenCV 的使用
一ቤተ መጻሕፍቲ ባይዱ实验目的
1、用 OpenCV/Simulink 实现视频播放; 2、实现至少一种预处理功能; 3、实现至少一种目标检测方法,帧差、背景差、或运动估计等; 二、实验原理 1、视频处理 流程(Simulink)
采集
预处理
处理
后处理
存储/播放
2、预处理 1)目的 (1)为处理过程提供有用的数据; (2)提高视频的清晰性; (3)作必要的格式变换。 2)类型 (1)彩色变换 (2)增强对比度 (3)去噪声 (4)提取感兴趣区域
1
(5)边缘提取 3)预处理方法 (1) 灰度变换: 改善图像的视觉效果, 提高图像景物成分的清晰度, 而对图像各个像素进行的调整操作。 (2)图像平滑:消除图像噪声 噪声: 成因: 图像在形成、传输、接收和处理的过程中,不可避免的受到 了内、外部干扰。 类型: 加性噪声:例如,由传感器产生的高斯白噪声,独立于信号强度 乘性噪声:例如,成像系统产生的斑点噪声 量化噪声:产生于对图像采样、量化的过程中 椒盐噪声:双极脉冲噪声,在图像中表现为孤立的黑、白点 (3)几何变换:各种运动和坐标的几何变换 包括:射影变换;仿射变换;刚性变换:也称正交变换 3、目标检测 1)目的 检查视野内有无需要的目标,如人脸、车辆; 为跟踪和识别作准备。 2)分类 运动检测:利用运动信息 形状检测:利用目标形状信息。形状特征量:特征点、小波
7
else {xaxis=xsum/sum; yaxis=ysum/sum;} printf("\n"); printf("形心X 坐标是:%d",xaxis);printf(" printf("\n"); printf(" 角点X 坐标是:%d",xll);printf(" printf("\n"); 角点Y 坐标是:%d",yll); 形心Y 坐标是:%d",yaxis);
6
for(int j=0;j<pImg1->width;j++) { double temp =ptr[j]; if(temp>60) { //ptr[j]=255; sum++; xsum=xsum+i; ysum=ysum+j;
if(j>xhh) xhh=j; else xhh=xhh;
if(i>yhh) yhh=i; else yhh=yhh;
IplImage* pImg1 =foreimage ; int sum=0; int xsum=0; int ysum=0; int xll=pImg1->width; int xhh=0; int yll=pImg1->height; int yhh=0; for(int i=0;i<pImg1->height;i++) { uchar* ptr=(uchar*)(pImg1->imageData+i*pImg1->widthStep);
3
改进 背景模型;高斯模型等 (3)运动估计 原理 计算视频运动场(光流)的幅度 f(x, y) = |u2 (x, y) + v2(x, y)|1/2 对运动场(光流)的幅度二值化 if f(x, y) > T f(x, y) = 1 else f(x, y) = 0 5)目标检测后处理 对检测到的团块作处理 滤波:去除小目标、平滑团块 统计:质心位置、面积等 团块处理方法 形态学滤波:膨胀、腐蚀;开运算、闭运算 挑选目标:根据面积、形状等准则 三、实验结果 1、实验 OpenCV 代码
cvShowImage( "VideoDisplay1", m_pImage );// 图像显示 cvShowImage( "VideoDisplay2", m_pResult ); cvShowImage( "VideoDisplay3", m_pResultT ); cvShowImage( "VideoDisplay4", foreimage ); //cvShowImage( "result", frame ); Sleep(10); if( cvWaitKey( 10 ) >= 0 ) break; } cvReleaseM at(&imagemat); cvReleaseM at(&foremat); cvReleaseM at(&backmat); cvReleaseImage( &frame ); cvReleaseImage( &m_pImage ); cvReleaseImage( &m_pResult ); cvReleaseImage( &m_pResultT ); cvReleaseImage( &foreimage); cvReleaseImage( &backimage); cvReleaseCapture( &capture ); } cvDestroyWindow("VideoDisplay1"); cvDestroyWindow("VideoDisplay2"); cvDestroyWindow("VideoDisplay3"); cvDestroyWindow("VideoDisplay4"); return 0; }
if( capture ) { for(;;)// 视频流循环 { if( !cvGrabFrame( capture )) break; frame = cvRetrieveFrame( capture ); if( !frame ) break; m_pImage =frame;
if(!m_pResult)
int main( int argc, char** argv ) { int number=0; CvCapture* capture = 0; IplImage *frame,*m_pImage,*m_pResultT,*m_pResult=0;// 图像指针 IplImage* backimage=NULL;// 图像指针 IplImage* foreimage=NULL; //IplImage* tank=NULL; CvMat* imagemat=NULL;// 矩阵指针 CvMat* foremat=NULL; CvMat* backmat=NULL; CvSize imgSize;// 图像大小变量 cvNamedWindow( "VideoDisplay1",0/*CV_WINDOW_AUTOSIZE*/);// 创建窗口 cvNamedWindow( "VideoDisplay2",0/*CV_WINDOW_AUTOSIZE*/); cvNamedWindow( "VideoDisplay3",0/*CV_WINDOW_AUTOSIZE*/); cvNamedWindow( "VideoDisplay4",0/*CV_WINDOW_AUTOSIZE*/); capture = cvCaptureFromFile("F:\\gongcheng\\project5(视频保存)\\project5\\shouying.avi"); //capture = cvCaptureFromFile("F:\\Titanic1997.rmvb");
cvRectangle(pImg1, cvPoint(xll-10,yll-10), cvPoint(xhh+10,yhh+10), cvScalar(255,255,255), 1); } cvCvtColor(m_pImage, m_pResult, CV_BGR2GRAY);// 颜色转换 cvSmooth(m_pImage,m_pResultT,CV_GAUSSIAN,5,5);// 滤波高斯滤波像素*5范围内平滑 cvFlip(m_pImage,0,1); // 翻转变换0上下>0左右 自身翻转或者目标翻转
#include "cv.h" #include "highgui.h" #include <stdio.h> #include <stdlib.h>
4
#include <string.h> #include <assert.h> #include <math.h> #include <float.h> #include <limits.h> #include <time.h> #include <ctype.h> #ifdef _EiC #define WIN32 #endif