質問編集履歴

6

書式の改善

2017/12/07 06:58

投稿

shutein
shutein

スコア14

test CHANGED
@@ -1 +1 @@
1
- openCVを使った画素探査と座標の保存
1
+ openCVを使った画素値取得その座標の保存方法
test CHANGED
File without changes

5

タイトルの改善

2017/12/07 06:58

投稿

shutein
shutein

スコア14

test CHANGED
@@ -1 +1 @@
1
- openCVを使った画素探査と結果の利用
1
+ openCVを使った画素探査と座標保存
test CHANGED
File without changes

4

書式の改善

2017/12/07 05:27

投稿

shutein
shutein

スコア14

test CHANGED
File without changes
test CHANGED
@@ -40,13 +40,37 @@
40
40
 
41
41
  ##
42
42
 
43
- (追加)
43
+ (追加
44
44
 
45
45
  私なりにやってみましたが、一定の画素値以上のみを取り出すことができず、
46
46
 
47
- 全部の座標保存されただけでした。
47
+ エラー発生てしまいました。
48
+
48
-
49
+ ```
50
+
49
-
51
+ 発生したエラー
52
+
53
+
54
+
55
+ E/AndroidRuntime: FATAL EXCEPTION: Thread-3
56
+
57
+ Process: com.example.janome.color2, PID: 6055
58
+
59
+ java.lang.UnsupportedOperationException: Mat data type is not compatible: 5
60
+
61
+ at org.opencv.core.Mat.get(Mat.java:1015)
62
+
63
+ at com.example.janome.color2.MainActivity.onCameraFrame(MainActivity.java:229)
64
+
65
+ at org.opencv.android.CameraBridgeViewBase$CvCameraViewListenerAdapter.onCameraFrame(CameraBridgeViewBase.java:163)
66
+
67
+ at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:399)
68
+
69
+ at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:352)
70
+
71
+ at java.lang.Thread.run(Thread.java:776)
72
+
73
+ ```
50
74
 
51
75
  もしかして
52
76
 
@@ -58,27 +82,201 @@
58
82
 
59
83
  ```
60
84
 
85
+ int r =0;
86
+
87
+ int o=0;
88
+
89
+ // double pix=0;
90
+
91
+ double [] data =new double[avem2.width()*avem2.height()];
92
+
93
+ double[][] data2 =new double[2][avem2.width()*avem2.height()];
94
+
95
+ avem2.get(0,0,data);
96
+
97
+
98
+
99
+ for(int y=0;y<avem2.height();y++) {
100
+
101
+ for (int x = 0; x < avem2.width(); x++) {
102
+
103
+
104
+
105
+ // avem2.get(y,x); //画素値にアクセス
106
+
107
+ // System.out.println("値は"+data[o]);
108
+
109
+ // pix=data[o];
110
+
111
+
112
+
113
+ if(data[o]>0.98){
114
+
115
+ data2[0][r]=x;
116
+
117
+ data2[1][r]=y;
118
+
119
+ // System.out.println(+(r+1)+"番目の座標が"+data2[0][r]+","+data2[1][r]);
120
+
121
+ System.out.println("x座標は"+data2[0][r]+"y座標は"+data2[1][r]);
122
+
123
+ o++;
124
+
125
+ r++;
126
+
127
+ }
128
+
129
+ }
130
+
131
+ }
132
+
133
+ ```
134
+
135
+
136
+
137
+ ###該当のソースコード
138
+
139
+ ```Java
140
+
141
+ private Mat m_temp; //抽出結果の画像
142
+
143
+
144
+
145
+ public Mat onCameraFrame(Mat inputFrame) {
146
+
147
+ Mat src = inputFrame;
148
+
149
+ Mat dst = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
150
+
151
+ Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);
152
+
153
+
154
+
155
+ Mat src2 = dst;
156
+
157
+ Mat dst2 = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
158
+
159
+ Scalar low = new Scalar(165, 20, 30);//下限  変更前(10,20,30) S,Vはあまり変えない方が良い?
160
+
161
+ Scalar high = new Scalar(179, 255, 255);//上限 変更前(179,255,255)
162
+
163
+ Core.inRange(src2, low, high, dst2); //色抽出
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+ //画面をタッチすると表示画面が保持される
172
+
173
+ if (touId ==2) {
174
+
175
+ // return m_temp; // 保持した画像を代わりに表示する。画像は変化しないので、以降の処理は必要ない
176
+
177
+ touId++;
178
+
179
+ int size = (int) m_temp.total() * m_temp.channels(); //「size」はMatの大きさ的なモノ
180
+
181
+ byte[] temp = new byte[size]; //sizeの値を取るのに使うだけ
182
+
183
+ m_temp.get(0, 0, temp); //mat to array
184
+
185
+ // System.out.println(size); =2073600
186
+
187
+ int stride = 10;
188
+
189
+ int n=0;
190
+
191
+ double ave[] = new double[size/stride/stride];
192
+
193
+
194
+
195
+ for (int i=0;i< m_temp.height();i=i+stride) {
196
+
197
+ for (int j = 0; j < m_temp.width(); j = j + stride) {
198
+
199
+ double sum = 0;
200
+
201
+ for (int k = i; k < i + stride; k++) {
202
+
203
+ for (int l = j; l < j + stride; l++) {
204
+
205
+ sum += temp[k * m_temp.width() + l];
206
+
207
+ }
208
+
209
+ }
210
+
211
+
212
+
213
+
214
+
215
+ double relt = sum / stride / stride * -1.0; //平均を求める 符号を正に
216
+
217
+
218
+
219
+
220
+
221
+ if (relt >= 0.7) { //閾値の設定(relt3が小さいため0しか出ない)
222
+
223
+ relt = 1.0;
224
+
225
+ } else {
226
+
227
+ relt = 0.0;
228
+
229
+ }
230
+
231
+ ave[n] = relt;
232
+
233
+ // System.out.println(+n +"番目は"+"ave="+ave[n]);
234
+
235
+ n++; //n=20736
236
+
237
+ }
238
+
239
+ }
240
+
241
+ // System.out.println("m_temp.width()="+m_temp.width()+"m_temp.height()="+m_temp.height()); width=1920 height=1080 →プーリングで192 , 108 に
242
+
243
+ Mat avem =new Mat(108,192,CV_32F);
244
+
245
+ avem.put(0,0,ave); // 求めた配列をMatに変換した
246
+
247
+ // System.out.println(avem.dump());
248
+
249
+
250
+
251
+ Mat avem2 =new Mat(108,192,CvType.CV_32F);
252
+
253
+ Imgproc.GaussianBlur(avem,avem2,new Size(31,31),0,0); // 平滑化
254
+
255
+
256
+
61
257
  int r =0;
62
258
 
63
- // double [] data =new double[avem2.width()*avem2.height()];
259
+ int o=0;
64
-
260
+
65
- double[][] data2 =new double[2][avem2.width()*avem2.height()];
261
+ double [] data =new double[avem2.width()*avem2.height()];
66
-
262
+
67
- // avem2.get(0,0,data);
263
+ double[][] data2 =new double[2][];
68
-
69
-
70
-
264
+
265
+
266
+
71
- for(int y=0;y<avem2.height();y++) {
267
+ for(int y=0;y<avem2.width();y++) {
72
-
268
+
73
- for (int x = 0; x < avem2.width(); x++) {
269
+ for (int x = 0; x < avem2.height(); x++) {
270
+
74
-
271
+ avem2.get(x,y,data);
75
-
76
-
272
+
77
- // avem2.get(y,x); //画素値にアクセス
273
+ // avem2.get(x,y); //画素値にアクセス
274
+
78
-
275
+ System.out.println("値は"+data[o]);
276
+
79
-
277
+ o++;
80
-
278
+
81
- if( avem2.get(y,x)>0.98){
279
+ if( data[o] >0.98){
82
280
 
83
281
  data2[0][r]=x;
84
282
 
@@ -86,9 +284,7 @@
86
284
 
87
285
  // System.out.println(+(r+1)+"番目の座標が"+data2[0][r]+","+data2[1][r]);
88
286
 
89
- System.out.println("x座標は"+data2[0][r]+"y座標は"+data2[1][r]);
90
-
91
- r++;
287
+ r++;
92
288
 
93
289
  }
94
290
 
@@ -96,304 +292,142 @@
96
292
 
97
293
  }
98
294
 
295
+
296
+
297
+ // 最大値を見つけられたが、白い部分を見つけるに至っていない。
298
+
299
+
300
+
301
+
302
+
303
+ // Core.MinMaxLocResult max =Core.minMaxLoc(avem2); //最大値を求める部分
304
+
305
+ // System.out.println("avem2の最大値="+max.maxVal); //avem2の最大値=1.000000238418579 0.9895517826080322
306
+
307
+ // System.out.println("点数は"+point);
308
+
309
+ //固まりを見つけて点数を求めるのはここから↓
310
+
311
+ // for(n=0;n<=20628;n=n+108){
312
+
313
+ // for (n = 0; n < 108; n++) {
314
+
315
+ // if(ave[n]==1){
316
+
317
+ // for(n=n+1;n%108==107;n++){
318
+
319
+ // if(ave[n]==1){
320
+
321
+ //
322
+
323
+ // }
324
+
325
+
326
+
327
+ // 107 > 215 > 323 > 431 n%108==107
328
+
329
+ // }
330
+
331
+
332
+
333
+ // }
334
+
335
+ // }
336
+
337
+ // }
338
+
339
+ // }
340
+
341
+ return m_temp;
342
+
343
+ }
344
+
345
+
346
+
347
+ if(touId>2){
348
+
349
+ return m_temp;
350
+
351
+ }
352
+
353
+
354
+
355
+
356
+
357
+ //ここに赤(-1)がいくつ連続するか「固まっているか」を探す内容を書く!
358
+
359
+
360
+
361
+ //(例) 10×10 ピクセルごとに走査(縦→横方向)して ピクセル内の総和(0と-1の総和)÷総ピクセル数で一つの値を求める。
362
+
363
+ // そして閾値を決め、さっきの値を含むか否か分ける。(白の割合がどの程度) 閾値以上であればフラグ(引数的な?)を立てる
364
+
365
+ // また、走査時に白と黒の境の座標などを記録?しておく。
366
+
367
+ //境界の中点の座標を今度は横→縦方向で走査しフラグが重なるか調べることで白い塊が見つかるはず・・(多分)
368
+
369
+
370
+
371
+ /*if (color.val[0] == 0) {
372
+
373
+ Scalar targetColor = inputFrame.get(i, j);*/
374
+
375
+
376
+
377
+
378
+
379
+
380
+
381
+ if (touId == 1) {
382
+
383
+ touId++;
384
+
385
+ m_temp = dst2; //抽出結果を保持する
386
+
387
+ }
388
+
389
+ return dst2;
390
+
391
+ }
392
+
393
+
394
+
395
+ @Override
396
+
397
+ public boolean onTouchEvent (MotionEvent ev) {
398
+
399
+ switch (ev.getAction()) {
400
+
401
+ case ACTION_DOWN:
402
+
403
+ //画面がタッチされたときの動作
404
+
405
+ if (touId == 0) {
406
+
407
+ touId = 1;
408
+
409
+ }
410
+
411
+ break;
412
+
413
+ case MotionEvent.ACTION_CANCEL:
414
+
415
+ //他の要因によってタッチがキャンセルされたときの動作
416
+
417
+ break;
418
+
419
+ }
420
+
421
+ return super.onTouchEvent(ev);
422
+
423
+ }}
424
+
425
+
426
+
99
427
  ```
100
428
 
101
429
 
102
430
 
103
- ###該当のソースコード
104
-
105
- ```Java
106
-
107
- private Mat m_temp; //抽出結果の画像
108
-
109
-
110
-
111
- public Mat onCameraFrame(Mat inputFrame) {
112
-
113
- Mat src = inputFrame;
114
-
115
- Mat dst = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
116
-
117
- Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);
118
-
119
-
120
-
121
- Mat src2 = dst;
122
-
123
- Mat dst2 = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
124
-
125
- Scalar low = new Scalar(165, 20, 30);//下限  変更前(10,20,30) S,Vはあまり変えない方が良い?
126
-
127
- Scalar high = new Scalar(179, 255, 255);//上限 変更前(179,255,255)
128
-
129
- Core.inRange(src2, low, high, dst2); //色抽出
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
- //画面をタッチすると表示画面が保持される
138
-
139
- if (touId ==2) {
140
-
141
- // return m_temp; // 保持した画像を代わりに表示する。画像は変化しないので、以降の処理は必要ない
142
-
143
- touId++;
144
-
145
- int size = (int) m_temp.total() * m_temp.channels(); //「size」はMatの大きさ的なモノ
146
-
147
- byte[] temp = new byte[size]; //sizeの値を取るのに使うだけ
148
-
149
- m_temp.get(0, 0, temp); //mat to array
150
-
151
- // System.out.println(size); =2073600
152
-
153
- int stride = 10;
154
-
155
- int n=0;
156
-
157
- double ave[] = new double[size/stride/stride];
158
-
159
-
160
-
161
- for (int i=0;i< m_temp.height();i=i+stride) {
162
-
163
- for (int j = 0; j < m_temp.width(); j = j + stride) {
164
-
165
- double sum = 0;
166
-
167
- for (int k = i; k < i + stride; k++) {
168
-
169
- for (int l = j; l < j + stride; l++) {
170
-
171
- sum += temp[k * m_temp.width() + l];
172
-
173
- }
174
-
175
- }
176
-
177
-
178
-
179
-
180
-
181
- double relt = sum / stride / stride * -1.0; //平均を求める 符号を正に
182
-
183
-
184
-
185
-
186
-
187
- if (relt >= 0.7) { //閾値の設定(relt3が小さいため0しか出ない)
188
-
189
- relt = 1.0;
190
-
191
- } else {
192
-
193
- relt = 0.0;
194
-
195
- }
196
-
197
- ave[n] = relt;
198
-
199
- // System.out.println(+n +"番目は"+"ave="+ave[n]);
200
-
201
- n++; //n=20736
202
-
203
- }
204
-
205
- }
206
-
207
- // System.out.println("m_temp.width()="+m_temp.width()+"m_temp.height()="+m_temp.height()); width=1920 height=1080 →プーリングで192 , 108 に
208
-
209
- Mat avem =new Mat(108,192,CV_32F);
210
-
211
- avem.put(0,0,ave); // 求めた配列をMatに変換した
212
-
213
- // System.out.println(avem.dump());
214
-
215
-
216
-
217
- Mat avem2 =new Mat(108,192,CvType.CV_32F);
218
-
219
- Imgproc.GaussianBlur(avem,avem2,new Size(31,31),0,0); // 平滑化
220
-
221
-
222
-
223
- int r =0;
224
-
225
- int o=0;
226
-
227
- double [] data =new double[avem2.width()*avem2.height()];
228
-
229
- double[][] data2 =new double[2][];
230
-
231
-
232
-
233
- for(int y=0;y<avem2.width();y++) {
234
-
235
- for (int x = 0; x < avem2.height(); x++) {
236
-
237
- avem2.get(x,y,data);
238
-
239
- // avem2.get(x,y); //画素値にアクセス
240
-
241
- System.out.println("値は"+data[o]);
242
-
243
- o++;
244
-
245
- if( data[o] >0.98){
246
-
247
- data2[0][r]=x;
248
-
249
- data2[1][r]=y;
250
-
251
- // System.out.println(+(r+1)+"番目の座標が"+data2[0][r]+","+data2[1][r]);
252
-
253
- r++;
254
-
255
- }
256
-
257
- }
258
-
259
- }
260
-
261
-
262
-
263
- // 最大値を見つけられたが、白い部分を見つけるに至っていない。
264
-
265
-
266
-
267
-
268
-
269
- // Core.MinMaxLocResult max =Core.minMaxLoc(avem2); //最大値を求める部分
270
-
271
- // System.out.println("avem2の最大値="+max.maxVal); //avem2の最大値=1.000000238418579 0.9895517826080322
272
-
273
- // System.out.println("点数は"+point);
274
-
275
- //固まりを見つけて点数を求めるのはここから↓
276
-
277
- // for(n=0;n<=20628;n=n+108){
278
-
279
- // for (n = 0; n < 108; n++) {
280
-
281
- // if(ave[n]==1){
282
-
283
- // for(n=n+1;n%108==107;n++){
284
-
285
- // if(ave[n]==1){
286
-
287
- //
288
-
289
- // }
290
-
291
-
292
-
293
- // 107 > 215 > 323 > 431 n%108==107
294
-
295
- // }
296
-
297
-
298
-
299
- // }
300
-
301
- // }
302
-
303
- // }
304
-
305
- // }
306
-
307
- return m_temp;
308
-
309
- }
310
-
311
-
312
-
313
- if(touId>2){
314
-
315
- return m_temp;
316
-
317
- }
318
-
319
-
320
-
321
-
322
-
323
- //ここに赤(-1)がいくつ連続するか「固まっているか」を探す内容を書く!
324
-
325
-
326
-
327
- //(例) 10×10 ピクセルごとに走査(縦→横方向)して ピクセル内の総和(0と-1の総和)÷総ピクセル数で一つの値を求める。
328
-
329
- // そして閾値を決め、さっきの値を含むか否か分ける。(白の割合がどの程度) 閾値以上であればフラグ(引数的な?)を立てる
330
-
331
- // また、走査時に白と黒の境の座標などを記録?しておく。
332
-
333
- //境界の中点の座標を今度は横→縦方向で走査しフラグが重なるか調べることで白い塊が見つかるはず・・(多分)
334
-
335
-
336
-
337
- /*if (color.val[0] == 0) {
338
-
339
- Scalar targetColor = inputFrame.get(i, j);*/
340
-
341
-
342
-
343
-
344
-
345
-
346
-
347
- if (touId == 1) {
348
-
349
- touId++;
350
-
351
- m_temp = dst2; //抽出結果を保持する
352
-
353
- }
354
-
355
- return dst2;
356
-
357
- }
358
-
359
-
360
-
361
- @Override
362
-
363
- public boolean onTouchEvent (MotionEvent ev) {
364
-
365
- switch (ev.getAction()) {
366
-
367
- case ACTION_DOWN:
368
-
369
- //画面がタッチされたときの動作
370
-
371
- if (touId == 0) {
372
-
373
- touId = 1;
374
-
375
- }
376
-
377
- break;
378
-
379
- case MotionEvent.ACTION_CANCEL:
380
-
381
- //他の要因によってタッチがキャンセルされたときの動作
382
-
383
- break;
384
-
385
- }
386
-
387
- return super.onTouchEvent(ev);
388
-
389
- }}
390
-
391
-
392
-
393
- ```
394
-
395
-
396
-
397
431
  ###補足情報(言語/FW/ツール等のバージョンなど)
398
432
 
399
433
  androidstudio 2.3.1

3

内容の変更

2017/12/06 08:44

投稿

shutein
shutein

スコア14

test CHANGED
File without changes
test CHANGED
@@ -42,7 +42,17 @@
42
42
 
43
43
  (追加)
44
44
 
45
- 私なりにやってみましたが、「Attempt to write to null array」エラー出てしまいました。
45
+ 私なりにやってみましたが、一定の画素値以上のみを取り出すことができず、
46
+
47
+ 全部の座標が保存されただけでした。
48
+
49
+
50
+
51
+ もしかして
52
+
53
+ mat.get(y,x)で画素値を取り出すことはできないのでしょうか。
54
+
55
+
46
56
 
47
57
  以下コードです。
48
58
 
@@ -50,25 +60,189 @@
50
60
 
51
61
  int r =0;
52
62
 
63
+ // double [] data =new double[avem2.width()*avem2.height()];
64
+
65
+ double[][] data2 =new double[2][avem2.width()*avem2.height()];
66
+
67
+ // avem2.get(0,0,data);
68
+
69
+
70
+
71
+ for(int y=0;y<avem2.height();y++) {
72
+
73
+ for (int x = 0; x < avem2.width(); x++) {
74
+
75
+
76
+
77
+ // avem2.get(y,x); //画素値にアクセス
78
+
79
+
80
+
81
+ if( avem2.get(y,x)>0.98){
82
+
83
+ data2[0][r]=x;
84
+
85
+ data2[1][r]=y;
86
+
87
+ // System.out.println(+(r+1)+"番目の座標が"+data2[0][r]+","+data2[1][r]);
88
+
89
+ System.out.println("x座標は"+data2[0][r]+"y座標は"+data2[1][r]);
90
+
91
+ r++;
92
+
93
+ }
94
+
95
+ }
96
+
97
+ }
98
+
99
+ ```
100
+
101
+
102
+
103
+ ###該当のソースコード
104
+
105
+ ```Java
106
+
107
+ private Mat m_temp; //抽出結果の画像
108
+
109
+
110
+
111
+ public Mat onCameraFrame(Mat inputFrame) {
112
+
113
+ Mat src = inputFrame;
114
+
115
+ Mat dst = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
116
+
117
+ Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);
118
+
119
+
120
+
121
+ Mat src2 = dst;
122
+
123
+ Mat dst2 = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
124
+
125
+ Scalar low = new Scalar(165, 20, 30);//下限  変更前(10,20,30) S,Vはあまり変えない方が良い?
126
+
127
+ Scalar high = new Scalar(179, 255, 255);//上限 変更前(179,255,255)
128
+
129
+ Core.inRange(src2, low, high, dst2); //色抽出
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+ //画面をタッチすると表示画面が保持される
138
+
139
+ if (touId ==2) {
140
+
141
+ // return m_temp; // 保持した画像を代わりに表示する。画像は変化しないので、以降の処理は必要ない
142
+
143
+ touId++;
144
+
145
+ int size = (int) m_temp.total() * m_temp.channels(); //「size」はMatの大きさ的なモノ
146
+
147
+ byte[] temp = new byte[size]; //sizeの値を取るのに使うだけ
148
+
149
+ m_temp.get(0, 0, temp); //mat to array
150
+
151
+ // System.out.println(size); =2073600
152
+
153
+ int stride = 10;
154
+
155
+ int n=0;
156
+
157
+ double ave[] = new double[size/stride/stride];
158
+
159
+
160
+
161
+ for (int i=0;i< m_temp.height();i=i+stride) {
162
+
163
+ for (int j = 0; j < m_temp.width(); j = j + stride) {
164
+
165
+ double sum = 0;
166
+
167
+ for (int k = i; k < i + stride; k++) {
168
+
169
+ for (int l = j; l < j + stride; l++) {
170
+
171
+ sum += temp[k * m_temp.width() + l];
172
+
173
+ }
174
+
175
+ }
176
+
177
+
178
+
179
+
180
+
181
+ double relt = sum / stride / stride * -1.0; //平均を求める 符号を正に
182
+
183
+
184
+
185
+
186
+
187
+ if (relt >= 0.7) { //閾値の設定(relt3が小さいため0しか出ない)
188
+
189
+ relt = 1.0;
190
+
191
+ } else {
192
+
193
+ relt = 0.0;
194
+
195
+ }
196
+
197
+ ave[n] = relt;
198
+
199
+ // System.out.println(+n +"番目は"+"ave="+ave[n]);
200
+
201
+ n++; //n=20736
202
+
203
+ }
204
+
205
+ }
206
+
207
+ // System.out.println("m_temp.width()="+m_temp.width()+"m_temp.height()="+m_temp.height()); width=1920 height=1080 →プーリングで192 , 108 に
208
+
209
+ Mat avem =new Mat(108,192,CV_32F);
210
+
211
+ avem.put(0,0,ave); // 求めた配列をMatに変換した
212
+
213
+ // System.out.println(avem.dump());
214
+
215
+
216
+
217
+ Mat avem2 =new Mat(108,192,CvType.CV_32F);
218
+
219
+ Imgproc.GaussianBlur(avem,avem2,new Size(31,31),0,0); // 平滑化
220
+
221
+
222
+
223
+ int r =0;
224
+
225
+ int o=0;
226
+
53
227
  double [] data =new double[avem2.width()*avem2.height()];
54
228
 
55
229
  double[][] data2 =new double[2][];
56
230
 
57
- // avem2.get(0,0,data);
231
+
58
-
59
-
60
-
232
+
61
- for(int y=0;y<avem2.height();y++) {
233
+ for(int y=0;y<avem2.width();y++) {
62
-
234
+
63
- for (int x = 0; x < avem2.width(); x++) {
235
+ for (int x = 0; x < avem2.height(); x++) {
236
+
64
-
237
+ avem2.get(x,y,data);
65
-
66
-
238
+
67
- // avem2.get(y,x); //画素値にアクセス
239
+ // avem2.get(x,y); //画素値にアクセス
240
+
68
-
241
+ System.out.println("値は"+data[o]);
242
+
69
-
243
+ o++;
70
-
244
+
71
- if( avem2.get(y,x)>0.98){
245
+ if( data[o] >0.98){
72
246
 
73
247
  data2[0][r]=x;
74
248
 
@@ -76,9 +250,7 @@
76
250
 
77
251
  // System.out.println(+(r+1)+"番目の座標が"+data2[0][r]+","+data2[1][r]);
78
252
 
79
- System.out.println("x座標は"+data2[0][r]+"y座標は"+data2[1][r]);
80
-
81
- r++;
253
+ r++;
82
254
 
83
255
  }
84
256
 
@@ -86,304 +258,142 @@
86
258
 
87
259
  }
88
260
 
261
+
262
+
263
+ // 最大値を見つけられたが、白い部分を見つけるに至っていない。
264
+
265
+
266
+
267
+
268
+
269
+ // Core.MinMaxLocResult max =Core.minMaxLoc(avem2); //最大値を求める部分
270
+
271
+ // System.out.println("avem2の最大値="+max.maxVal); //avem2の最大値=1.000000238418579 0.9895517826080322
272
+
273
+ // System.out.println("点数は"+point);
274
+
275
+ //固まりを見つけて点数を求めるのはここから↓
276
+
277
+ // for(n=0;n<=20628;n=n+108){
278
+
279
+ // for (n = 0; n < 108; n++) {
280
+
281
+ // if(ave[n]==1){
282
+
283
+ // for(n=n+1;n%108==107;n++){
284
+
285
+ // if(ave[n]==1){
286
+
287
+ //
288
+
289
+ // }
290
+
291
+
292
+
293
+ // 107 > 215 > 323 > 431 n%108==107
294
+
295
+ // }
296
+
297
+
298
+
299
+ // }
300
+
301
+ // }
302
+
303
+ // }
304
+
305
+ // }
306
+
307
+ return m_temp;
308
+
309
+ }
310
+
311
+
312
+
313
+ if(touId>2){
314
+
315
+ return m_temp;
316
+
317
+ }
318
+
319
+
320
+
321
+
322
+
323
+ //ここに赤(-1)がいくつ連続するか「固まっているか」を探す内容を書く!
324
+
325
+
326
+
327
+ //(例) 10×10 ピクセルごとに走査(縦→横方向)して ピクセル内の総和(0と-1の総和)÷総ピクセル数で一つの値を求める。
328
+
329
+ // そして閾値を決め、さっきの値を含むか否か分ける。(白の割合がどの程度) 閾値以上であればフラグ(引数的な?)を立てる
330
+
331
+ // また、走査時に白と黒の境の座標などを記録?しておく。
332
+
333
+ //境界の中点の座標を今度は横→縦方向で走査しフラグが重なるか調べることで白い塊が見つかるはず・・(多分)
334
+
335
+
336
+
337
+ /*if (color.val[0] == 0) {
338
+
339
+ Scalar targetColor = inputFrame.get(i, j);*/
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+ if (touId == 1) {
348
+
349
+ touId++;
350
+
351
+ m_temp = dst2; //抽出結果を保持する
352
+
353
+ }
354
+
355
+ return dst2;
356
+
357
+ }
358
+
359
+
360
+
361
+ @Override
362
+
363
+ public boolean onTouchEvent (MotionEvent ev) {
364
+
365
+ switch (ev.getAction()) {
366
+
367
+ case ACTION_DOWN:
368
+
369
+ //画面がタッチされたときの動作
370
+
371
+ if (touId == 0) {
372
+
373
+ touId = 1;
374
+
375
+ }
376
+
377
+ break;
378
+
379
+ case MotionEvent.ACTION_CANCEL:
380
+
381
+ //他の要因によってタッチがキャンセルされたときの動作
382
+
383
+ break;
384
+
385
+ }
386
+
387
+ return super.onTouchEvent(ev);
388
+
389
+ }}
390
+
391
+
392
+
89
393
  ```
90
394
 
91
395
 
92
396
 
93
- ###該当のソースコード
94
-
95
- ```Java
96
-
97
- private Mat m_temp; //抽出結果の画像
98
-
99
-
100
-
101
- public Mat onCameraFrame(Mat inputFrame) {
102
-
103
- Mat src = inputFrame;
104
-
105
- Mat dst = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
106
-
107
- Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);
108
-
109
-
110
-
111
- Mat src2 = dst;
112
-
113
- Mat dst2 = Mat.zeros(inputFrame.width(), inputFrame.height(), CV_8U);
114
-
115
- Scalar low = new Scalar(165, 20, 30);//下限  変更前(10,20,30) S,Vはあまり変えない方が良い?
116
-
117
- Scalar high = new Scalar(179, 255, 255);//上限 変更前(179,255,255)
118
-
119
- Core.inRange(src2, low, high, dst2); //色抽出
120
-
121
-
122
-
123
-
124
-
125
-
126
-
127
- //画面をタッチすると表示画面が保持される
128
-
129
- if (touId ==2) {
130
-
131
- // return m_temp; // 保持した画像を代わりに表示する。画像は変化しないので、以降の処理は必要ない
132
-
133
- touId++;
134
-
135
- int size = (int) m_temp.total() * m_temp.channels(); //「size」はMatの大きさ的なモノ
136
-
137
- byte[] temp = new byte[size]; //sizeの値を取るのに使うだけ
138
-
139
- m_temp.get(0, 0, temp); //mat to array
140
-
141
- // System.out.println(size); =2073600
142
-
143
- int stride = 10;
144
-
145
- int n=0;
146
-
147
- double ave[] = new double[size/stride/stride];
148
-
149
-
150
-
151
- for (int i=0;i< m_temp.height();i=i+stride) {
152
-
153
- for (int j = 0; j < m_temp.width(); j = j + stride) {
154
-
155
- double sum = 0;
156
-
157
- for (int k = i; k < i + stride; k++) {
158
-
159
- for (int l = j; l < j + stride; l++) {
160
-
161
- sum += temp[k * m_temp.width() + l];
162
-
163
- }
164
-
165
- }
166
-
167
-
168
-
169
-
170
-
171
- double relt = sum / stride / stride * -1.0; //平均を求める 符号を正に
172
-
173
-
174
-
175
-
176
-
177
- if (relt >= 0.7) { //閾値の設定(relt3が小さいため0しか出ない)
178
-
179
- relt = 1.0;
180
-
181
- } else {
182
-
183
- relt = 0.0;
184
-
185
- }
186
-
187
- ave[n] = relt;
188
-
189
- // System.out.println(+n +"番目は"+"ave="+ave[n]);
190
-
191
- n++; //n=20736
192
-
193
- }
194
-
195
- }
196
-
197
- // System.out.println("m_temp.width()="+m_temp.width()+"m_temp.height()="+m_temp.height()); width=1920 height=1080 →プーリングで192 , 108 に
198
-
199
- Mat avem =new Mat(108,192,CV_32F);
200
-
201
- avem.put(0,0,ave); // 求めた配列をMatに変換した
202
-
203
- // System.out.println(avem.dump());
204
-
205
-
206
-
207
- Mat avem2 =new Mat(108,192,CvType.CV_32F);
208
-
209
- Imgproc.GaussianBlur(avem,avem2,new Size(31,31),0,0); // 平滑化
210
-
211
-
212
-
213
- int r =0;
214
-
215
- int o=0;
216
-
217
- double [] data =new double[avem2.width()*avem2.height()];
218
-
219
- double[][] data2 =new double[2][];
220
-
221
-
222
-
223
- for(int y=0;y<avem2.width();y++) {
224
-
225
- for (int x = 0; x < avem2.height(); x++) {
226
-
227
- avem2.get(x,y,data);
228
-
229
- // avem2.get(x,y); //画素値にアクセス
230
-
231
- System.out.println("値は"+data[o]);
232
-
233
- o++;
234
-
235
- if( data[o] >0.98){
236
-
237
- data2[0][r]=x;
238
-
239
- data2[1][r]=y;
240
-
241
- // System.out.println(+(r+1)+"番目の座標が"+data2[0][r]+","+data2[1][r]);
242
-
243
- r++;
244
-
245
- }
246
-
247
- }
248
-
249
- }
250
-
251
-
252
-
253
- // 最大値を見つけられたが、白い部分を見つけるに至っていない。
254
-
255
-
256
-
257
-
258
-
259
- // Core.MinMaxLocResult max =Core.minMaxLoc(avem2); //最大値を求める部分
260
-
261
- // System.out.println("avem2の最大値="+max.maxVal); //avem2の最大値=1.000000238418579 0.9895517826080322
262
-
263
- // System.out.println("点数は"+point);
264
-
265
- //固まりを見つけて点数を求めるのはここから↓
266
-
267
- // for(n=0;n<=20628;n=n+108){
268
-
269
- // for (n = 0; n < 108; n++) {
270
-
271
- // if(ave[n]==1){
272
-
273
- // for(n=n+1;n%108==107;n++){
274
-
275
- // if(ave[n]==1){
276
-
277
- //
278
-
279
- // }
280
-
281
-
282
-
283
- // 107 > 215 > 323 > 431 n%108==107
284
-
285
- // }
286
-
287
-
288
-
289
- // }
290
-
291
- // }
292
-
293
- // }
294
-
295
- // }
296
-
297
- return m_temp;
298
-
299
- }
300
-
301
-
302
-
303
- if(touId>2){
304
-
305
- return m_temp;
306
-
307
- }
308
-
309
-
310
-
311
-
312
-
313
- //ここに赤(-1)がいくつ連続するか「固まっているか」を探す内容を書く!
314
-
315
-
316
-
317
- //(例) 10×10 ピクセルごとに走査(縦→横方向)して ピクセル内の総和(0と-1の総和)÷総ピクセル数で一つの値を求める。
318
-
319
- // そして閾値を決め、さっきの値を含むか否か分ける。(白の割合がどの程度) 閾値以上であればフラグ(引数的な?)を立てる
320
-
321
- // また、走査時に白と黒の境の座標などを記録?しておく。
322
-
323
- //境界の中点の座標を今度は横→縦方向で走査しフラグが重なるか調べることで白い塊が見つかるはず・・(多分)
324
-
325
-
326
-
327
- /*if (color.val[0] == 0) {
328
-
329
- Scalar targetColor = inputFrame.get(i, j);*/
330
-
331
-
332
-
333
-
334
-
335
-
336
-
337
- if (touId == 1) {
338
-
339
- touId++;
340
-
341
- m_temp = dst2; //抽出結果を保持する
342
-
343
- }
344
-
345
- return dst2;
346
-
347
- }
348
-
349
-
350
-
351
- @Override
352
-
353
- public boolean onTouchEvent (MotionEvent ev) {
354
-
355
- switch (ev.getAction()) {
356
-
357
- case ACTION_DOWN:
358
-
359
- //画面がタッチされたときの動作
360
-
361
- if (touId == 0) {
362
-
363
- touId = 1;
364
-
365
- }
366
-
367
- break;
368
-
369
- case MotionEvent.ACTION_CANCEL:
370
-
371
- //他の要因によってタッチがキャンセルされたときの動作
372
-
373
- break;
374
-
375
- }
376
-
377
- return super.onTouchEvent(ev);
378
-
379
- }}
380
-
381
-
382
-
383
- ```
384
-
385
-
386
-
387
397
  ###補足情報(言語/FW/ツール等のバージョンなど)
388
398
 
389
399
  androidstudio 2.3.1

2

書式の変更

2017/12/06 08:08

投稿

shutein
shutein

スコア14

test CHANGED
File without changes
test CHANGED
@@ -38,6 +38,56 @@
38
38
 
39
39
 
40
40
 
41
+ ##
42
+
43
+ (追加)
44
+
45
+ 私なりにやってみましたが、「Attempt to write to null array」とエラーが出てしまいました。
46
+
47
+ 以下コードです。
48
+
49
+ ```
50
+
51
+ int r =0;
52
+
53
+ double [] data =new double[avem2.width()*avem2.height()];
54
+
55
+ double[][] data2 =new double[2][];
56
+
57
+ // avem2.get(0,0,data);
58
+
59
+
60
+
61
+ for(int y=0;y<avem2.height();y++) {
62
+
63
+ for (int x = 0; x < avem2.width(); x++) {
64
+
65
+
66
+
67
+ // avem2.get(y,x); //画素値にアクセス
68
+
69
+
70
+
71
+ if( avem2.get(y,x)>0.98){
72
+
73
+ data2[0][r]=x;
74
+
75
+ data2[1][r]=y;
76
+
77
+ // System.out.println(+(r+1)+"番目の座標が"+data2[0][r]+","+data2[1][r]);
78
+
79
+ System.out.println("x座標は"+data2[0][r]+"y座標は"+data2[1][r]);
80
+
81
+ r++;
82
+
83
+ }
84
+
85
+ }
86
+
87
+ }
88
+
89
+ ```
90
+
41
91
 
42
92
 
43
93
  ###該当のソースコード
@@ -332,53 +382,7 @@
332
382
 
333
383
  ```
334
384
 
335
- ###試したこと(追加)
385
+
336
-
337
- 私なりにやってみましたが、「Attempt to write to null array」とエラーが出てしまいました。
338
-
339
- 以下コードです。
340
-
341
- ```
342
-
343
- int r =0;
344
-
345
- double [] data =new double[avem2.width()*avem2.height()];
346
-
347
- double[][] data2 =new double[2][];
348
-
349
- // avem2.get(0,0,data);
350
-
351
-
352
-
353
- for(int y=0;y<avem2.height();y++) {
354
-
355
- for (int x = 0; x < avem2.width(); x++) {
356
-
357
-
358
-
359
- // avem2.get(y,x); //画素値にアクセス
360
-
361
-
362
-
363
- if( avem2.get(y,x)>0.98){
364
-
365
- data2[0][r]=x;
366
-
367
- data2[1][r]=y;
368
-
369
- // System.out.println(+(r+1)+"番目の座標が"+data2[0][r]+","+data2[1][r]);
370
-
371
- System.out.println("x座標は"+data2[0][r]+"y座標は"+data2[1][r]);
372
-
373
- r++;
374
-
375
- }
376
-
377
- }
378
-
379
- }
380
-
381
- ```
382
386
 
383
387
  ###補足情報(言語/FW/ツール等のバージョンなど)
384
388
 

1

試したことを追加

2017/12/06 08:00

投稿

shutein
shutein

スコア14

test CHANGED
File without changes
test CHANGED
@@ -332,11 +332,53 @@
332
332
 
333
333
  ```
334
334
 
335
-
335
+ ###試したこと(追加)
336
+
336
-
337
+ 私なりにやってみましたが、「Attempt to write to null array」とエラーが出てしまいました。
338
+
337
-
339
+ 以下コードです。
340
+
338
-
341
+ ```
342
+
339
-
343
+ int r =0;
344
+
345
+ double [] data =new double[avem2.width()*avem2.height()];
346
+
347
+ double[][] data2 =new double[2][];
348
+
349
+ // avem2.get(0,0,data);
350
+
351
+
352
+
353
+ for(int y=0;y<avem2.height();y++) {
354
+
355
+ for (int x = 0; x < avem2.width(); x++) {
356
+
357
+
358
+
359
+ // avem2.get(y,x); //画素値にアクセス
360
+
361
+
362
+
363
+ if( avem2.get(y,x)>0.98){
364
+
365
+ data2[0][r]=x;
366
+
367
+ data2[1][r]=y;
368
+
369
+ // System.out.println(+(r+1)+"番目の座標が"+data2[0][r]+","+data2[1][r]);
370
+
371
+ System.out.println("x座標は"+data2[0][r]+"y座標は"+data2[1][r]);
372
+
373
+ r++;
374
+
375
+ }
376
+
377
+ }
378
+
379
+ }
380
+
381
+ ```
340
382
 
341
383
  ###補足情報(言語/FW/ツール等のバージョンなど)
342
384