关于opencv高斯背景建模问题

伤心鼠标 2014-11-13 03:17:50
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <cvaux.h>//必须引此头文件
int main( int argc, char** argv )
{

IplImage* pFrame = NULL;
IplImage* pFrImg = NULL;
IplImage* pBkImg = NULL;
IplImage* pBackImg = NULL;
CvCapture* pCapture = NULL;
int nFrmNum = 0;

CvMat* pBkMat = NULL;
CvMat* pFrMat =NULL;
CvMat* pFrameMat = NULL;

cvNamedWindow("video", 1);
cvNamedWindow("background",1);
cvNamedWindow("foreground",1);
cvMoveWindow("video", 30, 0);
cvMoveWindow("background", 360, 0);
cvMoveWindow("foreground", 690, 0);
// if( argc > 2 )
// {
// fprintf(stderr, "Usage: bkgrd [video_file_name]\n");
// return -1;
// }


//打开视频文件
// if(argc == 2)
// if( !(pCapture = cvCaptureFromFile(argv[1])))
// {
// fprintf(stderr, "Can not open video file %s\n", argv[1]);
// return -2;
// }
//打开摄像头
// if (argc == 1)
// if( !(pCapture = cvCaptureFromCAM(2)))
// {
// fprintf(stderr, "Can not open camera.\n");
// return -2;
// }

pCapture = cvCreateCameraCapture(2);
//初始化高斯混合模型参数
CvGaussBGModel* bg_model=NULL;

while(pFrame = cvQueryFrame( pCapture ))
{
nFrmNum++;
if(nFrmNum ==1)
{
pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,3);
pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);


//高斯背景建模,pFrame可以是多通道图像也可以是单通道图像
//cvCreateGaussianBGModel函数返回值为CvBGStatModel*,
//需要强制转换成CvGaussBGModel*
CvGaussBGStatModelParams params;
params.win_size = 200; //Learning rate = 1/win_size;
params.bg_threshold = 0.7; //Threshold sum of weights for background test 高斯分布权重之和阈值
params.weight_init = 0.1; //初始权重
params.variance_init = 30; //初始标准差
params.minArea = 15.f;
params.n_gauss = 5; //= K =Number of gaussian in mixture
params.std_threshold = 5;

bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, ¶ms);
//cvShowImage("model", pFrame);

}
else
{
// cvShowImage("video1", pFrame);
// cvShowImage("background1", pBkImg);
// cvShowImage("foreground1", pFrImg);
/*pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);*/
//更新高斯模型
cvUpdateBGStatModel(pFrame, (CvBGStatModel *)bg_model,0 );
// cvShowImage("video1", pFrame);
// cvShowImage("background1", pBkImg);
// cvShowImage("foreground1", pFrImg);
//pFrImg为前景图像,只能为单通道
//pBkImg为背景图像,可以为单通道或与pFrame通道数相同
cvCopy(bg_model->foreground,pFrImg,0);
cvCopy(bg_model->background,pBkImg,0);
/*pBkImg = cvLoadImage("pp.jpg",-1);*/
//把图像正过来
/*pBkImg->origin=1;*/
// pFrImg->origin=1; // 这个不需要翻转(实验结果得知)
// pFrameMat = cvCreateMat(pFrame->height,pFrame->width,CV_32SC3);
// pFrMat = cvCreateMat(pFrImg->height,pFrImg->width,CV_32SC1);
// cvMatMulAdd(pFrMat,pFrameMat,NULL,pFrImg);
// pBackImg = cvCreateImage(cvSize(pFrame->height,pFrame->width),IPL_DEPTH_8U,3);
// cvCvtColor(pFrImg,pBackImg,CV_GRAY2BGR);
cvShowImage("video", pFrame);
cvShowImage("background", pBkImg);
cvShowImage("foreground", pFrImg);
if( cvWaitKey(10) == 27 )
break;
}

}

//释放高斯模型参数占用内存
cvReleaseBGStatModel((CvBGStatModel**)&bg_model);
cvDestroyWindow("video");
cvDestroyWindow("background");
cvDestroyWindow("foreground");
cvReleaseImage(&pFrImg);
cvReleaseImage(&pBkImg);
cvReleaseCapture(&pCapture);
return 0;
}


这个是利用opencv的库编写的背景消除,显示出来以后"foreground"的图片是那种黑白的,这个应该是单通道的原因吧,那我想知道怎么把他变回原来的呢。其实就是说怎么显示出真实的有色彩的图像。求大神指点!
...全文
392 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-11-13
  • 打赏
  • 举报
回复
建议先编译链接调试OpenCV自带的相关例子代码。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧