質問編集履歴

7

プログラムのみやすさ改善

2016/10/13 04:19

投稿

kaihatu
kaihatu

スコア7

test CHANGED
File without changes
test CHANGED
@@ -44,6 +44,8 @@
44
44
 
45
45
  while (1){
46
46
 
47
+ //カメラ情報のキャプチャー
48
+
47
49
  cap1 >> input_img1[j];
48
50
 
49
51
  cap2 >> input_img2[j];

6

プログラムの問題点のみのとりあげ

2016/10/13 04:19

投稿

kaihatu
kaihatu

スコア7

test CHANGED
File without changes
test CHANGED
@@ -32,310 +32,192 @@
32
32
 
33
33
  ```
34
34
 
35
- #include<pragma_lib.h>
36
-
37
- #include<cv.h>
38
-
39
- #include"opencv2/highgui/highgui.hpp"
40
-
41
- #include <cvaux.h>
42
-
43
- #include <omp.h>
44
-
45
-
46
-
47
- int main(int argc, char *argv[])
48
-
49
- {
50
-
51
- using namespace cv;
35
+ #pragma omp parallel
52
-
53
- int j = 0;
36
+
54
-
55
-
56
-
57
- IplImage *gray_img1 = 0, *gray_img2 = 0;
58
-
59
- CvCapture *capture1 = 0, *capture2 = 0;
60
-
61
-
62
-
63
- VideoCapture cap1(0);
37
+ #pragma omp sections
64
-
65
- cap1.set(CV_CAP_PROP_FRAME_WIDTH, 640);
66
-
67
- cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
68
-
69
-
70
-
71
- VideoCapture cap2(1);
72
-
73
- cap2.set(CV_CAP_PROP_FRAME_WIDTH, 640);
74
-
75
- cap2.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
76
-
77
- /* この設定は,利用するカメラに依存する */
78
-
79
- capture1 = cvCreateCameraCapture(0);
80
-
81
- capture2 = cvCreateCameraCapture(0);
82
-
83
-
84
-
85
- // (2)キャプチャサイズを設定する.
86
-
87
- cvSetCaptureProperty(capture1, CV_CAP_PROP_FRAME_WIDTH, 640);
88
-
89
- cvSetCaptureProperty(capture1, CV_CAP_PROP_FRAME_HEIGHT, 480);
90
-
91
- cvSetCaptureProperty(capture2, CV_CAP_PROP_FRAME_WIDTH, 640);
92
-
93
- cvSetCaptureProperty(capture2, CV_CAP_PROP_FRAME_HEIGHT, 480);
94
-
95
-
96
-
97
- if (!cap1.isOpened())
98
38
 
99
39
  {
100
40
 
41
+ #pragma omp section
42
+
43
+ {
44
+
45
+ while (1){
46
+
101
- printf("カメラが検出できませんでした");
47
+ cap1 >> input_img1[j];
48
+
102
-
49
+ cap2 >> input_img2[j];
50
+
51
+ j++;
52
+
53
+ if (j == 10){
54
+
55
+ j = 0;
56
+
57
+ }
58
+
59
+ }
60
+
61
+ }
62
+
63
+ #pragma omp section
64
+
65
+ {
66
+
103
- return -1;
67
+ int k = 0;
68
+
69
+ while (1){
70
+
71
+ if (j != k){
72
+
73
+
74
+
75
+ hsv_skin_img1 = Scalar(0, 0, 0);
76
+
77
+ cvtColor(input_img1[k], hsv_img1, CV_BGR2HSV); //HSVに変換
78
+
79
+ //問題の並列化したい作業
80
+
81
+ for (int y = 0; y < 480; y++)
82
+
83
+ {
84
+
85
+ for (int x = 0; x < 640; x++)
86
+
87
+ {
88
+
89
+ int a = hsv_img1.step*y + (x * 3);
90
+
91
+ if (hsv_img1.data[a] >= 0 && hsv_img1.data[a] <= 15 && hsv_img1.data[a + 1] >= 50 && hsv_img1.data[a + 2] >= 50) //HSVでの検出
92
+
93
+ {
94
+
95
+ hsv_skin_img1.data[a] = 255; //肌色部分を青に
96
+
97
+ }
98
+
99
+ }
100
+
101
+ }
102
+
103
+
104
+
105
+ //IplImage *gray_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1);
106
+
107
+ gray_img1 = cvCreateImage(cvGetSize(&(IplImage(hsv_skin_img1))), IPL_DEPTH_8U, 1);
108
+
109
+
110
+
111
+ // グレイスケールに変換
112
+
113
+ cvCvtColor(&(IplImage(hsv_skin_img1)), gray_img1, CV_BGR2GRAY);
114
+
115
+ CvMoments moments;
116
+
117
+ cvMoments(gray_img1, &moments, 0);
118
+
119
+ double m00 = cvGetSpatialMoment(&moments, 0, 0);
120
+
121
+ double m10 = cvGetSpatialMoment(&moments, 1, 0);
122
+
123
+ double m01 = cvGetSpatialMoment(&moments, 0, 1);
124
+
125
+ int gX = m10 / m00, gY = m01 / m00;
126
+
127
+
128
+
129
+ k = j;
130
+
131
+ }
132
+
133
+ }
104
134
 
105
135
  }
106
136
 
107
- if (!cap2.isOpened())
137
+ #pragma omp section
108
-
138
+
109
- {
139
+ {
140
+
110
-
141
+ int k = 0;
142
+
143
+ while (1){
144
+
145
+ if (j != k){
146
+
147
+
148
+
149
+ hsv_skin_img2 = Scalar(0, 0, 0);
150
+
151
+
152
+
153
+ cvtColor(input_img2[k], hsv_img2, CV_BGR2HSV); //HSVに変換
154
+
155
+
156
+
157
+ // #pragma omp parallel forを使いたいが高速にならないため
158
+
159
+ //問題の並列化したい作業
160
+
161
+ for (int y = 0; y < 480; y++)
162
+
163
+ {
164
+
165
+ for (int x = 0; x < 640; x++)
166
+
167
+ {
168
+
169
+ int a = hsv_img2.step*y + (x * 3);
170
+
171
+ if (hsv_img2.data[a] >= 0 && hsv_img2.data[a] <= 15 && hsv_img2.data[a + 1] >= 50 && hsv_img2.data[a + 2] >= 50) //HSVでの検出
172
+
173
+ {
174
+
175
+ hsv_skin_img2.data[a] = 255; //肌色部分を青に
176
+
177
+ }
178
+
179
+ }
180
+
181
+ }
182
+
183
+
184
+
185
+ //IplImage *gray_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1);
186
+
187
+ gray_img2 = cvCreateImage(cvGetSize(&(IplImage(hsv_skin_img2))), IPL_DEPTH_8U, 1);
188
+
189
+
190
+
191
+ // グレイスケールに変換
192
+
193
+ cvCvtColor(&(IplImage(hsv_skin_img2)), gray_img2, CV_BGR2GRAY);
194
+
195
+ CvMoments moments;
196
+
197
+ cvMoments(gray_img2, &moments, 0);
198
+
199
+ double m00 = cvGetSpatialMoment(&moments, 0, 0);
200
+
201
+ double m10 = cvGetSpatialMoment(&moments, 1, 0);
202
+
203
+ double m01 = cvGetSpatialMoment(&moments, 0, 1);
204
+
205
+ int gX = m10 / m00, gY = m01 / m00;
206
+
111
- printf("カメラが検出できませんでした");
207
+ //printf("%d\n", j);
112
-
208
+
209
+
210
+
113
- return -1;
211
+ k = j;
212
+
213
+ }
214
+
215
+ }
216
+
217
+ }
114
218
 
115
219
  }
116
220
 
117
- Mat input_img1[10], input_img2[10];
118
-
119
- Mat hsv_skin_img1 = Mat(Size(640, 480), CV_8UC3);
120
-
121
- Mat hsv_skin_img2 = Mat(Size(640, 480), CV_8UC3);
122
-
123
- Mat hsv_img1, hsv_img2;
124
-
125
-
126
-
127
- int i = 0, n;
128
-
129
- n = omp_get_max_threads(); // デフォルドのスレッド数を取得
130
-
131
- printf("max threads (default): %d\n", n);
132
-
133
-
134
-
135
- omp_set_num_threads(16); // スレッド数を変更
136
-
137
- n = omp_get_max_threads(); // スレッド数を再取得
138
-
139
- printf("max threads (set): %d\n", n);
140
-
141
-
142
-
143
- std::vector<int> v; // int 型動的配列
144
-
145
- #pragma omp parallel
146
-
147
- #pragma omp sections
148
-
149
- {
150
-
151
- #pragma omp section
152
-
153
- {
154
-
155
- clock_t start = clock(); // スタート時間
156
-
157
-
158
-
159
- while (1){
160
-
161
- cap1 >> input_img1[j];
162
-
163
- cap2 >> input_img2[j];
164
-
165
- j++;
166
-
167
- if (j == 10){
168
-
169
- j = 0;
170
-
171
- }
172
-
173
- }
174
-
175
- clock_t end = clock(); // 終了時間
176
-
177
- std::cout << "duration = " << (double)(end - start) / CLOCKS_PER_SEC << "sec.\n";
178
-
179
- }
180
-
181
- #pragma omp section
182
-
183
- {
184
-
185
- int k = 0;
186
-
187
- while (1){
188
-
189
- if (j != k){
190
-
191
-
192
-
193
- hsv_skin_img1 = Scalar(0, 0, 0);
194
-
195
- cvtColor(input_img1[k], hsv_img1, CV_BGR2HSV); //HSVに変換
196
-
197
- //問題の並列化したい作業
198
-
199
- for (int y = 0; y < 480; y++)
200
-
201
- {
202
-
203
- for (int x = 0; x < 640; x++)
204
-
205
- {
206
-
207
- int a = hsv_img1.step*y + (x * 3);
208
-
209
- if (hsv_img1.data[a] >= 0 && hsv_img1.data[a] <= 15 && hsv_img1.data[a + 1] >= 50 && hsv_img1.data[a + 2] >= 50) //HSVでの検出
210
-
211
- {
212
-
213
- hsv_skin_img1.data[a] = 255; //肌色部分を青に
214
-
215
- }
216
-
217
- }
218
-
219
- }
220
-
221
-
222
-
223
- //IplImage *gray_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1);
224
-
225
- gray_img1 = cvCreateImage(cvGetSize(&(IplImage(hsv_skin_img1))), IPL_DEPTH_8U, 1);
226
-
227
-
228
-
229
- // グレイスケールに変換
230
-
231
- cvCvtColor(&(IplImage(hsv_skin_img1)), gray_img1, CV_BGR2GRAY);
232
-
233
- CvMoments moments;
234
-
235
- cvMoments(gray_img1, &moments, 0);
236
-
237
- double m00 = cvGetSpatialMoment(&moments, 0, 0);
238
-
239
- double m10 = cvGetSpatialMoment(&moments, 1, 0);
240
-
241
- double m01 = cvGetSpatialMoment(&moments, 0, 1);
242
-
243
- int gX = m10 / m00, gY = m01 / m00;
244
-
245
-
246
-
247
- k = j;
248
-
249
- }
250
-
251
- }
252
-
253
- }
254
-
255
- #pragma omp section
256
-
257
- {
258
-
259
- int k = 0;
260
-
261
- while (1){
262
-
263
- if (j != k){
264
-
265
-
266
-
267
- hsv_skin_img2 = Scalar(0, 0, 0);
268
-
269
-
270
-
271
- cvtColor(input_img2[k], hsv_img2, CV_BGR2HSV); //HSVに変換
272
-
273
-
274
-
275
- // #pragma omp parallel forを使いたいが高速にならないため
276
-
277
- //問題の並列化したい作業
278
-
279
- for (int y = 0; y < 480; y++)
280
-
281
- {
282
-
283
- for (int x = 0; x < 640; x++)
284
-
285
- {
286
-
287
- int a = hsv_img2.step*y + (x * 3);
288
-
289
- if (hsv_img2.data[a] >= 0 && hsv_img2.data[a] <= 15 && hsv_img2.data[a + 1] >= 50 && hsv_img2.data[a + 2] >= 50) //HSVでの検出
290
-
291
- {
292
-
293
- hsv_skin_img2.data[a] = 255; //肌色部分を青に
294
-
295
- }
296
-
297
- }
298
-
299
- }
300
-
301
-
302
-
303
- //IplImage *gray_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1);
304
-
305
- gray_img2 = cvCreateImage(cvGetSize(&(IplImage(hsv_skin_img2))), IPL_DEPTH_8U, 1);
306
-
307
-
308
-
309
- // グレイスケールに変換
310
-
311
- cvCvtColor(&(IplImage(hsv_skin_img2)), gray_img2, CV_BGR2GRAY);
312
-
313
- CvMoments moments;
314
-
315
- cvMoments(gray_img2, &moments, 0);
316
-
317
- double m00 = cvGetSpatialMoment(&moments, 0, 0);
318
-
319
- double m10 = cvGetSpatialMoment(&moments, 1, 0);
320
-
321
- double m01 = cvGetSpatialMoment(&moments, 0, 1);
322
-
323
- int gX = m10 / m00, gY = m01 / m00;
324
-
325
- //printf("%d\n", j);
326
-
327
-
328
-
329
- k = j;
330
-
331
- }
332
-
333
- }
334
-
335
- }
336
-
337
- }
338
-
339
221
  getchar();
340
222
 
341
223
  }

5

文章の改善

2016/10/13 04:18

投稿

kaihatu
kaihatu

スコア7

test CHANGED
File without changes
test CHANGED
@@ -14,11 +14,13 @@
14
14
 
15
15
  カメラからの情報取得と左右それぞれのカメラ結果の画像処理まで
16
16
 
17
+ 並列化ができており、
18
+
17
- 並列化ができており画像処理したものの色の抽出を行う段階での
19
+ そこから画像処理したものの色の抽出を行う段階での
18
-
20
+
19
- 並列化がうまくいかずおそらく順次処理の動きになっています
21
+ 並列化がうまくいかずおそらく順次処理の動きになってしまいます
20
-
22
+
21
- OpenMPでは並列作業にさらに並列を重ねることはできないのでしょうか
23
+ OpenMPでは並列にさらに並列を重ねることはできないのでしょうか
22
24
 
23
25
  またできない場合には別の方法があれば教えてください
24
26
 

4

見易さ改善

2016/10/13 04:16

投稿

kaihatu
kaihatu

スコア7

test CHANGED
File without changes
test CHANGED
@@ -24,6 +24,10 @@
24
24
 
25
25
 
26
26
 
27
+ *実際のプログラムではうまくいかなかった色抽出の並列化や球の距離計測部分は省略しております
28
+
29
+
30
+
27
31
  ```
28
32
 
29
33
  #include<pragma_lib.h>

3

インテントの追加

2016/10/13 04:14

投稿

kaihatu
kaihatu

スコア7

test CHANGED
File without changes
test CHANGED
@@ -98,7 +98,7 @@
98
98
 
99
99
  }
100
100
 
101
- if (!cap2.isOpened())
101
+ if (!cap2.isOpened())
102
102
 
103
103
  {
104
104
 

2

動きの改善

2016/10/13 03:23

投稿

kaihatu
kaihatu

スコア7

test CHANGED
File without changes
test CHANGED
@@ -98,6 +98,16 @@
98
98
 
99
99
  }
100
100
 
101
+ if (!cap2.isOpened())
102
+
103
+ {
104
+
105
+ printf("カメラが検出できませんでした");
106
+
107
+ return -1;
108
+
109
+ }
110
+
101
111
  Mat input_img1[10], input_img2[10];
102
112
 
103
113
  Mat hsv_skin_img1 = Mat(Size(640, 480), CV_8UC3);

1

みやすく

2016/10/13 03:22

投稿

kaihatu
kaihatu

スコア7

test CHANGED
File without changes
test CHANGED
@@ -140,7 +140,7 @@
140
140
 
141
141
 
142
142
 
143
- while (j != 10){
143
+ while (1){
144
144
 
145
145
  cap1 >> input_img1[j];
146
146
 
@@ -168,7 +168,7 @@
168
168
 
169
169
  int k = 0;
170
170
 
171
- while (j != 11){
171
+ while (1){
172
172
 
173
173
  if (j != k){
174
174
 
@@ -242,7 +242,7 @@
242
242
 
243
243
  int k = 0;
244
244
 
245
- while (j != 11){
245
+ while (1){
246
246
 
247
247
  if (j != k){
248
248