質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3492閲覧

テンプレートマッチングでの最大値の座標

yamata

総合スコア36

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/11/11 03:48

編集2016/11/14 07:54

opencvでテンプレートマッチングを行っています。
以下の流れで、マッチング箇所を囲っているのですが、
最大値の座標が分からないため、cvrectangle内の+
temp_up->widthの値を5などに変更して、最大値の座標がどこらへんにあるのか確認しようとしました。
しかし、すべての画像で同じ場所を囲ってしまい、最大値の座標を確認できません。
最大値の座標を囲む方法はないのでしょうか?
よろしくお願いします。

int main( int argc , char** argv)
{
int counter = 0;
char str[64];
#define LINE_THICKNESS 1
#define LINE_TYPE 8
#define SHIFT 0
#define SCALE_X 0.2
#define SCALE_Y 0.2
#define SCALE_XX 5.0
#define SCALE_YY 5.0
IplImage * temp_up = NULL;
IplImage * temp_side = NULL;
IplImage * dst1 = NULL;
IplImage * dst2 = NULL;
IplImage * img = NULL;
IplImage * scale_img = NULL;
IplImage * copy_img1 = NULL;
IplImage * copy_img2 = NULL;
IplImage * grey_img1 = NULL;
IplImage * grey_img2 = NULL;

IplImage * grey_temp_up = NULL; IplImage * grey_temp_side = NULL; FILE *file; file=fopen("result.csv","w"); double max_inter1inkage=0; double min_inter1inkage=0; double max_inter2inkage=0; double min_inter2inkage=0; CvPoint max_point1; CvPoint min_point1; CvPoint max_point2; CvPoint min_point2; //---------テンプレート画像を読み込む------- temp_up=cvLoadImage("temp_up.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み temp_side=cvLoadImage("temp_side.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み grey_temp_up=cvCreateImage(cvGetSize(temp_up),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) grey_temp_side=cvCreateImage(cvGetSize(temp_side),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) cvCvtColor(temp_up,grey_temp_up,CV_BGR2GRAY); cvCvtColor(temp_side,grey_temp_side,CV_BGR2GRAY); //for ( int number =83; number<202;++number) { int64 start = cv::getTickCount();//所要時間計測 //------------------------原画像読み込み------------------------------- IplImage * img= cvLoadImage("C:\\opencv_ICImage\\2016-11-8黒ネジ10本40fps\\Image0105.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //-------------------------------------------------------------------------- //変換画像用IplImage scale_img=cvCreateImage(cvSize((int)(img->width*SCALE_X), (int)(img->height*SCALE_Y)), IPL_DEPTH_8U, 3); //変換 cvResize(img, scale_img, CV_INTER_LINEAR); //原画像コピー copy_img1=cvCloneImage(scale_img); copy_img2=cvCloneImage(scale_img); //赤枠で囲む cvRectangle(scale_img,cvPoint(100,65),cvPoint(155,135),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT); cvRectangle(scale_img,cvPoint(185,70),cvPoint(240,135),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);//左上、右下 //-----------------ROIの設定---------------------- CvRect rect1; rect1.x = 100; rect1.y = 65; rect1.width = 55; rect1.height = 70; cvSetImageROI(copy_img1,rect1); CvRect rect2; rect2.x = 185; rect2.y = 70; rect2.width = 55; rect2.height =65; cvSetImageROI(copy_img2,rect2);//左上、幅、高さ //---------------------------------------------------- //入力画像表示 cvNamedWindow("img_window",CV_WINDOW_AUTOSIZE); cvShowImage("img_window",scale_img); //--------------------------グレースケールの場合---------------------------------------------------------------- //テンプレート・マッチングに用いる相関値データを格納する画像の領域確保 //グレー・スケール画像用に領域確保 grey_img1=cvCreateImage(cvGetSize(copy_img1),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) grey_img2=cvCreateImage(cvGetSize(copy_img2),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) dst1=cvCreateImage(cvSize(abs(grey_img1->width-grey_temp_up->width)+1,abs(grey_img1->height-grey_temp_up->height)+1),IPL_DEPTH_32F,1); //領域確保 dst2=cvCreateImage(cvSize(abs(grey_img2->width-grey_temp_side->width)+1,abs(grey_img2->height-grey_temp_side->height)+1),IPL_DEPTH_32F,1); //領域確保 //グレー・スケールに変換して格納 cvCvtColor(copy_img1,grey_img1,CV_BGR2GRAY); cvCvtColor(copy_img2,grey_img2,CV_BGR2GRAY); cvMatchTemplate(grey_img1,grey_temp_up,dst1,CV_TM_CCOEFF_NORMED); //テンプレートマッチング cvMatchTemplate(grey_img2,grey_temp_side,dst2,CV_TM_CCOEFF_NORMED); //テンプレートマッチング IplImage *dst3=cvCloneImage(dst1); IplImage *dst=cvCreateImage(cvSize((int)(dst3->width*SCALE_XX), (int)(dst3->height*SCALE_YY)), IPL_DEPTH_32F, 1); cvResize(dst3, dst, CV_INTER_LINEAR); cvNamedWindow("dst_window",CV_WINDOW_AUTOSIZE); cvShowImage("dst_window",dst); //------------------------------------------------------------------------------------------------------------- //-----------マッチング点を求める--------- cvMinMaxLoc(dst1,&min_inter1inkage,&max_inter1inkage,&min_point1,&max_point1,NULL); cvMinMaxLoc(dst2,&min_inter2inkage,&max_inter2inkage,&min_point2,&max_point2,NULL); //------マッチングを表示する----- //相関値0.75以下ならばLostを表示して次に行く //if(max_inter1inkage>0.01&& max_inter2inkage>0.01) { //マッチング箇所を四角で描画 cvRectangle(scale_img,cvPoint(max_point1.x+rect1.x,max_point1.y+rect1.y),cvPoint(max_point1.x+rect1.x+temp_up->width,max_point1.y+rect1.y+temp_up->height),CV_RGB(255,0,0),3); cvRectangle(scale_img,cvPoint(max_point2.x+rect2.x,max_point2.y+rect2.y),cvPoint(max_point2.x+rect2.x+temp_side->width,max_point2.y+rect2.y+temp_side->height),CV_RGB(0,255,255),3); cvCircle(scale_img,cvPoint(max_point1.x+rect1.x,max_point1.y+rect1.y),10,CV_RGB(0,255,255),5,3,0); //画像を表示 cvNamedWindow("result",CV_WINDOW_AUTOSIZE); cvShowImage("result",scale_img); //類似度表示 printf("up_Detection %lf\n",max_inter1inkage); printf("side_Detection %lf\n",max_inter2inkage); } //タイマー終了 int64 end = cv::getTickCount(); double elapsedMsec = ( end - start )*1000/cv::getTickFrequency(); //タイマー表示 std::cout << elapsedMsec <<"ms" <<std::endl; printf("\n"); cvWaitKey(0); fprintf(file,"%f,%f,%f\n",max_inter1inkage,max_inter2inkage,elapsedMsec); //メモリ解放 cvReleaseImage(&img); cvReleaseImage(&scale_img); cvReleaseImage(&copy_img1); cvReleaseImage(&copy_img2); cvReleaseImage(&grey_img1); cvReleaseImage(&grey_img2); cvReleaseImage(&dst1); cvReleaseImage(&dst2); cvDestroyWindow("result"); } fclose(file); //メモリ解放 cvReleaseImage(&temp_up); cvReleaseImage(&temp_side); cvReleaseImage(&grey_temp_up); cvReleaseImage(&grey_temp_side); //メモリ開放 cvDestroyWindow("img_window"); //cvDestroyWindow("copy_img1_window"); //cvDestroyWindow("copy_img2_window"); //cvDestroyWindow("temp_up_window"); //cvDestroyWindow("temp_side_window"); //cvDestroyWindow("grey_temp_up_window"); //cvDestroyWindow("grey_temp_side_window"); //cvDestroyWindow("grey_img1_window"); //cvDestroyWindow("grey_img2_window"); return 0;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ソースを整理するために、新しい回答欄を使います。(前の回答の流れが分からなくなりそうだったので)

c++

1#define LINE_THICKNESS 1 2#define LINE_TYPE 8 3#define SHIFT 0 4#define SCALE_X 0.2 5#define SCALE_Y 0.2 6#define SCALE_XX 5.0 7#define SCALE_YY 5.0 8int main( int argc , char** argv) 9{ 10 int counter = 0; // どこにも使ってない、なんかのカウンター 11 char str[64]; // どこにも使ってない、なんかの配列 12 13 IplImage * temp_up = NULL; 14 IplImage * temp_side = NULL; 15 IplImage * dst1 = NULL; 16 IplImage * dst2 = NULL; 17 IplImage * img = NULL; 18 IplImage * scale_img = NULL; 19 IplImage * copy_img1 = NULL; 20 IplImage * copy_img2 = NULL; 21 IplImage * grey_img1 = NULL; 22 IplImage * grey_img2 = NULL; 23 24 IplImage * grey_temp_up = NULL; 25 IplImage * grey_temp_side = NULL; 26 27 FILE *file; 28 file=fopen("result.csv","w"); 29 30 double max_inter1inkage=0; 31 double min_inter1inkage=0; 32 double max_inter2inkage=0; 33 double min_inter2inkage=0; 34 35 CvPoint max_point1; 36 CvPoint min_point1; 37 CvPoint max_point2; 38 CvPoint min_point2; 39 40 41//---------テンプレート画像を読み込む------- 42 temp_up=cvLoadImage("temp_up.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み 43 temp_side=cvLoadImage("temp_side.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み 44 grey_temp_up=cvCreateImage(cvGetSize(temp_up),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) 45 grey_temp_side=cvCreateImage(cvGetSize(temp_side),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) 46 47 cvCvtColor(temp_up,grey_temp_up,CV_BGR2GRAY); 48 cvCvtColor(temp_side,grey_temp_side,CV_BGR2GRAY); 49 50 51 52 53//for ( int number =83; number<202;++number) 54//{ ??? 55 int64 start = cv::getTickCount();//所要時間計測 56 57//------------------------原画像読み込み------------------------------- 58 IplImage * img= cvLoadImage("C:\\opencv_ICImage\\2016-11-8黒ネジ10本40fps\\Image0105.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); 59//-------------------------------------------------------------------------- 60 61//変換画像用IplImage 62 scale_img=cvCreateImage(cvSize((int)(img->width*SCALE_X), (int)(img->height*SCALE_Y)), IPL_DEPTH_8U, 3); 63//変換 64 cvResize(img, scale_img, CV_INTER_LINEAR); 65 66//原画像コピー 67 copy_img1=cvCloneImage(scale_img); 68 copy_img2=cvCloneImage(scale_img); 69 70//赤枠で囲む 71 cvRectangle(scale_img,cvPoint(100,65),cvPoint(155,135),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT); 72 cvRectangle(scale_img,cvPoint(185,70),cvPoint(240,135),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);//左上、右下 73 74//-----------------ROIの設定---------------------- 75 CvRect rect1; 76 rect1.x = 100; 77 rect1.y = 65; 78 rect1.width = 55; 79 rect1.height = 70; 80 cvSetImageROI(copy_img1,rect1); 81 82 CvRect rect2; 83 rect2.x = 185; 84 rect2.y = 70; 85 rect2.width = 55; 86 rect2.height =65; 87 cvSetImageROI(copy_img2,rect2);//左上、幅、高さ 88//---------------------------------------------------- 89 90//入力画像表示 91 cvNamedWindow("img_window",CV_WINDOW_AUTOSIZE); 92 cvShowImage("img_window",scale_img); 93 94//--------------------------グレースケールの場合---------------------------------------------------------------- 95//テンプレート・マッチングに用いる相関値データを格納する画像の領域確保 96//グレー・スケール画像用に領域確保 97 grey_img1=cvCreateImage(cvGetSize(copy_img1),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) 98 grey_img2=cvCreateImage(cvGetSize(copy_img2),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) 99 100 dst1=cvCreateImage(cvSize(abs(grey_img1->width-grey_temp_up->width)+1,abs(grey_img1->height-grey_temp_up->height)+1),IPL_DEPTH_32F,1); //領域確保 101 dst2=cvCreateImage(cvSize(abs(grey_img2->width-grey_temp_side->width)+1,abs(grey_img2->height-grey_temp_side->height)+1),IPL_DEPTH_32F,1); //領域確保 102 103//グレー・スケールに変換して格納 104 cvCvtColor(copy_img1,grey_img1,CV_BGR2GRAY); 105 cvCvtColor(copy_img2,grey_img2,CV_BGR2GRAY); 106 107 cvMatchTemplate(grey_img1,grey_temp_up,dst1,CV_TM_CCOEFF_NORMED); //テンプレートマッチング 108 cvMatchTemplate(grey_img2,grey_temp_side,dst2,CV_TM_CCOEFF_NORMED); //テンプレートマッチング 109 110 IplImage *dst3=cvCloneImage(dst1); 111 IplImage *dst=cvCreateImage(cvSize((int)(dst3->width*SCALE_XX), (int)(dst3->height*SCALE_YY)), IPL_DEPTH_32F, 1); 112 cvResize(dst3, dst, CV_INTER_LINEAR); 113 114 cvNamedWindow("dst_window",CV_WINDOW_AUTOSIZE); 115 cvShowImage("dst_window",dst); 116 117//------------------------------------------------------------------------------------------------------------- 118 119//-----------マッチング点を求める--------- 120 cvMinMaxLoc(dst1,&min_inter1inkage,&max_inter1inkage,&min_point1,&max_point1,NULL); 121 cvMinMaxLoc(dst2,&min_inter2inkage,&max_inter2inkage,&min_point2,&max_point2,NULL); 122 123//------マッチングを表示する----- 124//相関値0.75以下ならばLostを表示して次に行く 125 126//if(max_inter1inkage>0.01&& max_inter2inkage>0.01) 127{ 128//マッチング箇所を四角で描画 129 cvRectangle(scale_img,cvPoint(max_point1.x+rect1.x,max_point1.y+rect1.y),cvPoint(max_point1.x+rect1.x+temp_up->width,max_point1.y+rect1.y+temp_up->height),CV_RGB(255,0,0),3); 130 cvRectangle(scale_img,cvPoint(max_point2.x+rect2.x,max_point2.y+rect2.y),cvPoint(max_point2.x+rect2.x+temp_side->width,max_point2.y+rect2.y+temp_side->height),CV_RGB(0,255,255),3); 131 cvCircle(scale_img,cvPoint(max_point1.x+rect1.x,max_point1.y+rect1.y),10,CV_RGB(0,255,255),5,3,0); 132 133//画像を表示 134 cvNamedWindow("result",CV_WINDOW_AUTOSIZE); 135 cvShowImage("result",scale_img); 136 137//類似度表示 138 printf("up_Detection %lf\n",max_inter1inkage); 139 printf("side_Detection %lf\n",max_inter2inkage); 140 141} 142 143//タイマー終了 144 int64 end = cv::getTickCount(); 145 double elapsedMsec = ( end - start )*1000/cv::getTickFrequency(); 146 147//タイマー表示 148 std::cout << elapsedMsec <<"ms" <<std::endl; 149 std::cout << std::endl; 150 151 cvWaitKey(0); 152 153 fprintf(file,"%f,%f,%f\n",max_inter1inkage,max_inter2inkage,elapsedMsec); 154 155//メモリ解放 156 cvReleaseImage(&img); 157 cvReleaseImage(&scale_img); 158 cvReleaseImage(&copy_img1); 159 cvReleaseImage(&copy_img2); 160 cvReleaseImage(&grey_img1); 161 cvReleaseImage(&grey_img2); 162 cvReleaseImage(&dst1); 163 cvReleaseImage(&dst2); 164 cvDestroyWindow("result"); 165 166 } 167 fclose(file); 168 169//メモリ解放 170 cvReleaseImage(&temp_up); 171 cvReleaseImage(&temp_side); 172 cvReleaseImage(&grey_temp_up); 173 cvReleaseImage(&grey_temp_side); 174 175 176 cvDestroyWindow("img_window"); 177 return 0; 178}

さて、途中に’本当に’って’{’や’}’があったが。これを添削してみよう。

投稿2016/11/14 08:19

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamata

2016/11/14 08:31

丁寧にありがとうございます。 添削をしてみました。 見やすくありがとうございます
MasahikoHirata

2016/11/14 08:31

まず、’scale_img=cvCreateImage(cvSize((int)(img->width*SCALE_X), (int)(img->height*SCALE_Y)), IPL_DEPTH_8U, 3); ’の’img->width*SCALE_X’と’img->height*SCALE_Y’ここ。本文中では気が付かないのだが、’(float)img->height*SCALE_Y)'と’(float)’img->height*SCALE_Y)'に書き換えてみて。(int型)*(float)’ではなくて'(float)*(float)'に。
MasahikoHirata

2016/11/14 08:36

今、自分の環境で同じように"#define hogehoge 0.2'として(int型)の変数に同様の式を与えて確認したけど結果はどんな数字でも'0'に。まずここですね。
yamata

2016/11/14 08:42

’scale_img=cvCreateImage(cvSize((float)(img->width*SCALE_X), (float)(img->height*SCALE_Y)), IPL_DEPTH_8U, 3); ’ 以上ということでしょうか?
MasahikoHirata

2016/11/14 08:52

違います。まず'img->width’と’img->height'を(float)に一時的に変換しないと。だから'scale_img=cvCreateImage(cvSize((int)((float)img->width*SCALE_X), (int)((float)img->height*SCALE_Y)), IPL_DEPTH_8U, 3); ’です。やれやれ。実験的にご自分でも、printf("No float %d\n",img->width*SCALE_X);'と’prinft("Float %d\n",(float)img->width*SCALE_X);を直近の部分にでも入れて試してみてください。これがデバッグプリント(古典的だけど)
MasahikoHirata

2016/11/14 08:55

今までの流れでdstをimshowしたら小さすぎるって所でピンときた。
yamata

2016/11/14 08:58

両者ともに0がひょうじされました。
yamata

2016/11/14 09:03

No float 1280 float 0 になりました。
MasahikoHirata

2016/11/14 09:05

ついでに'printf("SCALE_X %d\n",SCALE_X);’も。
MasahikoHirata

2016/11/14 09:08

??img-widthは6400?どんなカメラで撮影?
MasahikoHirata

2016/11/14 09:10

訂正:ついでに'printf("SCALE_X %d\n",SCALE_X);’も。⇒’ついでに'printf("SCALE_X %f\n",SCALE_X);’も。
yamata

2016/11/14 09:10

-178955798といったような数字が表示されました。
yamata

2016/11/14 09:10

1280です。産業用USB3.0カメラになります。
MasahikoHirata

2016/11/14 09:14

ならば’1280*0.2=256’が必要とする数字になるから、これになるようにするには(float)1280*(float)SCALE_Xになるように指示するわけで。しかし(float)1280*SCALE_X=0になるにはSCALE_Xが0という事になる上記のfloat 0では。
MasahikoHirata

2016/11/14 09:16

念のため'#define SCALE_X 0.2F’と’#define SCALE_Y 0.2F'(明確にfloatと宣言)して再度確認。
MasahikoHirata

2016/11/14 13:15

仕事の合間に、自分の持っているデータで貴殿のソースを基に再現をしていますが、やはり指摘している部分(しかし貴殿の結果とは違う)のでOpenCVのバージョンの違いと記載の方法方法?と考えて検証していますが。不思議です。
MasahikoHirata

2016/11/15 01:10

回答を見直してミスに気が付きました。’printf("No float %d\n",img->width*SCALE_X);'と’prinft("Float %d\n",(float)img->width*SCALE_X);’の所で’prinft("Float %d\n",(int)((float)img->width*SCALE_X));’で確認を。
yamata

2016/11/15 02:51

ありがとうございます。 へんこうしてみたのですが、SCALE_Xが-1610612736という値を取ります。 NOfloat,floatはともに1280をとります。
MasahikoHirata

2016/11/15 03:01 編集

'printf("SCALE_X %f\n",SCALE_X);’⇒’printf("SCALE_X %f\n",(float)SCALE_X);'は?’%f’ですよ。
yamata

2016/11/15 04:54

0.2000と表示するようになりました。
MasahikoHirata

2016/11/15 05:08

となると’#define SCALE_X (float)0.2'と’#define SCALE_Y (float)0.2'としてみましょう。”0.2F"でも明示できそうだけど”
yamata

2016/11/15 05:19

変更してみました。 printf("No float %d\n",img->width); printf("Float %d\n",(int)((float)img->width));ともに1280. SCALEは0.2000と表示されます。
MasahikoHirata

2016/11/15 05:36 編集

確かめるのは’’prinft("Float %d\n",(float)img->width*SCALE_X);’ですよ。resizeにの引数の確認のため。img->widthとSCALE_Xを掛けたものが256にならないと正常に動きませんから。 つまり’#define 'ではSCALE関係の定義には(float)もしくは'F'をつけて、明確にする。int型と小数の計算ではintに(float)をつけて一時的に小数として取り扱う。小数計算の結果をintに渡すときは(int)で変換。C系の基本のcastなのですが。
yamata

2016/11/15 05:36

%dで実行し256が表示されました。
MasahikoHirata

2016/11/15 05:37

修正すべきは’'scale_img=cvCreateImage(cvSize((int)((float)img->width*(float)SCALE_X), (int)((float)img->height*(float)SCALE_Y)), IPL_DEPTH_8U, 3); ’。これで動きが変わるはず。
yamata

2016/11/15 05:45

丁寧にありがとうございます。 申し訳ないのですが、特に動きに変わりはありませんでした。
MasahikoHirata

2016/11/15 05:50

少し前の回答の部分ですが、マッチング結果の表示'dst1'をimshowするといった部分をもう一度行ってみてください。先ほどの修正部分が生きていればdst1のウインドウサイズが正常になっているはずですから。
yamata

2016/11/15 06:02

16*6の大きさのdst1が表示されました。(前回とあまり変化していない?)
MasahikoHirata

2016/11/15 06:05

本来ならば’256*?’ですよね。だからそれに至る部分をチェック。
yamata

2016/11/15 06:13

dstウィンドウは、マッチング領域?なので、256*xにはならないと考えています。 探索領域が55*70になるので、それ以下になるのではないかと考えています。(勘違いだったらすいません)
MasahikoHirata

2016/11/15 07:46

こちらも、貴殿が何をもって正しいと判断されるのかは不明ですので、デバッグの仕方としての意見を。まず今回問題とした(int)と0.2などの小数の処理のゴールは恐らく、’ cvResize(img, scale_img, CV_INTER_LINEAR); ’でscale_imgに読み込んだ映像が正しい縮尺で格納されているか?これは直後にimshowすることで確認できますね。続いて本題のmatchingについて。まず理解しないといけないのが入力と出力。正しい出力を得るには入力を正しくです。従って双方の途中データを確認。これにはprintfなどのデバッグプリントもしくはブレークポイントで止めてのウォッチによる内容確認。これを続けて自己の誤りをつぶしていくっていう繰り返しです。
yamata

2016/11/16 01:59

ありがとうございます。繰り返していきたいと思います。
guest

0

先ずは’MatchTemplate’の結果dst1をそのままimshowしてみて、その輝度でマッチング状態を確認してみてください。
minmaxの結果の前にしておけば、何が問題か可視化できると思います。

投稿2016/11/11 04:00

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamata

2016/11/11 04:10

表示してみたのですが、よくわかりませんでした、、、 最大値の座標を表示、囲むことはできないのでしょうか?
yamata

2016/11/11 04:18

また、囲む枠の左上の座標が最大のマッチング点の座標でいいのでしょうか?
yamata

2016/11/11 04:50

ありがとうございます。こちらのサイトは、私もよく見ています。 最大値の座標を表示しようとしたのですが、 printf("最大値 %lf\n",max_point1); これだと、0しか表示しませんでした。 何が駄目なのでしょうか?
yamata

2016/11/11 04:57

また、dst1を表示したのですが、非常に小さい(見えないくらい)画像しか表示されません。 dst1を以下の様に定義しているのですが、駄目なのでしょうか? dst1=cvCreateImage(cvSize(abs(grey_img1->width-grey_temp_up->width)+1,abs(grey_img1->height-grey_temp_up->height)+1),IPL_DEPTH_32F,1); //領域確保
MasahikoHirata

2016/11/11 06:04

まずパラメーター(例えば’grey_img1->width-grey_temp_up->width’とか)をprintf("%d ",grey_img1->width-grey_temp_up->width);でコンソールに出して観て判断ですね。
yamata

2016/11/11 06:29

15と表示されました。 元画像が256*192、テンプレートが35*61 なのですが、なぜこのような結果になるのでしょうか?
yamata

2016/11/11 06:34

すいません。計算はあっていました。 最大値の座標を表示することはできないのでしょうか?
MasahikoHirata

2016/11/11 06:44

後は’MinMaxLoc’の結果もprintfしますか?
yamata

2016/11/14 03:02

printfしようとしているのですが、max_point1.xを表示できません。
MasahikoHirata

2016/11/14 03:27

であればこの部分にブレークポイントを仕掛けて、止まった時にmax_point1をクイックウォッチで、中に何が入っているかをウォッチのウインドウで確認しましょう。
yamata

2016/11/14 03:42

0しか表示されません。
MasahikoHirata

2016/11/14 03:44

max_point1.xもウォッチするか、ウオッチの中で内部の要素もツリー状に表示できますが、これも’0'ですか?もし'0'ならそれが原因。
yamata

2016/11/14 03:48

最大値のところを座標の中心にはどのように変更したらいいのでしょうか?
yamata

2016/11/14 03:49

やりかたを詳しく教えてはいただけないでしょうか?
MasahikoHirata

2016/11/14 04:11

囲む長方形?の中心から左のオフセット(長方形の横の長さの半分)を引いて(0以下になった場合の処理も必要)、同様に縦のオフセットを引いて(0以下の処理も同様)そしてこの長方形を描画すれば真中が最大値。
yamata

2016/11/14 04:47

例えば、 max_point1.x+rect1.x,max_point1.y+rect1.y この部分からオフセットを引けば真ん中になるということでしょうか?
yamata

2016/11/14 04:49

cvrectangleは一つの頂点と反対側の頂点を決めていると思うのですが、 この関数で中心からの描画が可能なのでしょうか?
MasahikoHirata

2016/11/14 05:20

要は’temp_up->width’と’temp_up->height’が長方形の各辺の長さですから、この半分を左上では引く、右下では足すと真中に最大値になりませんか?
yamata

2016/11/14 05:37

なるほど、そういことですか。 直接的に真ん中に点を表示するなどはできないのでしょうか?
episteme

2016/11/14 05:42

cvCircleでちっちゃい○でも描けば?
MasahikoHirata

2016/11/14 05:45

epistemeさんの通り、cvCircleが一番手っ取り早いですね。またその時の色が明確に分かりやすい色であれば。(私はよく水色を使いますが)
yamata

2016/11/14 05:56

cvCircle(scale_img,cvPoint(max_point1.x+rect1.x,max_point1.y+rect1.y),10,CV_RGB(0,255,255),5,3,0); これを使うと、真ん中ではなく左上に表示されるのですが、、、
episteme

2016/11/14 06:05

rect1.x, rect1.y にはナニが入ってんです? cvPoint(max_point1.x, max_point1.y) でマッチ長方形の左上なら、それぞれに幅/2, 高/2 を加えた位置が中心かと。
MasahikoHirata

2016/11/14 06:05

’rect1.x’と’rect1.y’ってどこから?またどの位の値?
yamata

2016/11/14 06:27

言葉足らずですいません。rect1には、ROIで切り取る際の左上の座標が入っています。
MasahikoHirata

2016/11/14 06:30

cvCircleなら引数のcvPoint(の部分は円の中心ですよ。
MasahikoHirata

2016/11/14 06:31

void cvCircle( CvArr* img, //描写対象の画像 CvPoint center, //円の中心座標 int radius, //円の半径 CvScalar color, //色 int thickness, //線の太さ int line_type, //線の描写法 int shift //座標の小数点以下のビット数 );
episteme

2016/11/14 06:37

...なんでROIを足さなきゃいけないんだ? ROIって”この領域(Region)だけ注目(Interest)してね”ですよね? # cvMatchTemplateにROIなんて食わせたっけ?
yamata

2016/11/14 06:53

ROIの領域にマッチングをしているので必要なのかと考えました。
episteme

2016/11/14 07:01

"考えた"はいいんだが、実際はどうだったんだ、と。 cvPoint(max_point1.x, max_point1.y) の位置に○を描いたらドコに現れましたか? マッチ対象長方形の左上隅?
MasahikoHirata

2016/11/14 07:23

で、結果はどうなりました?デバッグは自分の考え違いを正す行為でもありますし。
yamata

2016/11/14 07:37

左上隅に表示されました。
yamata

2016/11/14 07:39

テンプレート幅と高さの半分も足す必要があるとも思い、それぞれ足したところ、場所が変化するようになりました。 こちらで正しいのでしょうか?
episteme

2016/11/14 07:45

いやそれで正しいか否かはあなたが確認するんでしょうに。 てかmax_pointが左上隅を差してるなら、それに幅/2,高/2を加えたら中心位置になるのは自明でしょ?
yamata

2016/11/14 07:49

最初そのように考えていたのですが、ROIの領域でマッチングした後に、ROIの前の画像で枠を囲もうとすると、ずれが生じるのでrect1を足すことに変更しました。 ありがとうございます
MasahikoHirata

2016/11/14 07:50

ソースが読みにくい(```)で囲んでくれればよいのだが。
MasahikoHirata

2016/11/14 07:51

それに変数名がxx1とかxx2は自分自身が良くても、他人には難解。
MasahikoHirata

2016/11/14 07:51

今、流れで整理してみている。
yamata

2016/11/14 07:55

囲ったつもりが下の'''がなくなっていました。 自分勝手なプログラムで申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問