本文實例為大家分享了opencv平均背景法的具體代碼,供大家參考,具體內(nèi)容如下
創(chuàng)新互聯(lián)始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達10余年累計超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)推廣解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:純水機等企業(yè),備受客戶贊美。
#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, *Iscratch3;
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);
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);
Imaskt = cvCreateImage(sz, IPL_DEPTH_8U, 1);
cvZero(Iscratch);
cvZero(Iscratch3);
}
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);
}
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(&Iscratch3);
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;
}然而對我的圖還是不適合分割出輪廓:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
新聞標題:opencv平均背景法詳解
URL地址:http://www.chinadenli.net/article4/gpisie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務器、微信小程序、域名注冊、網(wǎng)站改版、用戶體驗、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)