平均背景法的基本思想是計(jì)算每個(gè)像素的平均值和標(biāo)準(zhǔn)差作為它的背景模型。
創(chuàng)新互聯(lián)建站"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機(jī)版的企業(yè)網(wǎng)站。實(shí)現(xiàn)跨屏營(yíng)銷,產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動(dòng)網(wǎng)絡(luò)一網(wǎng)打盡,滿足企業(yè)的營(yíng)銷需求!創(chuàng)新互聯(lián)建站具備承接各種類型的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作項(xiàng)目的能力。經(jīng)過(guò)10年的努力的開(kāi)拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶的一致好評(píng)。
平均背景法使用四個(gè)OpenCV函數(shù):
代碼:
/* 平均背景法 */ #include "highgui.h" #include "cv.h" #include<stdlib.h> #include<stdio.h> //為不同的臨時(shí)指針圖像和統(tǒng)計(jì)屬性創(chuàng)建指針 //Float, 3-channel images IplImage* IavgF, * IdiffF, * IprevF, * IhiF, *IlowF; IplImage* Iscratch, *Iscratch3; //Float 1-channel images IplImage* Igray1, * Igray2, * Igray3; IplImage* Ilow1, * Ilow2, * Ilow3; IplImage* Ihi1, *Ihi2, * Ihi3; //Byte, 1-channel image IplImage* Imask; IplImage* Imaskt; //Counts number of images learned for averaging later. float Icount; // 創(chuàng)建一個(gè)函數(shù)來(lái)給需要的所有臨時(shí)圖像分配內(nèi)存 //為了方便,我們傳遞一幅圖像(來(lái)自視頻)作為大小參考來(lái)分配臨時(shí)圖像 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; Iscratch = cvCreateImage(sz, IPL_DEPTH_32F,3); Iscratch3 = 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); Imask = cvCreateImage(sz, IPL_DEPTH_8U, 1); Imaskt = cvCreateImage(sz, IPL_DEPTH_8U,1); cvZero(Iscratch); cvZero(Iscratch3); } //學(xué)習(xí)累積背景圖像和每一幀圖像差值的絕對(duì)值 // Learn the background statistics for one more frame // I is a color sample of the background, 3-channel, 8u void accumulateBackground(IplImage *I) { static int first = 1; cvCvtScale(I, Iscratch, 1, 0); if(!first) { cvAcc(Iscratch,IavgF); cvAbsDiff(Iscratch, IprevF, Iscratch3); cvAcc(Iscratch3,IdiffF); Icount += 1.0; } first = 0; cvCopy(Iscratch, IprevF); } //setHighThreshold和setLowThreshold都是基于每一幀圖像平均絕對(duì)差設(shè)置閾值的有效函數(shù) void setHighThreshold(float scale) { cvConvertScale(IdiffF, Iscratch, scale); cvAdd(Iscratch, IavgF, IhiF); cvSplit(IhiF, Ihi1, Ihi2, Ihi3, 0); } void setLowThreshold(float scale) { cvConvertScale(IdiffF, Iscratch, scale); cvSub(IavgF, Iscratch, IlowF); cvSplit(IlowF, Ilow1, Ilow2, Ilow3, 0); } //當(dāng)積累了足夠多的幀圖像之后,就將其轉(zhuǎn)化為一個(gè)背景的統(tǒng)計(jì)模型 //計(jì)算每一個(gè)像素的均值和方差觀測(cè) void createModelsfromStats() { 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); } //有了背景模型,同時(shí)給出了高,低閾值,就能用它將圖像分割為前景和背景 // Create a binary: 0,255 mask where 255 means foregrond pixel // I Input image, 3-channel, 8u //Imask void backgroundDiff(IplImage* I) { cvCvtScale(I, Iscratch, 1, 0); cvSplit(Iscratch, Igray1, Igray2, Igray3, 0); //Channel 1 cvInRange(Igray1, Ilow1, Ihi1, Imask); //Channel 2 cvInRange(Igray2, Ilow2, Ihi2, Imaskt); cvOr(Imask, Imaskt, Imask); //Channel 3 cvInRange(Igray3, Ilow3, Ihi3, Imaskt); cvOr(Imask, Imaskt, Imask); //Finally, invert the result cvSubRS(Imask, cvScalar(255), Imask); } //完成背景建模后, 釋放內(nèi)存 void DeallocateImage() { cvReleaseImage(&IavgF); cvReleaseImage(&IdiffF); cvReleaseImage(&IprevF); cvReleaseImage(&IhiF); cvReleaseImage(&IlowF); cvReleaseImage(&Ilow1); cvReleaseImage(&Ilow2); cvReleaseImage(&Ilow3); cvReleaseImage(&Iscratch); cvReleaseImage(&Iscratch3); cvReleaseImage(&Igray1); cvReleaseImage(&Igray2); cvReleaseImage(&Igray3); cvReleaseImage(&Imaskt); } //主函數(shù) int main() { CvCapture* capture = cvCreateFileCapture("tree.avi"); if(!capture) { return -1; } cvNamedWindow("win1"); cvNamedWindow("win2"); IplImage* rawImage = cvQueryFrame(capture); cvShowImage("win1", rawImage); AllocateImages(rawImage); int i = 0; while(1) { if(i <= 30) { accumulateBackground(rawImage); if(i == 30) { createModelsfromStats(); } } else { backgroundDiff(rawImage); } cvShowImage("win2", Imask); if(cvWaitKey(33) == 27) { break; } if(!(rawImage = cvQueryFrame(capture))) { break; } cvShowImage("win1", rawImage); if(i == 56 || i == 63) cvWaitKey(); i = i+1; } DeallocateImage(); return 0; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網(wǎng)頁(yè)題目:OpenCV實(shí)現(xiàn)平均背景法
文章鏈接:http://m.newbst.com/article46/pgcshg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、虛擬主機(jī)、網(wǎng)站設(shè)計(jì)公司、域名注冊(cè)、響應(yīng)式網(wǎng)站、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)