質問編集履歴

2

プログラムの変更

2016/11/14 07:54

投稿

yamata
yamata

スコア36

test CHANGED
File without changes
test CHANGED
@@ -16,6 +16,8 @@
16
16
 
17
17
  ```
18
18
 
19
+ ```
20
+
19
21
  int main( int argc , char** argv)
20
22
 
21
23
  {
@@ -383,3 +385,5 @@
383
385
  return 0;
384
386
 
385
387
  }
388
+
389
+ ```

1

プログラムの変更

2016/11/14 07:54

投稿

yamata
yamata

スコア36

test CHANGED
File without changes
test CHANGED
@@ -16,10 +16,370 @@
16
16
 
17
17
  ```
18
18
 
19
- cvMatchTemplate(grey_img1,grey_temp_up,dst1,CV_TM_CCOEFF_NORMED);
20
-
21
- cvMinMaxLoc(dst1,&min_inter1inkage,&max_inter1inkage,&min_point1,&max_point1,NULL);
22
-
23
- cvRectangle(scale_img,cvPoint(max_point1.x+rect1.x,max_point1.y+rect1.y),cvPoint(max_point1.x+rect1.x+temp_up->width,max_point1.y+rect1.y+temp_up->height),CV_RGB(255,0,0),3);
24
-
25
- ```
19
+ int main( int argc , char** argv)
20
+
21
+ {
22
+
23
+ int counter = 0;
24
+
25
+ char str[64];
26
+
27
+ #define LINE_THICKNESS 1
28
+
29
+ #define LINE_TYPE 8
30
+
31
+ #define SHIFT 0
32
+
33
+ #define SCALE_X 0.2
34
+
35
+ #define SCALE_Y 0.2
36
+
37
+ #define SCALE_XX 5.0
38
+
39
+ #define SCALE_YY 5.0
40
+
41
+ IplImage * temp_up = NULL;
42
+
43
+ IplImage * temp_side = NULL;
44
+
45
+ IplImage * dst1 = NULL;
46
+
47
+ IplImage * dst2 = NULL;
48
+
49
+ IplImage * img = NULL;
50
+
51
+ IplImage * scale_img = NULL;
52
+
53
+ IplImage * copy_img1 = NULL;
54
+
55
+ IplImage * copy_img2 = NULL;
56
+
57
+ IplImage * grey_img1 = NULL;
58
+
59
+ IplImage * grey_img2 = NULL;
60
+
61
+
62
+
63
+ IplImage * grey_temp_up = NULL;
64
+
65
+ IplImage * grey_temp_side = NULL;
66
+
67
+
68
+
69
+ FILE *file;
70
+
71
+ file=fopen("result.csv","w");
72
+
73
+
74
+
75
+ double max_inter1inkage=0;
76
+
77
+ double min_inter1inkage=0;
78
+
79
+ double max_inter2inkage=0;
80
+
81
+ double min_inter2inkage=0;
82
+
83
+
84
+
85
+ CvPoint max_point1;
86
+
87
+ CvPoint min_point1;
88
+
89
+ CvPoint max_point2;
90
+
91
+ CvPoint min_point2;
92
+
93
+
94
+
95
+
96
+
97
+ //---------テンプレート画像を読み込む-------
98
+
99
+ temp_up=cvLoadImage("temp_up.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み
100
+
101
+ temp_side=cvLoadImage("temp_side.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み
102
+
103
+ grey_temp_up=cvCreateImage(cvGetSize(temp_up),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像)
104
+
105
+ grey_temp_side=cvCreateImage(cvGetSize(temp_side),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像)
106
+
107
+
108
+
109
+ cvCvtColor(temp_up,grey_temp_up,CV_BGR2GRAY);
110
+
111
+ cvCvtColor(temp_side,grey_temp_side,CV_BGR2GRAY);
112
+
113
+
114
+
115
+ //for ( int number =83; number<202;++number)
116
+
117
+ {
118
+
119
+ int64 start = cv::getTickCount();//所要時間計測
120
+
121
+
122
+
123
+ //------------------------原画像読み込み-------------------------------
124
+
125
+ IplImage * img= cvLoadImage("C:\\opencv_ICImage\\2016-11-8黒ネジ10本40fps\\Image0105.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
126
+
127
+ //--------------------------------------------------------------------------
128
+
129
+
130
+
131
+ //変換画像用IplImage
132
+
133
+ scale_img=cvCreateImage(cvSize((int)(img->width*SCALE_X), (int)(img->height*SCALE_Y)), IPL_DEPTH_8U, 3);
134
+
135
+ //変換
136
+
137
+ cvResize(img, scale_img, CV_INTER_LINEAR);
138
+
139
+
140
+
141
+ //原画像コピー
142
+
143
+ copy_img1=cvCloneImage(scale_img);
144
+
145
+ copy_img2=cvCloneImage(scale_img);
146
+
147
+
148
+
149
+ //赤枠で囲む
150
+
151
+ cvRectangle(scale_img,cvPoint(100,65),cvPoint(155,135),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);
152
+
153
+ cvRectangle(scale_img,cvPoint(185,70),cvPoint(240,135),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);//左上、右下
154
+
155
+
156
+
157
+ //-----------------ROIの設定----------------------
158
+
159
+ CvRect rect1;
160
+
161
+ rect1.x = 100;
162
+
163
+ rect1.y = 65;
164
+
165
+ rect1.width = 55;
166
+
167
+ rect1.height = 70;
168
+
169
+ cvSetImageROI(copy_img1,rect1);
170
+
171
+
172
+
173
+ CvRect rect2;
174
+
175
+ rect2.x = 185;
176
+
177
+ rect2.y = 70;
178
+
179
+ rect2.width = 55;
180
+
181
+ rect2.height =65;
182
+
183
+ cvSetImageROI(copy_img2,rect2);//左上、幅、高さ
184
+
185
+ //----------------------------------------------------
186
+
187
+
188
+
189
+ //入力画像表示
190
+
191
+ cvNamedWindow("img_window",CV_WINDOW_AUTOSIZE);
192
+
193
+ cvShowImage("img_window",scale_img);
194
+
195
+
196
+
197
+ //--------------------------グレースケールの場合----------------------------------------------------------------
198
+
199
+ //テンプレート・マッチングに用いる相関値データを格納する画像の領域確保
200
+
201
+ //グレー・スケール画像用に領域確保
202
+
203
+ grey_img1=cvCreateImage(cvGetSize(copy_img1),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像)
204
+
205
+ grey_img2=cvCreateImage(cvGetSize(copy_img2),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像)
206
+
207
+
208
+
209
+ dst1=cvCreateImage(cvSize(abs(grey_img1->width-grey_temp_up->width)+1,abs(grey_img1->height-grey_temp_up->height)+1),IPL_DEPTH_32F,1); //領域確保
210
+
211
+ dst2=cvCreateImage(cvSize(abs(grey_img2->width-grey_temp_side->width)+1,abs(grey_img2->height-grey_temp_side->height)+1),IPL_DEPTH_32F,1); //領域確保
212
+
213
+
214
+
215
+ //グレー・スケールに変換して格納
216
+
217
+ cvCvtColor(copy_img1,grey_img1,CV_BGR2GRAY);
218
+
219
+ cvCvtColor(copy_img2,grey_img2,CV_BGR2GRAY);
220
+
221
+
222
+
223
+ cvMatchTemplate(grey_img1,grey_temp_up,dst1,CV_TM_CCOEFF_NORMED); //テンプレートマッチング
224
+
225
+ cvMatchTemplate(grey_img2,grey_temp_side,dst2,CV_TM_CCOEFF_NORMED); //テンプレートマッチング
226
+
227
+
228
+
229
+ IplImage *dst3=cvCloneImage(dst1);
230
+
231
+ IplImage *dst=cvCreateImage(cvSize((int)(dst3->width*SCALE_XX), (int)(dst3->height*SCALE_YY)), IPL_DEPTH_32F, 1);
232
+
233
+ cvResize(dst3, dst, CV_INTER_LINEAR);
234
+
235
+
236
+
237
+ cvNamedWindow("dst_window",CV_WINDOW_AUTOSIZE);
238
+
239
+ cvShowImage("dst_window",dst);
240
+
241
+
242
+
243
+ //-------------------------------------------------------------------------------------------------------------
244
+
245
+
246
+
247
+ //-----------マッチング点を求める---------
248
+
249
+ cvMinMaxLoc(dst1,&min_inter1inkage,&max_inter1inkage,&min_point1,&max_point1,NULL);
250
+
251
+ cvMinMaxLoc(dst2,&min_inter2inkage,&max_inter2inkage,&min_point2,&max_point2,NULL);
252
+
253
+
254
+
255
+ //------マッチングを表示する-----
256
+
257
+ //相関値0.75以下ならばLostを表示して次に行く
258
+
259
+
260
+
261
+ //if(max_inter1inkage>0.01&& max_inter2inkage>0.01)
262
+
263
+ {
264
+
265
+ //マッチング箇所を四角で描画
266
+
267
+ cvRectangle(scale_img,cvPoint(max_point1.x+rect1.x,max_point1.y+rect1.y),cvPoint(max_point1.x+rect1.x+temp_up->width,max_point1.y+rect1.y+temp_up->height),CV_RGB(255,0,0),3);
268
+
269
+ cvRectangle(scale_img,cvPoint(max_point2.x+rect2.x,max_point2.y+rect2.y),cvPoint(max_point2.x+rect2.x+temp_side->width,max_point2.y+rect2.y+temp_side->height),CV_RGB(0,255,255),3);
270
+
271
+ cvCircle(scale_img,cvPoint(max_point1.x+rect1.x,max_point1.y+rect1.y),10,CV_RGB(0,255,255),5,3,0);
272
+
273
+
274
+
275
+ //画像を表示
276
+
277
+ cvNamedWindow("result",CV_WINDOW_AUTOSIZE);
278
+
279
+ cvShowImage("result",scale_img);
280
+
281
+
282
+
283
+ //類似度表示
284
+
285
+ printf("up_Detection %lf\n",max_inter1inkage);
286
+
287
+ printf("side_Detection %lf\n",max_inter2inkage);
288
+
289
+
290
+
291
+ }
292
+
293
+
294
+
295
+ //タイマー終了
296
+
297
+ int64 end = cv::getTickCount();
298
+
299
+ double elapsedMsec = ( end - start )*1000/cv::getTickFrequency();
300
+
301
+
302
+
303
+ //タイマー表示
304
+
305
+ std::cout << elapsedMsec <<"ms" <<std::endl;
306
+
307
+ printf("\n");
308
+
309
+
310
+
311
+ cvWaitKey(0);
312
+
313
+
314
+
315
+ fprintf(file,"%f,%f,%f\n",max_inter1inkage,max_inter2inkage,elapsedMsec);
316
+
317
+
318
+
319
+ //メモリ解放
320
+
321
+ cvReleaseImage(&img);
322
+
323
+ cvReleaseImage(&scale_img);
324
+
325
+ cvReleaseImage(&copy_img1);
326
+
327
+ cvReleaseImage(&copy_img2);
328
+
329
+ cvReleaseImage(&grey_img1);
330
+
331
+ cvReleaseImage(&grey_img2);
332
+
333
+ cvReleaseImage(&dst1);
334
+
335
+ cvReleaseImage(&dst2);
336
+
337
+ cvDestroyWindow("result");
338
+
339
+
340
+
341
+ }
342
+
343
+
344
+
345
+ fclose(file);
346
+
347
+
348
+
349
+ //メモリ解放
350
+
351
+ cvReleaseImage(&temp_up);
352
+
353
+ cvReleaseImage(&temp_side);
354
+
355
+ cvReleaseImage(&grey_temp_up);
356
+
357
+ cvReleaseImage(&grey_temp_side);
358
+
359
+
360
+
361
+ //メモリ開放
362
+
363
+ cvDestroyWindow("img_window");
364
+
365
+ //cvDestroyWindow("copy_img1_window");
366
+
367
+ //cvDestroyWindow("copy_img2_window");
368
+
369
+ //cvDestroyWindow("temp_up_window");
370
+
371
+ //cvDestroyWindow("temp_side_window");
372
+
373
+ //cvDestroyWindow("grey_temp_up_window");
374
+
375
+ //cvDestroyWindow("grey_temp_side_window");
376
+
377
+ //cvDestroyWindow("grey_img1_window");
378
+
379
+ //cvDestroyWindow("grey_img2_window");
380
+
381
+
382
+
383
+ return 0;
384
+
385
+ }