本文实例为大家分享了opencv平均背景法的具体代码,供大家参考,具体内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#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; } |
然而对我的图还是不适合分割出轮廓:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/wd1603926823/article/details/53157420