opencv图像分割合成_OpenCV —— 图像局部与部分分割(一)

//背景法 --- 只能用于背景场景中不包含运动的部分//为需要的不同临时图像和统计属性图像创建指针

IplImage *IavgF,IdiffF,*IprevF,*IhiF,*IlowF;

IplImage*Iscratch,*Iscratch2;

IplImage*Igray1,*Igray2,*Igray3;

IplImage*Ilow1,*Ilow2,*Ilow3;

IplImage*Ihi1,*Ihi2,*Ihi3;

IplImage*Imaskt;float Icount; //couts number of images learned for averaging later//创建一个函数给需要的所有临时图像分配内存

void AllocateImages(IplImage*I)

{

CvSize sz=cvGetSize(I);

IavgF=cvCreateImage(sz,IPL_DEPTH_32F,3);

IdiffF=cvCreateImage(sz,IPL_DEPTH_32F,3);

IprevF=cvCreateImage(sz,IPL_DEPTH_32F,3);

IhiF=cvCreateImage(sz,IPL_DEPTH_32F,3);

IlowF=cvCreateImage(sz,IPL_DEPTH_32F,3);

Ilow1=cvCreateImage(sz,IPL_DEPTH_32F,1);

Ilow2=cvCreateImage(sz,IPL_DEPTH_32F,1);

Ilow3=cvCreateImage(sz,IPL_DEPTH_32F,1);

Ihi1=cvCreateImage(sz,IPL_DEPTH_32F,1);

Ihi2=cvCreateImage(sz,IPL_DEPTH_32F,1);

Ihi3=cvCreateImage(sz,IPL_DEPTH_32F,1);

cvZero(IavgF);

cvZero(IdiffF);

cvZero(IprevF);

cvZero(IhiF);

cvZero(IlowF);

Icount= 0.00001; //Protect against divide by zero

Iscratch=cvCreateImage(sz,IPL_DEPTH_32F,3);

Iscratch2=cvCreateImage(sz,IPL_DEPTH_32F,3);

Igray1=cvCreateImage(sz,IPL_DEPTH_32F,1);

Igray2=cvCreateImage(sz,IPL_DEPTH_32F,1);

Igray3=cvCreateImage(sz,IPL_DEPTH_32F,1);

Imaskt=cvCreateImage(sz,IPL_DEPTH_32F,1);

cvZero(Iscratch);

cvZero(Iscratch2);

}//学习积累背景图像和每一帧图像差值的绝对值

void accumulateBackground(IplImage*I)

{static int first=1;

cvCvtScale(I,Iscratch,1,0);if (!first)

{

cvAcc(Iscratch,IavgF);

cvAbsDiff(Iscratch,IprevF,Iscratch2);

cvAcc(Iscratch,IdiffF);

Icount+=1.0;

}

first=0;

cvCopy(Iscratch,IprevF);

}void setHighThreshold(floatscale)

{

cvConvertScale(IdiffF,Iscratch,scale);

cvAdd(Iscratch,IavgF,IhiF);

cvSplit(IhiF,Ihi1,Ihi2,Ihi3,0);

}void setLowThreshold(floatscale)

{

cvConvertScale(IdiffF,Iscratch,scale);

cvSub(IavgF,Iscratch,IlowF);

cvSplit(IlowF,Ilow1,Ilow2,Ilow3,0);

}//计算每一个像素的均值和方差观测 (平均绝对差分)

voidcreateModelsfromStats()

{

cvConvertScale(IavgF,IavgF,(double)(1.0/Icount));

cvConvertScale(IdiffF,IdiffF,(double)(1.0/Icount));//make sure diff is always something

cvAddS(IdiffF,cvScalar(1.0,1.0,1.0),IdiffF);

setHighThreshold(7.0);

setLowThreshold(6.0);//对每一帧图像的绝对差大于平均值7倍的像素都认为是前景

}//有了背景模型,同时给出了高低阈值,就可以用它将图像分割成前景(不能被背景模型解释的图像部分)和背景(在背景模型中,任何高低阈值之间的图像部分)

void backgroundDiff(IplImage* I,IplImage*Imask)

{

cvCvtScale(I,Iscratch,1,0); //To float

cvSplit(Iscratch,Igray1,Igray2,Igray3);//channel 1

cvInRange(Igray1,Ilow1,Ihi1,Imask); //是否在高低阈值之间//channel 2

cvInRange(Igray2,Ilow2,Ihi2,Imask);//channel 3

cvInRange(Igray3,Ilow3,Ihi3,Imask);

cvOr(Imask,Imaskt,Imask);//finally , invert the result

cvSubRS(Imask,255,Imask);

}voidDeallocateImages()

{

cvReleaseImage(&IavgF);

cvReleaseImage(&IdiffF);

cvReleaseImage(&IprevF);

cvReleaseImage(&IhiF);

cvReleaseImage(&IlowF);

cvReleaseImage(&Ilow1);

cvReleaseImage(&Ilow2);

cvReleaseImage(&Ilow3);

cvReleaseImage(&Ihi1);

cvReleaseImage(&Ihi2);

cvReleaseImage(&Ihi3);

cvReleaseImage(&Iscratch);

cvReleaseImage(&Iscratch2);

cvReleaseImage(&Igray1);

cvReleaseImage(&Igray2);

cvReleaseImage(&Igray3);

cvReleaseImage(&Imaskt);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值