質問編集履歴

2

2015/12/23 01:24

投稿

sh1208
sh1208

スコア14

test CHANGED
File without changes
test CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  言語はC++でopencv2.4.9を使用しています。
4
4
 
5
+ Os windows8.1 visual studio2013を使っています。
6
+
5
7
  よろしくお願いします。
6
8
 
7
9
 

1

main文を追加しました

2015/12/23 01:24

投稿

sh1208
sh1208

スコア14

test CHANGED
File without changes
test CHANGED
@@ -39,3 +39,351 @@
39
39
  コード
40
40
 
41
41
  ```
42
+
43
+
44
+
45
+ ```//インクルードファイル指定
46
+
47
+ #include <opencv2/opencv.hpp>
48
+
49
+ //静的リンクライブラリの指定
50
+
51
+ #include <opencv2/opencv_lib.hpp>
52
+
53
+
54
+
55
+ #include "Classifier.h"
56
+
57
+ #include "IntegralHistogram.h"
58
+
59
+ #include "MeanShift.h"
60
+
61
+ #include "Common.h"
62
+
63
+
64
+
65
+
66
+
67
+ //画像を扱う構造体の宣言
68
+
69
+ IplImage* imgSource = NULL; //原画像
70
+
71
+ IplImage* imgResult = NULL; //人検出結果
72
+
73
+ IplImage* imgGray = NULL; //グレイスケール画像
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+ //クラス
82
+
83
+ CClassifier ob_CL; //Real AdaBoostによる識別
84
+
85
+ CIntegralHistogram ob_IH; //Integral HistogramによるHOG特徴量算出
86
+
87
+ CMeanShift ob_MS; //MeanShiftによる検出ウィンドウの統合
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+ int main(){
96
+
97
+ int i, j, l;
98
+
99
+ int frame = 0;
100
+
101
+ CvCapture *capture = NULL; // カメラキャプチャ用の構造体
102
+
103
+
104
+
105
+ //出力ウィンドウの作成
106
+
107
+ char* winOriginal = "OutputImage";
108
+
109
+
110
+
111
+
112
+
113
+ cvNamedWindow(winOriginal, CV_WINDOW_AUTOSIZE);
114
+
115
+
116
+
117
+
118
+
119
+ //検出ウィンドウのパラメータ
120
+
121
+ int window_width = INIT_WINDOW_X;
122
+
123
+ int window_height = INIT_WINDOW_Y;
124
+
125
+ int window_count = 0;
126
+
127
+ int window_ture_count = 0;
128
+
129
+ int tcount = 0;
130
+
131
+ double scale;
132
+
133
+
134
+
135
+ //HOG特徴量の配列
136
+
137
+ double feature[FEATURE];
138
+
139
+
140
+
141
+
142
+
143
+ // 動画ファイルを開く
144
+
145
+ if ((capture = cvCaptureFromFile("C:\\opencv\\sources\\samples\\c\\tree.avi")) == NULL) {
146
+
147
+ // ファイルが見つからなかった場合
148
+
149
+ printf("ファイルが見つかりません\n");
150
+
151
+ exit(1);
152
+
153
+ }
154
+
155
+
156
+
157
+ imgSource = cvQueryFrame(capture);
158
+
159
+
160
+
161
+ //領域確保
162
+
163
+ imgGray = cvCreateImage(cvGetSize(imgSource), IPL_DEPTH_8U, 1);
164
+
165
+
166
+
167
+
168
+
169
+ //aviファイル設定
170
+
171
+ double fps = 25.0;
172
+
173
+ CvVideoWriter* VideoWriter = cvCreateVideoWriter("C:\\opencv\\sources\\samples\\c\\result.avi", -1, fps, cvGetSize(imgSource), 1);
174
+
175
+
176
+
177
+ //カラー画像からグレイスケール画像へ変換
178
+
179
+ cvCvtColor(imgSource, imgGray, CV_BGR2GRAY);
180
+
181
+
182
+
183
+
184
+
185
+ //初期化
186
+
187
+ ob_IH.CreateGradLUT();
188
+
189
+ ob_CL.init();
190
+
191
+ ob_MS.Init(imgSource);
192
+
193
+ ob_IH.Init(imgGray);
194
+
195
+ cvReleaseImage(&imgSource);
196
+
197
+
198
+
199
+ //人検出開始
200
+
201
+ while (1){
202
+
203
+ //画像の読み込み
204
+
205
+ imgSource = cvQueryFrame(capture);
206
+
207
+ if (imgSource == NULL)
208
+
209
+ exit(1);
210
+
211
+ printf("frame -> %d\n", frame);
212
+
213
+
214
+
215
+ //積分画像の初期化
216
+
217
+ ob_IH.ClearIH();
218
+
219
+
220
+
221
+ // 画像サイズを保存
222
+
223
+ CvSize imageSize = cvGetSize(imgSource);
224
+
225
+
226
+
227
+ //領域確保
228
+
229
+ imgResult = cvCreateImage(imageSize, IPL_DEPTH_8U, 3);
230
+
231
+
232
+
233
+ //カラー画像からグレイスケール画像へ変換
234
+
235
+ cvCvtColor(imgSource, imgGray, CV_BGR2GRAY);
236
+
237
+
238
+
239
+ //勾配方向と勾配強度,積分画像の算出
240
+
241
+ ob_IH.CreateIntegralHistogram(imgGray);
242
+
243
+
244
+
245
+ //原画像のコピー
246
+
247
+ memcpy(imgResult->imageData, imgSource->imageData, imgSource->width * imgSource->height * 3);
248
+
249
+
250
+
251
+ //パラメータの初期化
252
+
253
+ window_width = INIT_WINDOW_X;
254
+
255
+ window_height = INIT_WINDOW_Y;
256
+
257
+ window_count = 0;
258
+
259
+ window_ture_count = 0;
260
+
261
+
262
+
263
+ //検出ウィンドウのスケール変化
264
+
265
+ for (scale = MIN_SCALE; scale < MAX_SCALE; scale += STEP_SCALE){
266
+
267
+ window_width = INIT_WINDOW_X * scale;
268
+
269
+ window_height = INIT_WINDOW_Y * scale;
270
+
271
+
272
+
273
+ //検出ウィンドウのラスタスキャン
274
+
275
+ for (j = 0; j<imgSource->height - window_height; j += STEP_WIDTH){
276
+
277
+ for (i = 0; i<imgSource->width - window_width; i += STEP_WIDTH){
278
+
279
+
280
+
281
+ //特徴量抽出
282
+
283
+ ob_IH.Getfeature(feature, i, j, window_width, window_height);
284
+
285
+
286
+
287
+ //検出ウィンドウが人であるかの識別
288
+
289
+ if (ob_CL.classifier(feature) == TRUE){
290
+
291
+ //検出ウィンドウの座標をストック
292
+
293
+ ob_MS.Voting(i + (int)(window_width * 0.5), j + (int)(window_height * 0.5), window_ture_count, scale);
294
+
295
+ window_ture_count++;
296
+
297
+ }
298
+
299
+ }
300
+
301
+ }
302
+
303
+ }
304
+
305
+
306
+
307
+ //MeanShiftによる検出ウィンドウの統合
308
+
309
+ ob_MS.MeanShift();
310
+
311
+
312
+
313
+ //Nearest Neighborによる検出ウィンドウの統合
314
+
315
+ tcount = ob_MS.NearestNeighbor();
316
+
317
+
318
+
319
+ //人がいると識別された領域を矩形で囲む
320
+
321
+ for (l = 0; l < tcount; l++){
322
+
323
+ //検出ウィンドウが統合された数がしきい値以下ならば人以外として判別
324
+
325
+ if (ob_MS.win[l].count >= TH_HEAD_COUNT){
326
+
327
+ //検出ウィンドウの縦幅と横幅を計算
328
+
329
+ window_width = INIT_WINDOW_X * ob_MS.win[l].new_scale;
330
+
331
+ window_height = INIT_WINDOW_Y * ob_MS.win[l].new_scale;
332
+
333
+
334
+
335
+ //検出ウィンドウを矩形で囲む
336
+
337
+ cvRectangle(imgResult, cvPoint(ob_MS.win[l].new_x - window_width * 0.5, ob_MS.win[l].new_y - window_height * 0.5), cvPoint(ob_MS.win[l].new_x + window_width * 0.5, ob_MS.win[l].new_y + window_height * 0.5), CV_RGB(0, 0, 255), 2, 8, 0);
338
+
339
+
340
+
341
+ }
342
+
343
+ }
344
+
345
+ //人検出結果を保存と出力
346
+
347
+ cvShowImage(winOriginal, imgResult);
348
+
349
+ cvWaitKey(10);
350
+
351
+ //1画面分の取り込み
352
+
353
+ cvWriteFrame(VideoWriter, imgResult);
354
+
355
+
356
+
357
+ // 確保したメモリを開放
358
+
359
+ cvReleaseImage(&imgSource);
360
+
361
+ cvReleaseImage(&imgResult);
362
+
363
+
364
+
365
+ frame++;
366
+
367
+ }
368
+
369
+
370
+
371
+ // 確保したメモリを開放
372
+
373
+ cvReleaseImage(&imgGray);
374
+
375
+ cvReleaseVideoWriter(&VideoWriter);
376
+
377
+ cvReleaseCapture(&capture);
378
+
379
+
380
+
381
+ return 0;
382
+
383
+
384
+
385
+ }
386
+
387
+ コード
388
+
389
+ ```