背景差法OpenCV实现程序代码
2011-03-08 17:31
337 查看
背景差法OpenCV实现程序代码
默认分类 2010-11-12 22:10:27 阅读70 评论0 字号:大中小 订阅#include "highgui.h" #include "cv.h" #include <stdio.h> #include"例子一.h" int main(int argc,char**argv) { //声明指针,矩阵 IplImage*image=NULL; IplImage*backimage=NULL; IplImage*foreimage=NULL; IplImage*tank=NULL; CvMat*imagemat=NULL; CvMat*foremat=NULL; CvMat*backmat=NULL; CvCapture*capture=NULL; int num=0; //创建窗口 cvNamedWindow("cvcamwindow",CV_WINDOW_AUTOSIZE); cvNamedWindow("foreground",1); cvNamedWindow("background",1); cvNamedWindow("wo",1); //读取摄像头 if(argc==1||(argc==2&&strlen(argv[1])==1&&isdigit(argv[1][0]))) capture=cvCaptureFromCAM(argc==2?argv[1][0]-'0':0); else if(argc==2) capture=cvCaptureFromAVI(argv[1]); //声明视频结构 int isColor = 1; int frameW=160; int frameH=120; int fps=8; CvVideoWriter* camWriter=cvCreateVideoWriter("E://directx//jianhua12.avi",-1,fps,cvSize(frameW,frameH),isColor); if(!capture) { fprintf(stderr,"could not initialize capturing.../n"); return 0; } //处理图像 while(image=cvQueryFrame(capture)) { num++; if(num==1)//第一针申请内存 { foreimage=cvCreateImage(cvGetSize(image),8,1); backimage=cvCreateImage(cvGetSize(image),8,1); tank=cvCreateImage(cvGetSize(image),8,3); backmat=cvCreateMat(image->height,image->width,CV_32FC1); foremat=cvCreateMat(image->height,image->width,CV_32FC1); imagemat=cvCreateMat(image->height,image->width,CV_32FC1); //转换成单通道处理 cvCvtColor(image,backimage,CV_BGR2GRAY); cvCvtColor(image,foreimage,CV_BGR2GRAY); //矩阵初始化 cvConvert(foreimage,foremat); cvConvert(foreimage,backmat); cvConvert(foreimage,imagemat); } else { cvCvtColor(image,foreimage,CV_BGR2GRAY); cvConvert(foreimage,imagemat); //高斯滤波,平滑图像 cvSmooth(imagemat,imagemat,CV_GAUSSIAN,3,0,0); //当前跟背景差分 cvAbsDiff(imagemat,backmat,foremat); cvConvert(foremat,foreimage); //二值化 cvThreshold(foreimage,foreimage,60,255.0,CV_THRESH_BINARY); //进行形态学滤波,去掉噪音 cvDilate(foreimage, foreimage, 0, 1); cvErode(foreimage, foreimage, 0, 1); cvErode(foreimage, foreimage, 0, 1); cvDilate(foreimage, foreimage, 0, 1); |
int nl=foreimage->height;
int nc=foreimage->width;
BwImage foreimageA(foreimage);
RgbImage imageA(image);
RgbImage tankA(tank);
for(int i=0;i<nl;i++)
{
for(int j=0;j<nc;j++)
{
if (foreimageA[i][j]==0)
{
tankA[i][j].b=0;
tankA[i][j].g=0;
tankA[i][j].r=0;
}
else
tankA[i][j]=imageA[i][j];
}
}
tank->origin=image->origin;
//保存前景
cvWriteFrame(camWriter,tank);
//更新背景
cvRunningAvg(imagemat,backmat,0.005,0);
//将背景转化为图像格式
cvConvert(backmat,backimage);
//使图像正立
backimage->origin=image->origin;
foreimage->origin=image->origin;
//显示图像
cvShowImage("cvcamwindow", image);
cvShowImage("background", backimage);
cvShowImage("foreground" ,foreimage);
cvShowImage("wo",tank);
//时间缓冲
int key=cvWaitKey(90);
if(cvWaitKey(2)>=0)
break;
}
}
cvDestroyWindow("cvcam window");
cvDestroyWindow("background");
cvDestroyWindow("foreground");
cvDestroyWindow("wo");
cvReleaseImage(&foreimage);
cvReleaseImage(&backimage);
cvReleaseImage(&tank);
cvReleaseMat(&imagemat);
cvReleaseMat(&foremat);
cvReleaseMat(&backmat);
cvReleaseVideoWriter (&camWriter);
return 0;
}
相关文章推荐
- opencv实践程序4——canny实现摄像头的边缘检测,高斯背景建模
- 运动目标的背景建模-混合高斯背景建模和KNN模型建模的OpenCV代码实现
- 目标检测——CodeBook背景建模(原理+Opencv实现代码)
- Android-代码实现view的背景渐变色
- 代码实现程序前后台切换
- socket select用法:100行代码实现网络数据转发程序
- delphi 无代码实现背景透明及窗体异形方法及原理
- Android 代码实现自定义圆角背景
- Strom程序的并发机制,配置并行度(代码实现)、动态改变并行度,local or shuffle分组,分组的概念以及分组类型
- jQuery实现响应鼠标背景变化的动态菜单效果代码
- 基于C++和OpenCv的SIFT_图像局部特征检测算法代码的实现
- java代码中实现android背景选择的selector-StateListDrawable的应用
- [导入]AjaxPanel自定义控件实现页面无刷新数据交互(做了个示例程序, 效果确实比较Cool, 用法非常简单! )(示例代码下载)
- JavaScript实现的背景自动变色代码
- CSS基于单张背景图实现自适应宽度的圆角菜单效果代码
- 灰度图像的对数变换原理及OpenCV代码实现!
- php 实现多文件上传程序代码
- Windows Forms 实现安全的多线程详解(附带程序代码示例)
- 微信小程序 短信验证 功能的实现(附案例代码/前后端/直接用)
- VB.NET轻松实现任务栏程序 [不到10行代码]