質問編集履歴
2
プログラムの変更
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
プログラムの変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -16,10 +16,370 @@
|
|
16
16
|
|
17
17
|
```
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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(©_img1);
|
326
|
+
|
327
|
+
cvReleaseImage(©_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
|
+
}
|