AIRobot

AIRobot quick note


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

帧差法侦测运动目标

发表于 2018-11-16 更新于 2019-01-02 分类于 未分类
本文字数: 5k 阅读时长 ≈ 5 分钟
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#include<iostream>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace std;
using namespace cv;

const unsigned char FORE_GROUD = 255;
int thresh = 30;
int maxArea = 100;
int times = 100;

Point getCenterPoint(Rect rect)
{
Point cpt;
cpt.x = rect.x + cvRound(rect.width/2.0);
cpt.y = rect.y + cvRound(rect.height/2.0);
return cpt;
}

int main(int argc,char*argv[])
{

VideoCapture video(0);

//判断如果video是否可以打开
if(!video.isOpened())
return -1;
cout<<"Opened"<<endl;

//用于保存当前帧的图片
Mat currentBGRFrame;

//用来保存上一帧和当前帧的灰度图片
Mat previousSecondGrayFrame;
Mat previousFirstGrayFrame;
Mat currentGaryFrame;

//保存两次的帧差
Mat previousFrameDifference;//previousFrameFirst - previousFrameSecond的差分
Mat currentFrameDifference;//currentFrame - previousFrameFirst;

//用来保存帧差的绝对值
Mat absFrameDifferece;

//用来显示前景
Mat previousSegmentation;
Mat currentSegmentation;
Mat segmentation;


//显示前景
namedWindow("segmentation",1);
createTrackbar("阈值:","segmentation",&thresh,FORE_GROUD,NULL);
createTrackbar("面积:","segmentation",&maxArea,FORE_GROUD,NULL);

//帧数
int numberFrame = 0;

//形态学处理用到的算子
Mat morphologyKernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));

for(;;)
{
//读取当前帧
video >> currentBGRFrame;

//判断当前帧是否存在
if(!currentBGRFrame.data)
continue;

numberFrame++;
//颜色空间的转换
cvtColor(currentBGRFrame,currentGaryFrame,COLOR_BGR2GRAY);

if( numberFrame == 1)
{
//保存当前帧的灰度图
previousSecondGrayFrame = currentGaryFrame.clone();

//显示视频
imshow("video",currentBGRFrame);
continue;
}
else if( numberFrame == 2)
{
//保存当前帧的灰度图
previousFirstGrayFrame = currentGaryFrame.clone();

//previousFirst - previousSecond
subtract(previousFirstGrayFrame,previousSecondGrayFrame,previousFrameDifference,Mat(),CV_16SC1);

//取绝对值
absFrameDifferece = abs(previousFrameDifference);

//位深的改变
absFrameDifferece.convertTo(absFrameDifferece,CV_8UC1,1,0);

//阈值处理
threshold(absFrameDifferece,previousSegmentation,double(thresh),double(FORE_GROUD),THRESH_BINARY);

//显示视频
imshow("video",currentBGRFrame);
continue;
}

else
{
//src1-src2
//subtract(currentGaryFrame,previousFirstGrayFrame,currentFrameDifference,Mat(),CV_16SC1);

//取绝对值
//absFrameDifferece = abs(currentFrameDifference);
absdiff(currentGaryFrame,previousFirstGrayFrame,absFrameDifferece);

//位深的改变
absFrameDifferece.convertTo(absFrameDifferece,CV_8UC1,1,0);

//阈值处理
threshold(absFrameDifferece,currentSegmentation,double(thresh),double(FORE_GROUD),THRESH_BINARY);

//与运算
bitwise_and(previousSegmentation,currentSegmentation,segmentation);

//中值滤波
medianBlur(segmentation,segmentation,3);

//形态学处理(开闭运算)
//morphologyEx(segmentation,segmentation,MORPH_OPEN,morphologyKernel,Point(-1,-1),1,BORDER_REPLICATE);
morphologyEx(segmentation,segmentation,MORPH_CLOSE,morphologyKernel,Point(-1,-1),2,BORDER_REPLICATE);


//找边界
vector< vector<Point> > contours;
vector<Vec4i> hierarchy;
//复制segmentation
Mat tempSegmentation = segmentation.clone();
findContours( segmentation, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );//CV_RETR_TREE
vector< vector<Point> > contours_poly( contours.size() );

/*存储运动物体*/
Rect rect = Rect(0,0,0,0);
vector<Rect> boundRect;
boundRect.clear();

//画出运动物体
for(unsigned int index = 0;index < contours.size() ;index++)
{
approxPolyDP( Mat(contours[index]), contours_poly[index], 3, true );
Rect tmprect = boundingRect( Mat(contours_poly[index]) );
//cout<<getCenterPoint(rect)<<endl;
int currentArea = tmprect.area();
if( currentArea >= rect.area() && currentArea >= maxArea*times )
rect = tmprect;
}
rectangle(currentBGRFrame,rect,Scalar(0,255,255),2);

//显示视频
imshow("video",currentBGRFrame);

//前景检测
imshow("segmentation",segmentation);

//保存当前帧的灰度图
previousFirstGrayFrame = currentGaryFrame.clone();

//保存当前的前景检测
previousSegmentation = currentSegmentation.clone();
}

if(waitKey(33) == 'q')
break;

}
return 0;
}
Hello World on Sunway TaihuLight
神威太湖之光基本操作
AIRobot

AIRobot

AIRobot quick note
130 日志
15 分类
23 标签
GitHub E-Mail
Creative Commons
0%
© 2023 AIRobot | 716k | 10:51