質問編集履歴

1

while文の処理の処理時間の計測やキャプチャの部分が抜けていました。簡単なエラーも修正しました。

2020/07/13 07:41

投稿

K.Saitoh
K.Saitoh

スコア6

test CHANGED
File without changes
test CHANGED
@@ -18,37 +18,7 @@
18
18
 
19
19
  ```
20
20
 
21
- opt_cam_huedot.cpp:42:42: error: use of undeclared identifier 'dispM'
22
-
23
- cv::Mat srcM, prevM, nextM, bufM, hueM; dispM;
24
-
25
- ^
26
-
27
- opt_cam_huedot.cpp:55:9: error: redefinition of 'dx'
28
-
29
- double dx, dy, rad, mag, saturation_rate = 7, r, g, b;
30
-
31
- ^
32
-
33
- opt_cam_huedot.cpp:49:9: note: previous definition is here
34
-
35
- double dx, dy;
36
-
37
- ^
38
-
39
- opt_cam_huedot.cpp:55:13: error: redefinition of 'dy'
40
-
41
- double dx, dy, rad, mag, saturation_rate = 7, r, g, b;
42
-
43
- ^
44
-
45
- opt_cam_huedot.cpp:49:13: note: previous definition is here
46
-
47
- double dx, dy;
48
-
49
- ^
50
-
51
- opt_cam_huedot.cpp:74:35: error: reference to non-static member function must be
21
+ opt_cam_huedot.cpp:84:35: error: reference to non-static member function must be
52
22
 
53
23
  called
54
24
 
@@ -152,314 +122,298 @@
152
122
 
153
123
  ^
154
124
 
125
+ 1 error generated.
126
+
127
+ ```
128
+
129
+
130
+
131
+ ### 該当のソースコード
132
+
133
+
134
+
135
+ ```C++
136
+
137
+ #include <opencv2/opencv.hpp>
138
+
139
+ #include <opencv2/optflow.hpp>
140
+
141
+
142
+
143
+ // 汎用的なHSV値をRGB値に変換する関数
144
+
145
+ void hsv2rgb(double h, double s, double v, double *r, double *g, double *b){
146
+
147
+ // 一般的な色相の間隔にあわせるため!?+90度する
148
+
149
+ if(h < 270) h += 90;
150
+
151
+ else h -= 270;
152
+
153
+ int i = (int)(h / 60.0) % 6;
154
+
155
+ int p, q, t;
156
+
157
+ if(s > 255) s = 255;
158
+
155
- opt_cam_huedot.cpp:85:31: error: 'break' statement not in loop or switch
159
+ double f = (double)(h / 60.0f) - (double)((int)(h / 60.0f));
160
+
156
-
161
+ p = (int)(0.5 + v * (1.0f - (s / 255.0f)));
162
+
163
+ q = (int)(0.5 + v * (1.0f - (s / 255.0f) * f));
164
+
165
+ t = (int)(0.5 + v * (1.0f - (s / 255.0f) * (1.0f - f)));
166
+
167
+
168
+
169
+ switch(i){ // 角度の範囲に応じたRGB値計算
170
+
157
- statement
171
+ case 0 : *r = v; *g = t; *b = p; break;
158
-
172
+
159
- if(key == 'q' || key == 27) break;
173
+ case 1 : *r = q; *g = v; *b = p; break;
160
-
174
+
161
- ^
175
+ case 2 : *r = p; *g = v; *b = t; break;
176
+
162
-
177
+ case 3 : *r = p; *g = q; *b = v; break;
178
+
163
- opt_cam_huedot.cpp:90:2: error: unknown type name 'cap'
179
+ case 4 : *r = t; *g = p; *b = v; break;
164
-
165
- cap.release();
180
+
166
-
167
- ^
168
-
169
- opt_cam_huedot.cpp:90:5: error: cannot use dot operator on a type
170
-
171
- cap.release();
172
-
173
- ^
174
-
175
- opt_cam_huedot.cpp:91:2: error: expected unqualified-id
181
+ case 5 : *r = v; *g = p; *b = q; break;
176
-
177
- return 0;
182
+
178
-
179
- ^
183
+ }
180
-
181
- opt_cam_huedot.cpp:92:1: error: extraneous closing brace ('}')
182
184
 
183
185
  }
184
186
 
187
+
188
+
189
+ int main(int argc, char *argv[]){
190
+
191
+ int c_w = 640, c_h = 480;
192
+
193
+ // カメラ関連
194
+
195
+ cv::VideoCapture cap(0);
196
+
197
+ cap.set(cv::CAP_PROP_FRAME_WIDTH, c_w);
198
+
199
+ cap.set(cv::CAP_PROP_FRAME_HEIGHT, c_h);
200
+
201
+
202
+
203
+ // カメラがオープンできたかの確認
204
+
205
+ if(!cap.isOpened()) return -1;
206
+
207
+
208
+
185
- ^
209
+ // 処理時間
186
-
210
+
187
- 9 errors generated.
211
+ cv::TickMeter tm;
212
+
213
+ char strCost[256];
214
+
215
+
216
+
217
+ int key, i, j;
218
+
219
+ cv::Mat srcM, prevM, nextM, bufM, hueM, dispM;
220
+
221
+
222
+
223
+ // オプティカルフローの初期化
224
+
225
+ cv::Mat flow;
226
+
227
+ cv::Ptr<cv::DenseOpticalFlow> opt = cv::optflow::createOptFlow_SparseToDense();
228
+
229
+
230
+
231
+ // フロー描画用の変数
232
+
233
+ double dx, dy;
234
+
235
+ int lstep = 10; // この間隔でフローが描画される
236
+
237
+ cv::Point p1, p2;
238
+
239
+
240
+
241
+ // フローのhue描画用の変数
242
+
243
+ hueM = cv::Mat(cv::Size(c_w, c_h), CV_8UC3);
244
+
245
+ double rad, mag, saturation_rate = 7, r, g, b;
246
+
247
+
248
+
249
+ // 第1フレームを取得しておく
250
+
251
+ cap >> bufM;
252
+
253
+ cv::cvtColor(bufM, prevM, cv::COLOR_BGR2GRAY);
254
+
255
+
256
+
257
+ while(1){
258
+
259
+ tm.reset();
260
+
261
+ tm.start(); // 処理時間の計測開始
262
+
263
+ cap >> srcM; // キャプチャ
264
+
265
+ dispM = srcM.clone();
266
+
267
+
268
+
269
+ cv::cvtColor(srcM, nextM, cv::COLOR_BGR2GRAY);
270
+
271
+
272
+
273
+ opt->calc(prevM, nextM, flow); // オプティカルフローの計算
274
+
275
+
276
+
277
+ // 密なオプティカルフローの一部を線で描画
278
+
279
+ for(j = 0; j < flow.rows; j += lstep){
280
+
281
+ for(i = 0; i < flow.cols; i += lstep){
282
+
283
+ dx = flow.at<cv::Vec2f>(j, i)[0];
284
+
285
+ dy = flow.at<cv::Vec2f>(j, i)[1];
286
+
287
+ rad = cv::fastAtan2(dy , dx);
288
+
289
+ mag = cv::norm(cv::Point(dx , dy));
290
+
291
+
292
+
293
+ if(cv::norm(cv::Point(dx, dy)) > 1){
294
+
295
+ p1 = cv::Point(i, j);
296
+
297
+ p2 = cv::Point(i + dx, j + dy);
298
+
299
+ hsv2rgb(rad, mag * saturation_rate, 255, &r, &g, &b);
300
+
301
+ hueM.at<cv::Vec3b>(j, i) = cv::Vec3b(b, g, r);
302
+
303
+ cv::line(dispM, p1, p2, hueM.at, 1);
304
+
305
+ }
306
+
307
+ }
308
+
309
+ }
310
+
311
+
312
+
313
+ tm.stop(); // 処理時間の計測終了
314
+
315
+ sprintf(strCost, "%.0f", tm.getTimeMilli()); // 1フレームあたりの処理時間(ms)
316
+
317
+ cv::putText(srcM, strCost, cv::Point(30, 30), cv::FONT_HERSHEY_PLAIN, 1.4, cv::Scalar(0, 0, 255), 1, cv::LINE_AA);
318
+
319
+ cv::imshow("cap", srcM);
320
+
321
+ cv::imshow("flow hue", hueM);
322
+
323
+
324
+
325
+ key = cv::waitKey(1);
326
+
327
+ if(key == 'q' || key == 27) break;
328
+
329
+
330
+
331
+ prevM = nextM.clone(); // 現フレームの画像を次のループでの前フレーム画像へ
332
+
333
+ }
334
+
335
+
336
+
337
+ cap.release();
338
+
339
+ return 0;
340
+
341
+ }
188
342
 
189
343
  ```
190
344
 
191
345
 
192
346
 
193
- ### 該当のソースコード
194
-
195
-
196
-
197
- ```C++
198
-
199
- #include <opencv2/opencv.hpp>
200
-
201
- #include <opencv2/optflow.hpp>
202
-
203
-
204
-
205
- // 汎用的なHSV値をRGB値に変換する関数
206
-
207
- void hsv2rgb(double h, double s, double v, double *r, double *g, double *b){
208
-
209
- // 一般的色相の間隔にあわせるため!?+90度する
210
-
211
- if(h < 270) h += 90;
212
-
213
- else h -= 270;
214
-
215
- int i = (int)(h / 60.0) % 6;
216
-
217
- int p, q, t;
218
-
219
- if(s > 255) s = 255;
220
-
221
- double f = (double)(h / 60.0f) - (double)((int)(h / 60.0f));
222
-
223
- p = (int)(0.5 + v * (1.0f - (s / 255.0f)));
224
-
225
- q = (int)(0.5 + v * (1.0f - (s / 255.0f) * f));
226
-
227
- t = (int)(0.5 + v * (1.0f - (s / 255.0f) * (1.0f - f)));
228
-
229
-
230
-
231
- switch(i){ // 角度の範囲に応じたRGB値計算
232
-
233
- case 0 : *r = v; *g = t; *b = p; break;
234
-
235
- case 1 : *r = q; *g = v; *b = p; break;
236
-
237
- case 2 : *r = p; *g = v; *b = t; break;
238
-
239
- case 3 : *r = p; *g = q; *b = v; break;
240
-
241
- case 4 : *r = t; *g = p; *b = v; break;
242
-
243
- case 5 : *r = v; *g = p; *b = q; break;
244
-
245
- }
246
-
247
- }
248
-
249
-
250
-
251
- int main(int argc, char *argv[]){
252
-
253
- int c_w = 640, c_h = 480;
254
-
255
- // カメラ関連
256
-
257
- cv::VideoCapture cap(0);
258
-
259
- cap.set(cv::CAP_PROP_FRAME_WIDTH, c_w);
260
-
261
- cap.set(cv::CAP_PROP_FRAME_HEIGHT, c_h);
262
-
263
-
264
-
265
- // カメラがオープンできたかの確認
266
-
267
- if(!cap.isOpened()) return -1;
268
-
269
-
270
-
271
- // 処理時間
272
-
273
- cv::TickMeter tm;
274
-
275
- char strCost[256];
276
-
277
-
278
-
279
- int key, i, j;
280
-
281
- cv::Mat srcM, prevM, nextM, bufM, hueM; dispM;
282
-
283
-
284
-
285
- // オプティカルフローの初期化
286
-
287
- cv::Mat flow;
288
-
289
- cv::Ptr<cv::DenseOpticalFlow> opt = cv::optflow::createOptFlow_SparseToDense();
290
-
291
-
292
-
293
- // フロー描画用の変数
294
-
295
- double dx, dy;
296
-
297
- int lstep = 10; // この間隔でフローが描画される
298
-
299
- cv::Point p1, p2;
300
-
301
-
302
-
303
- // フローのhue描画用の変数
304
-
305
- hueM = cv::Mat(cv::Size(c_w, c_h), CV_8UC3);
306
-
307
- double dx, dy, rad, mag, saturation_rate = 7, r, g, b;
308
-
309
-
310
-
311
- // 第1フレームを取得しておく
312
-
313
- cap >> bufM;
314
-
315
- cv::cvtColor(bufM, prevM, cv::COLOR_BGR2GRAY);
316
-
317
-
318
-
319
- // 密なオプティカルフローの一部をドットで描画
320
-
321
- for(j = 0; j < flow.rows; j += lstep){
322
-
323
- for(i = 0; i < flow.cols; i += lstep){
324
-
325
- dx = flow.at<cv::Vec2f>(j, i)[0];
326
-
327
- dy = flow.at<cv::Vec2f>(j, i)[1];
328
-
329
- rad = cv::fastAtan2(dy , dx);
330
-
331
- mag = cv::norm(cv::Point(dx , dy));
332
-
333
-
334
-
335
- if(cv::norm(cv::Point(dx, dy)) > 1){
336
-
337
- p1 = cv::Point(i, j);
338
-
339
- p2 = cv::Point(i + dx, j + dy);
340
-
341
- hsv2rgb(rad, mag * saturation_rate, 255, &r, &g, &b);
342
-
343
- hueM.at<cv::Vec3b>(j, i) = cv::Vec3b(b, g, r);
344
-
345
- cv::line(dispM, p1, p2, hueM.at, 1);
346
-
347
- }
348
-
349
- }
350
-
351
- }
352
-
353
-
354
-
355
- tm.stop(); // 処理時間の計測終了
356
-
357
- sprintf(strCost, "%.0f", tm.getTimeMilli()); // 1フレームあたりの処理時間(ms)
358
-
359
- cv::putText(srcM, strCost, cv::Point(30, 30), cv::FONT_HERSHEY_PLAIN, 1.4, cv::Scalar(0, 0, 255), 1, cv::LINE_AA);
360
-
361
- cv::imshow("cap", srcM);
362
-
363
- cv::imshow("flow hue", hueM);
364
-
365
-
366
-
367
- key = cv::waitKey(1);
368
-
369
- if(key == 'q' || key == 27) break;
370
-
371
-
372
-
373
- prevM = nextM.clone(); // 現フレームの画像を次のループでの前フレーム画像へ
374
-
375
- }
376
-
377
-
378
-
379
- cap.release();
380
-
381
- return 0;
382
-
383
- }
384
-
385
-
386
-
387
-
347
+ ### 試したこと
348
+
349
+
350
+
351
+ //密なオプティカルフローの一部をドットで描画
352
+
353
+ の部分を線で表示する処理とhueで表示する処理を一緒にしました。
354
+
355
+ またcv.line()の色を設定する部分をhueM.atにしました。
356
+
357
+ もともとは以下の様になっていました。
358
+
359
+ cv::line(dispM, p1, p2, cv::Scalar(0, 0, 255), 1);
360
+
361
+
362
+
363
+ ### 補足情報(FW/ツールのバージョンど)
364
+
365
+
366
+
367
+ ```Makefile
368
+
369
+ TARGETS = opt # コンパイルしたいプログラム名
370
+
371
+ SRCS = opt_cam_huedot.cpp
372
+
373
+ CC = g++ # 使うコンパイラ
374
+
375
+ LIB =
376
+
377
+ CFLAGS = -Wall -O2 -std=c++11
378
+
379
+ OBJS := $(SRCS:.cpp=.o)
380
+
381
+ OBJS := $(addprefix objs/,$(OBJS))
382
+
383
+ OPENCVINC = `pkg-config --cflags opencv4`
384
+
385
+ OPENCVLIB = `pkg-config --libs opencv4`
386
+
387
+
388
+
389
+ all: $(TARGETS)
390
+
391
+
392
+
393
+ $(TARGETS): $(OBJS)
394
+
395
+ $(CC) $(LDFLAGS) -o $@ $(OBJS) $(OPENCVLIB) $(LIB)
396
+
397
+
398
+
399
+ objs/%.o: ./%.cpp
400
+
401
+ -mkdir objs
402
+
403
+ $(CC) $(CFLAGS) -c $< -o $@ $(OPENCVINC) $(OPENCVLIB) $(LIB)
404
+
405
+
406
+
407
+ clean:
408
+
409
+ rm -rf $(TARGETS)
410
+
411
+ rm -rf objs/*.o
412
+
413
+ rm -rf objs
414
+
415
+
416
+
417
+
388
418
 
389
419
  ```
390
-
391
-
392
-
393
- ### 試したこと
394
-
395
-
396
-
397
- //密なオプティカルフローの一部をドットで描画
398
-
399
- の部分を線で表示する処理とhueで表示する処理を一緒にしました。
400
-
401
- またcv.line()の色を設定する部分をhueM.atにしました。
402
-
403
- もともとは以下の様になっていました。
404
-
405
- cv::line(dispM, p1, p2, cv::Scalar(0, 0, 255), 1);
406
-
407
-
408
-
409
- ### 補足情報(FW/ツールのバージョンなど)
410
-
411
-
412
-
413
- ```Makefile
414
-
415
- TARGETS = opt # コンパイルしたいプログラム名
416
-
417
- SRCS = opt_cam_huedot.cpp
418
-
419
- CC = g++ # 使うコンパイラ
420
-
421
- LIB =
422
-
423
- CFLAGS = -Wall -O2 -std=c++11
424
-
425
- OBJS := $(SRCS:.cpp=.o)
426
-
427
- OBJS := $(addprefix objs/,$(OBJS))
428
-
429
- OPENCVINC = `pkg-config --cflags opencv4`
430
-
431
- OPENCVLIB = `pkg-config --libs opencv4`
432
-
433
-
434
-
435
- all: $(TARGETS)
436
-
437
-
438
-
439
- $(TARGETS): $(OBJS)
440
-
441
- $(CC) $(LDFLAGS) -o $@ $(OBJS) $(OPENCVLIB) $(LIB)
442
-
443
-
444
-
445
- objs/%.o: ./%.cpp
446
-
447
- -mkdir objs
448
-
449
- $(CC) $(CFLAGS) -c $< -o $@ $(OPENCVINC) $(OPENCVLIB) $(LIB)
450
-
451
-
452
-
453
- clean:
454
-
455
- rm -rf $(TARGETS)
456
-
457
- rm -rf objs/*.o
458
-
459
- rm -rf objs
460
-
461
-
462
-
463
-
464
-
465
- ```