質問編集履歴

3

R6010の解決方法を知りたいです

2016/06/24 03:04

投稿

yamata
yamata

スコア36

test CHANGED
File without changes
test CHANGED
@@ -368,7 +368,7 @@
368
368
 
369
369
  どの部分で重複しているのかわかりません。
370
370
 
371
- 教えていただけたらと思います。
371
+ R6010の解決方法を教えていただけたらと思います。
372
372
 
373
373
 
374
374
 

2

改良版を追加しました!

2016/06/24 03:03

投稿

yamata
yamata

スコア36

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  ・キーボードを押すと5秒おきに写真を自動で撮影し、自動的にマッチングを行う
12
12
 
13
- ・1つの写真に対して、5枚くらいのテンプレートあてはめてマッチングを行いたい
13
+ ・1つの写真に対して、5枚くらいのテンプレートあてはめてマッチングを行いたい(撮影した写真に5枚のテンプレートをマッチングさせて判断)
14
14
 
15
15
  ・写真を撮ってから、マッチングまでの時間を計測したい→解決しました!
16
16
 
@@ -357,3 +357,273 @@
357
357
  コード
358
358
 
359
359
  ```
360
+
361
+
362
+
363
+ また、その改良版を作ってみました。
364
+
365
+ すると、R6010、Array Should be CvMat or IplImage
366
+
367
+ という警告がでました。
368
+
369
+ どの部分で重複しているのかわかりません。
370
+
371
+ 教えていただけたらと思います。
372
+
373
+
374
+
375
+ よろしくお願いします。
376
+
377
+
378
+
379
+ ```int main( int argc , char** argv)
380
+
381
+ {
382
+
383
+ int key;//キー入力用の変数
384
+
385
+ CvCapture *capture;//カメラキャプチャ用の構造体
386
+
387
+ IplImage *frameImage;//キャプチャ画像用IplImage
388
+
389
+ char windowNameCapture[] = "Capture";//キャプチャした画像を表示するウィンドウの名前
390
+
391
+
392
+
393
+ IplImage * temp = NULL;
394
+
395
+ IplImage * dst = NULL;
396
+
397
+ IplImage * img = NULL;
398
+
399
+ IplImage * grey = NULL;
400
+
401
+
402
+
403
+
404
+
405
+ double max_inter1inkage=0;
406
+
407
+ double min_inter1inkage=0;
408
+
409
+
410
+
411
+ CvPoint max_point;
412
+
413
+ CvPoint min_point;
414
+
415
+ CvPoint corner_point;
416
+
417
+
418
+
419
+ int counter = 0;
420
+
421
+ char str[32];
422
+
423
+
424
+
425
+
426
+
427
+ //カメラを初期化する
428
+
429
+ if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL )
430
+
431
+ {
432
+
433
+ //カメラが見つからなかった場合
434
+
435
+ printf( "カメラが見つかりません\n" );
436
+
437
+ return -1;
438
+
439
+ }
440
+
441
+
442
+
443
+
444
+
445
+ //Windowの生成
446
+
447
+ cvNamedWindow("Show", CV_WINDOW_AUTOSIZE);
448
+
449
+
450
+
451
+ //カメラ・デバイスから画像を取得
452
+
453
+ //frameImage=cvQueryFrame(capture);
454
+
455
+
456
+
457
+ //テンプレート・マッチングに用いる相関値データを格納する画像の領域確保
458
+
459
+ //グレー・スケール画像用に領域確保
460
+
461
+ grey=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
462
+
463
+ dst =cvCreateImage(cvSize(img->width-temp->width+1,img->height-temp->height+1),IPL_DEPTH_32F,1);
464
+
465
+
466
+
467
+ //メインループ
468
+
469
+ while ( 1 )
470
+
471
+ {
472
+
473
+ //カメラからの入力画像1フレームをframeImageに格納する
474
+
475
+ frameImage = cvQueryFrame( capture );
476
+
477
+
478
+
479
+ //画像を表示する
480
+
481
+ cvShowImage( windowNameCapture, frameImage );
482
+
483
+
484
+
485
+ //'q'キーが入力されたらループを抜ける
486
+
487
+ key = cvWaitKey( 1 );
488
+
489
+
490
+
491
+ if ( key == 'q' )
492
+
493
+ {
494
+
495
+ break;
496
+
497
+ }
498
+
499
+ else if( key == 'c')
500
+
501
+ {
502
+
503
+ int64 start = cv::getTickCount();//所要時間計測
504
+
505
+
506
+
507
+ sprintf_s(str, "sign.bmp", counter++);
508
+
509
+ cvSaveImage(str, frameImage );
510
+
511
+
512
+
513
+
514
+
515
+ //--------原画像を読み込む---------
516
+
517
+ img=cvLoadImage("sign.png",0);
518
+
519
+ //namedWindow("原画像");
520
+
521
+ //imshow("原画像", src_image);
522
+
523
+
524
+
525
+ //---------テンプレート画像を読み込む-------
526
+
527
+ temp=cvLoadImage("temp.png",0);
528
+
529
+ //temp=cvLoadImage("temp2.png",0);
530
+
531
+ //temp=cvLoadImage("temp3.png",0);
532
+
533
+ //temp=cvLoadImage("temp7.png",0);
534
+
535
+ //temp=cvLoadImage("temp8.png",0);
536
+
537
+
538
+
539
+ //グレー・スケールに変換して格納
540
+
541
+ cvCvtColor(img,grey,CV_BGR2GRAY);
542
+
543
+
544
+
545
+ //-------テンプレートマッチングを取る-----
546
+
547
+ grey=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
548
+
549
+ dst =cvCreateImage(cvSize(img->width-temp->width+1,img->height-temp->height+1),IPL_DEPTH_32F,1);
550
+
551
+ cvMatchTemplate(img,temp,dst,CV_TM_CCOEFF_NORMED);
552
+
553
+
554
+
555
+ //-----------マッチング点を求める---------
556
+
557
+ cvMinMaxLoc(dst,&min_inter1inkage,&max_inter1inkage,
558
+
559
+ &min_point,&max_point,NULL);
560
+
561
+
562
+
563
+ //------マッチングを表示する-----
564
+
565
+ //相関値0.75以下ならばLostを表示して次に行く
566
+
567
+
568
+
569
+ if(max_inter1inkage>0.75)
570
+
571
+ {
572
+
573
+ //座標を見やすく代入(直接代入でもよい)
574
+
575
+ corner_point=cvPoint(max_point.x+temp->width,
576
+
577
+ max_point.y+temp->height);
578
+
579
+
580
+
581
+ //マッチング箇所を四角で描画
582
+
583
+ cvRectangle(img,max_point,corner_point,CV_RGB(255,0,0),2);
584
+
585
+ printf("Detection\n");
586
+
587
+ }
588
+
589
+
590
+
591
+ else
592
+
593
+ {
594
+
595
+ printf("Lost\n");
596
+
597
+ }
598
+
599
+
600
+
601
+ int64 end = cv::getTickCount();
602
+
603
+ double elapsedMsec = ( end - start )*1000/cv::getTickFrequency();
604
+
605
+
606
+
607
+ std::cout << elapsedMsec <<"ms" <<std::endl;
608
+
609
+ }
610
+
611
+ }
612
+
613
+
614
+
615
+ //メモリ開放
616
+
617
+ cvReleaseCapture(&capture);
618
+
619
+ cvDestroyWindow("windowNameCapture");
620
+
621
+ return 0;
622
+
623
+
624
+
625
+ }
626
+
627
+ コード
628
+
629
+ ```

1

所要時間は解決しました!

2016/06/23 06:33

投稿

yamata
yamata

スコア36

test CHANGED
@@ -1 +1 @@
1
- opencvを利用したテンプレートマッチング
1
+ opencvを利用した複数枚のテンプレートマッチング
test CHANGED
@@ -12,9 +12,9 @@
12
12
 
13
13
  ・1つの写真に対して、5枚くらいのテンプレートあてはめてマッチングを行いたい
14
14
 
15
- ・写真を撮ってから、マッチングまでの時間を計測したい
15
+ ・写真を撮ってから、マッチングまでの時間を計測したい→解決しました!
16
-
16
+
17
- 3点があります。
17
+ 2点があります。
18
18
 
19
19
 
20
20