質問編集履歴

2

発生している問題の詳細を変更した

2018/02/13 04:08

投稿

3dmagicball
3dmagicball

スコア6

test CHANGED
File without changes
test CHANGED
@@ -44,6 +44,16 @@
44
44
 
45
45
  グローバル変数の取得が一度しか出来ない
46
46
 
47
+
48
+
49
+ ※2/13 追記
50
+
51
+ CameraViewのcntsvとCommonのkeyyyが変化する処理がずっとループしており、
52
+
53
+ 再度getInt()することが出来ない
54
+
55
+
56
+
47
57
  ```
48
58
 
49
59
 

1

setIntを用いるCameraViewを記入し忘れていました、申し訳ありません。 助長になっていますが、最後のところにcommon.setInt(cntsv)があります。

2018/02/13 04:08

投稿

3dmagicball
3dmagicball

スコア6

test CHANGED
File without changes
test CHANGED
@@ -196,6 +196,398 @@
196
196
 
197
197
 
198
198
 
199
+ ```Java
200
+
201
+ public class CameraView extends SurfaceView
202
+
203
+ implements SurfaceHolder.Callback, Camera.PreviewCallback {
204
+
205
+ //カメラの縦横 640*480は標準的に動く
206
+
207
+ private static final int PREVIEW_WIDTH = 640;
208
+
209
+ private static final int PREVIEW_HEIGHT = 480;
210
+
211
+ private static final int FRAME_WIDTH = 50;
212
+
213
+ private static final int SCALE = 1;
214
+
215
+ private static final int VIEW_POINTS = 200;
216
+
217
+ private static final float PEN_WIDTH = 3.0F;
218
+
219
+ private int mBufSize;
220
+
221
+ private float[] mVal;
222
+
223
+ private int mSamples;
224
+
225
+ private int mTop;
226
+
227
+ private int mStep;
228
+
229
+ private Camera mCamera = null;
230
+
231
+ private SurfaceHolder mHolder = null;
232
+
233
+ private SurfaceTexture mSurfaceTexture = null;
234
+
235
+ String bbb ="hello_world";
236
+
237
+ int keyfin = 0;
238
+
239
+ int cntsv ;
240
+
241
+ Timer timer;
242
+
243
+
244
+
245
+
246
+
247
+ Common common;
248
+
249
+ public int coun = 0;
250
+
251
+ public Paint paintf;
252
+
253
+
254
+
255
+ public Activity activity;
256
+
257
+
258
+
259
+ //CameraViewのメソッド
260
+
261
+ public CameraView(Context context) {
262
+
263
+ super(context);
264
+
265
+
266
+
267
+ mHolder = getHolder();
268
+
269
+ mHolder.addCallback(this);
270
+
271
+
272
+
273
+ //ここでインスタンス化
274
+
275
+ common = (Common)context.getApplicationContext();
276
+
277
+ timer = new Timer();
278
+
279
+ }
280
+
281
+
282
+
283
+ //カメラ作成にはsurfaceが必要で、surfaceの作成
284
+
285
+ public void surfaceCreated(SurfaceHolder holder) {
286
+
287
+ // TODO Auto-generated method stub
288
+
289
+
290
+
291
+ //getWidthは画面サイズ取得
292
+
293
+ mBufSize = getWidth();
294
+
295
+ mVal = new float[mBufSize];
296
+
297
+ mStep = (mBufSize - FRAME_WIDTH * 2) / VIEW_POINTS;
298
+
299
+
300
+
301
+ // カメラオープン(カメラのインスタンスを取得)
302
+
303
+ mCamera = Camera.open();
304
+
305
+ try {
306
+
307
+ mCamera.setPreviewDisplay(holder);
308
+
309
+
310
+
311
+ } catch (IOException e) {
312
+
313
+ // TODO Auto-generated catch block
314
+
315
+ e.printStackTrace();
316
+
317
+
318
+
319
+ }
320
+
321
+ }
322
+
323
+
324
+
325
+ //surface変更時の処理
326
+
327
+ public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
328
+
329
+ // TODO Auto-generated method stub
330
+
331
+ stopPreview();
332
+
333
+ // プレビュー画面のサイズ設定
334
+
335
+ Camera.Parameters params = mCamera.getParameters();
336
+
337
+ params.setPreviewSize(PREVIEW_WIDTH, PREVIEW_HEIGHT);
338
+
339
+ // params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
340
+
341
+ mCamera.setParameters(params);
342
+
343
+ // プレビュー開始
344
+
345
+ mTop = 0;
346
+
347
+ mSamples = 0;
348
+
349
+ startPreview();
350
+
351
+ }
352
+
353
+
354
+
355
+ //surface破棄時の処理
356
+
357
+ public void surfaceDestroyed(SurfaceHolder holder) {
358
+
359
+ // TODO Auto-generated method stub
360
+
361
+ stopPreview();
362
+
363
+ mCamera.release();
364
+
365
+ mCamera = null;
366
+
367
+ }
368
+
369
+
370
+
371
+ //ここでdataを定義
372
+
373
+ @Override
374
+
375
+ public void onPreviewFrame(byte[] data, Camera camera) {
376
+
377
+ // TODO Auto-generated method stub
378
+
379
+
380
+
381
+ mVal[mSamples % mBufSize] = calcLuminance(data);
382
+
383
+
384
+
385
+ // else {
386
+
387
+ mSamples++;
388
+
389
+ // drawLuminance();
390
+
391
+ }
392
+
393
+
394
+
395
+ // プレビュー開始
396
+
397
+ private void startPreview() {
398
+
399
+ mCamera.setPreviewCallback(this);
400
+
401
+ mCamera.startPreview();
402
+
403
+ }
404
+
405
+
406
+
407
+ // プレビュー停止
408
+
409
+ private void stopPreview() {
410
+
411
+ mCamera.setPreviewCallback(null);
412
+
413
+ mCamera.stopPreview();
414
+
415
+ }
416
+
417
+
418
+
419
+ // 輝度値の計算 "n"を箱として10個作る
420
+
421
+ float n[] = new float[10];
422
+
423
+
424
+
425
+ private float calcLuminance(byte[] data) {
426
+
427
+ //時間計測開始
428
+
429
+ long start = System.currentTimeMillis();
430
+
431
+ float sumVal1 = 0.0f;
432
+
433
+ float sumVal2 = 0.0f;
434
+
435
+ float sumVal3 = 0.0f;
436
+
437
+ float sumVal4 = 0.0f;
438
+
439
+
440
+
441
+ //cntはcountするだけのもの
442
+
443
+ int cnt = 0;
444
+
445
+ int cnt1 = 0;
446
+
447
+ int cnt2 = 0;
448
+
449
+ int cnt3 = 0;
450
+
451
+ int cnt4 = 0;
452
+
453
+
454
+
455
+ //この範囲からこの範囲での、輝度値を積分している
456
+
457
+ for (int y = PREVIEW_HEIGHT / 4 ; y < PREVIEW_HEIGHT * 3 / 8 ; y++) {
458
+
459
+ //widthを1/4(160)から3/4(480)まで回す
460
+
461
+ for (int x = PREVIEW_WIDTH / 4; x < PREVIEW_WIDTH * 3 / 8; x++) {
462
+
463
+
464
+
465
+ //1/4~3/4は範囲を設定しただけ(端末の大きさにより、変化するため)
466
+
467
+ //sumValは、画素値の合計値
468
+
469
+
470
+
471
+ sumVal1 = sumVal1 + (float) (data[y * PREVIEW_WIDTH + x] & 0xff);
472
+
473
+ cnt1++;
474
+
475
+
476
+
477
+ }
478
+
479
+ }
480
+
481
+
482
+
483
+ //2回目
484
+
485
+ for (int y = PREVIEW_HEIGHT / 4 ; y < PREVIEW_HEIGHT * 3 / 8 ; y++) {
486
+
487
+ for (int x = PREVIEW_WIDTH * 3 / 8; x < PREVIEW_WIDTH * 3 / 4; x++) {
488
+
489
+
490
+
491
+ sumVal2 = sumVal2 + (float) (data[y * PREVIEW_WIDTH + x] & 0xff);
492
+
493
+ cnt2++;
494
+
495
+
496
+
497
+ }
498
+
499
+ }
500
+
501
+
502
+
503
+ //3回目
504
+
505
+ for (int y = PREVIEW_HEIGHT * 3 / 8 ; y < PREVIEW_HEIGHT * 3 /4 ; y++) {
506
+
507
+ for (int x = PREVIEW_WIDTH / 4; x < PREVIEW_WIDTH * 3 / 8; x++) {
508
+
509
+
510
+
511
+ sumVal3 = sumVal3 + (float) (data[y * PREVIEW_WIDTH + x] & 0xff);
512
+
513
+ cnt3++;
514
+
515
+
516
+
517
+ }
518
+
519
+ }
520
+
521
+
522
+
523
+ //4回目
524
+
525
+ for (int y = PREVIEW_HEIGHT * 3/ 8 ; y < PREVIEW_HEIGHT * 3 / 4 ; y++) {
526
+
527
+ for (int x = PREVIEW_WIDTH *3 / 8; x < PREVIEW_WIDTH * 3 / 4; x++) {
528
+
529
+
530
+
531
+ sumVal4 = sumVal4 + (float) (data[y * PREVIEW_WIDTH + x] & 0xff);
532
+
533
+ cnt4++;
534
+
535
+
536
+
537
+ }
538
+
539
+ }
540
+
541
+
542
+
543
+ //合計値を、平均化している
544
+
545
+ sumVal1 = sumVal1/cnt1;
546
+
547
+ sumVal2 = sumVal2/cnt2;
548
+
549
+ sumVal3 = sumVal3/cnt3;
550
+
551
+ sumVal4 = sumVal4/cnt4;
552
+
553
+
554
+
555
+ //最大値を求めるコード
556
+
557
+ float sumValarray[]={sumVal1,sumVal2,sumVal3,sumVal4};
558
+
559
+ //とりあえず0を入れた
560
+
561
+ float sumValmax=sumValarray[0];
562
+
563
+
564
+
565
+ //sumValmaxを特定するループ
566
+
567
+ for(int i=0;i<sumValarray.length;i++){
568
+
569
+ if(sumValarray[i]>=sumValmax){
570
+
571
+ sumValmax= sumValarray[i];
572
+
573
+ //keyを取得するためのcntsv
574
+
575
+ cntsv=i;
576
+
577
+ }
578
+
579
+
580
+
581
+ // グローバル変数のset
582
+
583
+ common.setInt(cntsv);
584
+
585
+
586
+
587
+ }
588
+
589
+ ```
590
+
199
591
 
200
592
 
201
593