opencv平均背景法詳解
更新時(shí)間:2020年03月21日 11:28:22 作者:元?dú)馍倥壗Y(jié)神
這篇文章主要為大家詳細(xì)介紹了opencv平均背景法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了opencv平均背景法的具體代碼,供大家參考,具體內(nèi)容如下
#include<opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace std; using namespace cv; 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; 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); 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_8U, 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(Iscratch2, IdiffF); Icount += 1.0; } first = 0; cvCopy(Iscratch, IprevF); } 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); cvAdd(IavgF, Iscratch, IlowF); cvSplit(IlowF,Ilow1,Ilow2,Ilow3, 0); } void createModelsfromStats(){ cvConvertScale(IavgF, IavgF, (double)(1.0 / Icount)); cvConvertScale(IdiffF, IdiffF, (double)(1.0 / Icount)); cvAddS(IdiffF, cvScalar(1.0, 1.0, 1.0), IdiffF); setHighThreshold(10.0); setLowThreshold(4.0); } void backgroundDiff(IplImage* I, IplImage* Imask){ cvCvtScale(I, Iscratch, 1, 0); cvSplit(Iscratch, Igray1, Igray2, Igray3, 0); cvInRange(Igray1, Ilow1, Ihi1, Imask); cvInRange(Igray2, Ilow2, Ihi2, Imaskt); cvOr(Imask, Imaskt, Imask); cvInRange(Igray3, Ilow3, Ihi3, Imaskt); cvOr(Imask, Imaskt, Imask); cvSubRS(Imask, Scalar(255), Imask); } void DeallocateImages(){ 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); } char filename[100]; char newcontour[100]; void main() { TickMeter tm; tm.start(); //many imgs IplImage* src = cvLoadImage("待處理背面圖\\55124.bmp"); AllocateImages(src); for (int i = 55124; i <= 56460; i++) { sprintf(filename, "待處理背面圖\\%d.bmp", i); sprintf(newcontour, "分割前景\\%d.bmp", i); IplImage* src_ipl = cvLoadImage(filename); accumulateBackground(src_ipl); createModelsfromStats(); CvSize sz = cvGetSize(src_ipl); IplImage* myImask = cvCreateImage(sz, IPL_DEPTH_8U, 1);; backgroundDiff(src_ipl, myImask); cvSaveImage(newcontour, myImask); } DeallocateImages(); tm.stop(); cout << "count=" << tm.getCounter() << ",process time=" << tm.getTimeMilli() << endl; }
然而對(duì)我的圖還是不適合分割出輪廓:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C語(yǔ)言如何執(zhí)行HTTP GET請(qǐng)求
在現(xiàn)代互聯(lián)網(wǎng)時(shí)代,網(wǎng)絡(luò)數(shù)據(jù)的獲取和分析變得越來(lái)越重要,本文我們將使用C語(yǔ)言和libcurl庫(kù)來(lái)編寫一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲,以執(zhí)行HTTP GET請(qǐng)求并獲取淘寶網(wǎng)頁(yè)的內(nèi)容,感興趣的可以了解下2023-11-11C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++標(biāo)準(zhǔn)模板庫(kù)map的常用操作
今天小編就為大家分享一篇關(guān)于C++標(biāo)準(zhǔn)模板庫(kù)map的常用操作,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12C語(yǔ)言 表、棧和隊(duì)列詳解及實(shí)例代碼
這篇文章主要介紹了C語(yǔ)言 表、棧和隊(duì)列詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02關(guān)于STL的erase()陷阱-迭代器失效問(wèn)題的總結(jié)
下面小編就為大家?guī)?lái)一篇關(guān)于STL的erase()陷阱-迭代器失效問(wèn)題的總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12