質問編集履歴

1

プログラムを追加しました

2016/06/30 04:37

投稿

yamata
yamata

スコア36

test CHANGED
File without changes
test CHANGED
@@ -15,3 +15,333 @@
15
15
 
16
16
 
17
17
  よろしくお願いします。![](f396a5e11c6e920661ee810ee839ddda.png)
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
+ int main( int argc , char** argv)
48
+
49
+ {
50
+
51
+ int key;//キー入力用の変数
52
+
53
+ CvCapture *capture;//カメラキャプチャ用の構造体
54
+
55
+ IplImage *frameImage = NULL;//キャプチャ画像用IplImage
56
+
57
+ char windowNameCapture[] = "Capture";//キャプチャした画像を表示するウィンドウの名前
58
+
59
+
60
+
61
+ #define LINE_THICKNESS 1
62
+
63
+ #define LINE_TYPE 8
64
+
65
+ #define SHIFT 0
66
+
67
+
68
+
69
+ IplImage * temp = NULL;
70
+
71
+
72
+
73
+ IplImage * dst = NULL;
74
+
75
+ IplImage * img = NULL;
76
+
77
+ IplImage * grey_img = NULL;
78
+
79
+ IplImage * grey_temp = NULL;
80
+
81
+ IplImage * output =NULL;
82
+
83
+ IplImage * copy_frameImage = NULL;
84
+
85
+
86
+
87
+ CvRect rect;
88
+
89
+
90
+
91
+ double max_inter1inkage=0;
92
+
93
+ double min_inter1inkage=0;
94
+
95
+
96
+
97
+ CvPoint max_point;
98
+
99
+ CvPoint min_point;
100
+
101
+
102
+
103
+ //カメラを初期化する
104
+
105
+ if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL )
106
+
107
+ {
108
+
109
+ //カメラが見つからなかった場合
110
+
111
+ printf( "カメラが見つかりません\n" );
112
+
113
+ return -1;
114
+
115
+ }
116
+
117
+
118
+
119
+ //Windowの生成
120
+
121
+ //cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE);
122
+
123
+
124
+
125
+ //カメラ・デバイスから画像を取得
126
+
127
+ frameImage=cvQueryFrame(capture);
128
+
129
+
130
+
131
+ //メインループ
132
+
133
+ while ( 1 )
134
+
135
+ {
136
+
137
+ //カメラからの入力画像1フレームをframeImageに格納する(画像加工不可)
138
+
139
+ frameImage = cvQueryFrame( capture );
140
+
141
+
142
+
143
+ //frameImageをコピー
144
+
145
+ copy_frameImage=cvCloneImage(frameImage);
146
+
147
+
148
+
149
+ //ROIを用いて短形切り出し
150
+
151
+ //IplImage* image = cvLoadImage("sign.bmp");
152
+
153
+
154
+
155
+ //画面中央にROI
156
+
157
+ rect.x = cvRound(copy_frameImage->width * 0.25);
158
+
159
+ rect.y = cvRound(copy_frameImage->height * 0.25);
160
+
161
+ rect.width = cvRound(copy_frameImage->width * 0.2);
162
+
163
+ rect.height = cvRound(copy_frameImage->height * 0.11);
164
+
165
+
166
+
167
+ //ROI指定
168
+
169
+ cvSetImageROI(copy_frameImage, rect);
170
+
171
+
172
+
173
+ //出力先指定 cvCloneImageでROIまるごとコピー
174
+
175
+ output=cvCloneImage(copy_frameImage);
176
+
177
+ //cvSaveImage("test.bmp", frameImage); //ROIを保存
178
+
179
+
180
+
181
+ output=cvCloneImage(copy_frameImage); //元の画像をコピー
182
+
183
+
184
+
185
+ //ROIを表示
186
+
187
+ cvNamedWindow("Capture",CV_WINDOW_AUTOSIZE);
188
+
189
+ cvShowImage("Capture",output);
190
+
191
+
192
+
193
+ //画像を表示する
194
+
195
+ //cvShowImage( windowNameCapture, frameImage );
196
+
197
+
198
+
199
+ //'q'キーが入力されたらループを抜ける
200
+
201
+ key = cvWaitKey( 1 );
202
+
203
+
204
+
205
+ if ( key == 'q' )
206
+
207
+ {
208
+
209
+ break;
210
+
211
+ }
212
+
213
+ else if( key == 'c')
214
+
215
+ {
216
+
217
+ int64 start = cv::getTickCount();//所要時間計測
218
+
219
+
220
+
221
+ cvSaveImage("sign.bmp", output ); //キーを押して保存
222
+
223
+ //cvNamedWindow("window picture",CV_WINDOW_AUTOSIZE);
224
+
225
+ //cvShowImage("window picture",frameImage);
226
+
227
+
228
+
229
+ //--------原画像を読み込む---------
230
+
231
+ img=cvLoadImage("sign.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み
232
+
233
+
234
+
235
+ //---------テンプレート画像を読み込む-------
236
+
237
+ temp=cvLoadImage("temp8.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み
238
+
239
+
240
+
241
+ //テンプレート・マッチングに用いる相関値データを格納する画像の領域確保
242
+
243
+ //グレー・スケール画像用に領域確保
244
+
245
+ grey_img=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像)
246
+
247
+ grey_temp=cvCreateImage(cvGetSize(temp),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像)
248
+
249
+ dst =cvCreateImage(cvSize(img->width-temp->width+1,img->height-temp->height+1),IPL_DEPTH_32F,1); //領域確保
250
+
251
+
252
+
253
+ //グレー・スケールに変換して格納
254
+
255
+ cvCvtColor(img,grey_img,CV_BGR2GRAY);
256
+
257
+ cvCvtColor(temp,grey_temp,CV_BGR2GRAY);
258
+
259
+
260
+
261
+ //-------テンプレートマッチングを取る-----
262
+
263
+ cvMatchTemplate(grey_img,grey_temp,dst,CV_TM_CCOEFF_NORMED);
264
+
265
+
266
+
267
+ //-----------マッチング点を求める---------
268
+
269
+ cvMinMaxLoc(dst,&min_inter1inkage,&max_inter1inkage,&min_point,&max_point,NULL);
270
+
271
+
272
+
273
+ //------マッチングを表示する-----
274
+
275
+ //相関値0.75以下ならばLostを表示して次に行く
276
+
277
+
278
+
279
+ if(max_inter1inkage>0.5)
280
+
281
+ {
282
+
283
+ //マッチング箇所を四角で描画
284
+
285
+ cvRectangle(img,min_point,cvPoint(min_point.x+temp->width,min_point.y+temp->height),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);
286
+
287
+
288
+
289
+ //画像を表示
290
+
291
+ cvNamedWindow("windowNameTemplate",CV_WINDOW_AUTOSIZE);
292
+
293
+ cvShowImage("windowNameTemplate",img);
294
+
295
+
296
+
297
+ //類似度表示
298
+
299
+ printf("Detection %lf\n",max_inter1inkage);
300
+
301
+
302
+
303
+ }
304
+
305
+
306
+
307
+ else
308
+
309
+ {
310
+
311
+ printf("Lost %lf\n",max_inter1inkage);
312
+
313
+ }
314
+
315
+
316
+
317
+ //タイマー終了
318
+
319
+ int64 end = cv::getTickCount();
320
+
321
+ double elapsedMsec = ( end - start )*1000/cv::getTickFrequency();
322
+
323
+
324
+
325
+ //タイマー表示
326
+
327
+ std::cout << elapsedMsec <<"ms" <<std::endl;
328
+
329
+
330
+
331
+ }
332
+
333
+ }
334
+
335
+
336
+
337
+ //メモリ開放
338
+
339
+ cvReleaseCapture(&capture);
340
+
341
+ cvDestroyWindow("windowNameCapture");
342
+
343
+ return 0;
344
+
345
+ }
346
+
347
+ ```