-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathFrGrdExtract.cpp
More file actions
executable file
·135 lines (116 loc) · 3.46 KB
/
FrGrdExtract.cpp
File metadata and controls
executable file
·135 lines (116 loc) · 3.46 KB
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
126
127
128
129
130
131
132
133
134
135
#include"FrGrdExtract.h"
FrGrdExtract::FrGrdExtract()
{
curImg = NULL;
pFrImg = NULL;
pBackImg=NULL;
showImg = NULL;
rectSeq = NULL;
seqNum = 0;
Mark = NULL;
blockMark=NULL;
blockSeq=NULL;
CvGaussBGModel* bg_model=NULL; //初始化高斯混合模型参数
}
void FrGrdExtract::init(IplImage* pFrame)
{
pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
pBackImg= cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,3);
bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, 0);
}
void FrGrdExtract::show()
{
showImg = cvCloneImage(curImg);
for(int i=0;i<seqNum;i++)
if(Mark[i] == 1)
{
cvRectangle(showImg,cvPoint(rectSeq[i].x,rectSeq[i].y),cvPoint(rectSeq[i].x+rectSeq[i].width,rectSeq[i].y+rectSeq[i].height),cvScalar(0,255,0),4);
}
cvShowImage("FrGrdExtract",showImg);
cvShowImage("Background",bg_model->background);
cvReleaseImage(&showImg);
}
void FrGrdExtract::release()
{
cvReleaseBGStatModel((CvBGStatModel**)&bg_model);
cvReleaseImage(&pFrImg);
cvReleaseImage(&pBackImg);
}
void FrGrdExtract::nextImage(IplImage* pFrame)
{
curImg = pFrame;
//更新高斯模型
cvUpdateBGStatModel(curImg, (CvBGStatModel*)bg_model );
updateBackground((CvGaussBGModel*)bg_model);
//pFrImg为前景图像,只能为单通道
cvCopy(bg_model->foreground,pFrImg,0);
cvCopy(bg_model->background,pBackImg,0);
filter(pFrImg);
/*segmentation(pFrImg);*/
}
void FrGrdExtract::setRectSeq(CvRect* rectseq,int *rectMark)
{
rectSeq = rectseq;
Mark = rectMark;
}
void FrGrdExtract::setBlockVar(CvRect* blockseq,int* blockmark,int blockrownum,int blockcolumnnum)
{
blockMark=blockmark;
blockSeq=blockseq;
blockRowNum=blockrownum;
blockColumnNum=blockcolumnnum;
}
void FrGrdExtract::filter(IplImage* pFrImg)
{
CvSeq* contour = NULL;
CvMemStorage* storage = cvCreateMemStorage(0);
seqNum = 0;
double minarea = pFrImg->width*pFrImg->height*BLOCK_SIZE;
double maxarea = pFrImg->width*pFrImg->height/2;
double tmparea = 0.0;
IplImage* img_src = cvCloneImage(pFrImg);
//搜索二值图中的轮廓,并从轮廓树中删除面积小于某个阈值minarea的轮廓
CvContourScanner scanner = NULL;
scanner = cvStartFindContours(img_src,storage,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE,cvPoint(0,0));
//开始遍历轮廓树
CvRect rect;
while (contour=cvFindNextContour(scanner))
{
tmparea = fabs(cvContourArea(contour));
rect = cvBoundingRect(contour,0);
if (tmparea > minarea && tmparea< maxarea)
{
rectSeq[seqNum] = rect;
Mark[seqNum] = 1;
seqNum++;
//cvRectangle(pFrImg,cvPoint(rect.x,rect.y),cvPoint(rect.x+rect.width,rect.y+rect.height),cvScalar(255,255,255),4);
}
}
cvReleaseImage(&img_src);
cvReleaseMemStorage(&storage);
}
void FrGrdExtract::segmentation(IplImage* pFrImg)
{
seqNum=0;
double ratio=0.1;
int step = pFrImg->widthStep;
uchar* data = (uchar *)pFrImg->imageData;
for(int i=0;i<blockColumnNum*blockRowNum;++i)
{
int x=blockSeq[i].x;
int y=blockSeq[i].y;
int width=blockSeq[i].width;
int height=blockSeq[i].height;
int count=0;
for(int m=y;m<y+height;++m)
{
for(int n=x;n<x+width;++n)
{
count+=(data[m*step+n]>0?1:0);
}
}
blockMark[i]=(float)count/(float)(width*height)>ratio?1:0;
if(blockMark[i])
++seqNum;
}
}