高斯建模去除背景

41 篇文章 0 订阅
21 篇文章 0 订阅
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <cvaux.h>//必须引此头文件


void main( )

//参数初始化定义
IplImage* pFrame = NULL; //每一帧
IplImage* pFrImg = NULL; //前景
IplImage* pBkImg = NULL; //背景


CvCapture* pCapture = NULL;

IplImage* origin_rgb = NULL ;//定义rgb空间的存储
IplImage* origin_ycc = NULL ;//定义转换成YCrCb空间的存储

IplImage* lumi = NULL ;//定义亮度分量的存储空间


//定义窗口
cvNamedWindow("frame",1);//定义显示窗口的名字,显示原始的视频
cvMoveWindow("frame",30,0);//定义显示窗口的位置

cvNamedWindow("background",1);//显示经过转换格式的视频
cvMoveWindow("background",360,0);

cvNamedWindow("foreground",1);//显示经过亮度提取的视频
cvMoveWindow("foreground",690,0); 


//读取一帧视频文件作为初始化
//pCapture = cvCaptureFromFile("SAM_2334.MP4") ;
pCapture = cvCaptureFromFile("t.avi") ;
pFrame = cvQueryFrame(pCapture);

int i ;
for (i=0;i<2;i++)
{
pFrame = cvQueryFrame(pCapture);
}

 
//RGB转换成亮度
origin_rgb = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 3 );
origin_ycc = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 3 );

lumi = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1 );
pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1 );
pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1 );


//origin_rgb = cvCloneImage(pFrame) ;//或者 cvCopy(pFrame,origin_rgb,NULL) ;
cvCopy(pFrame,origin_rgb,NULL) ;//复制视频
cvCvtColor(origin_rgb,origin_ycc,CV_BGR2YCrCb) ; //实现视频格式转换
cvSplit(origin_ycc,lumi,NULL,NULL,NULL); //获取亮度分量


//为高斯模型设置初时参数
CvGaussBGStatModelParams* params = new CvGaussBGStatModelParams; 
params->win_size = 50; //初始化阶段的帧数,这个参数的倒数就是我们知道的背景模型的更新率
params->n_gauss = 3;// 高斯模型个数,这个参数看你用几层高斯模型了,一般选3 
params->bg_threshold = 0.7;//高斯背景阈值 
params->std_threshold = 3.5;//3.5 这个参数是当前面一个高斯权值的和的阈值
params->minArea = 15;//最小面积,,这个参数是用来去噪的
params->weight_init = 0.333;// 初始权重
params->variance_init = 30;// 初始方差


CvBGStatModel* bgModel = cvCreateGaussianBGModel(lumi,params);


int key=-1;
while( NULL != ( pFrame = cvQueryFrame(pCapture) ) )
{
//获取下一帧视频
if ( pFrame == NULL)
{
break;
}
cvCopy(pFrame,origin_rgb,NULL) ;//复制视频
cvCvtColor(origin_rgb,origin_ycc,CV_BGR2YCrCb) ; //实现视频格式转换
cvSplit(origin_ycc,lumi,NULL,NULL,NULL); //获取亮度分量
if( !pFrame )
break;


//更新高斯模型
cvUpdateBGStatModel(lumi,bgModel);
pFrImg = bgModel->foreground ;//前景图象
pBkImg = bgModel->background ; //背景图象


//将图象倒转过来
//pBkImg->origin = 1 ; 
//pFrImg->origin = 1 ;
//lumi->origin = 1 ;


static int k = 0;
char tmpBuf[256]={'0'}; memset(tmpBuf, '0', sizeof(tmpBuf));
sprintf(tmpBuf, "dst//%d.jpg", k++);
printf("%s\n", tmpBuf);
cvSaveImage(tmpBuf, pFrImg);


//显示结果
cvShowImage("frame",lumi);
cvShowImage("background",pBkImg);
cvShowImage("foreground",pFrImg);
key = cvWaitKey(10);
}
// cvWaitKey(0) ;//窗口的回调函数,必须要的,不然窗口的显示会不正常
//释放窗口内存资源
cvDestroyWindow("frame");
cvDestroyWindow("background");
cvDestroyWindow("foreground");


//释放图象占用的内存资源
cvReleaseImage(&lumi); 
cvReleaseImage(&pBkImg); 
cvReleaseImage(&pFrImg); 
cvReleaseCapture(&pCapture); 
cvReleaseBGStatModel( &bgModel );
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高斯背景建模是一种背景建模方法,可以用于背景分割和运动目标检测。具体地说,高斯背景建模将每个像素的灰度值看作是一个随时间变化的随机变量,通过对这个随机变量建模,可以得到该像素在背景下的分布。当一个像素的灰度值与背景分布的差异超过一个阈值时,就认为该像素是一个前景像素,否则就是背景像素。 下面是一个简单的高斯背景建模分离背景的实验流程: 1. 收集视频数据。可以使用摄像机或者视频文件来收集视频数据。 2. 对视频数据进行预处理。可以根据需要对视频数据进行去噪、平滑等预处理操作。 3. 对视频中的每个像素建立高斯背景模型。可以使用OpenCV等开源库来实现高斯背景模型的建立。 4. 对每一帧图像进行背景分割。通过比较每个像素的灰度值与对应的背景模型,可以得到每个像素的前景/背景分类结果。 5. 对分割结果进行后处理。可以使用形态学操作、连通性分析等方法对分割结果进行后处理,去除噪声和孤立的前景像素。 6. 可视化分割结果。可以将分割结果可视化输出,例如将前景像素标记为红色,背景像素标记为白色。 需要注意的是,高斯背景建模是一种基于背景差分的方法,对于背景中存在的运动物体,会被误判为前景物体。因此,在实际使用中需要针对不同的场景和应用需求进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值