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

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

ただいまの
回答率

89.13%

opencvのエラー解決2

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,446

yamata

score 36

お世話になっております。何回も申し訳ありません。
エラーの解決方法が分からないため、質問させていただきます。

以下のプログラムを実行したところ、以下の画像のエラーが出ます。
以前は,
imgをカラーで読み込みグレースケールに変換し行っていました。その時はエラーがでませんでした。
しかし、都合上、imgをグレースケールで読み込む必要があり、(背景処理画像がグレースケール)変更を行ったところ、エラー画でました。

解決方法を教えていただけたらと思います。よろしくお願い致します。

動作環境は、opencv2.4.9です。

イメージ説明

#define LINE_THICKNESS    1  
#define LINE_TYPE    8  
#define SHIFT    0  
#define SCALE_X (float)0.2
#define SCALE_Y (float)0.2 
#define SCALE_XX 4.0  
#define SCALE_YY 10.0  
int main( int argc , char** argv)  
{  
    IplImage * temp_up = NULL;  
    IplImage * temp_side = NULL;  
    IplImage * dst1 = NULL;  
    IplImage * dst2 = NULL;  
    IplImage * scale_img = NULL;    
    IplImage * grey_img1 = NULL;  
    IplImage * grey_img2 = NULL;  

    IplImage * grey_temp_up = NULL;  
    IplImage * grey_temp_side = NULL;  

    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);  

    int64 start = cv::getTickCount();//所要時間計測      

//------------------------原画像読み込み-------------------------------  
    //IplImage * img= cvLoadImage("C:\\opencv_ICImage\\2016-11-8黒ネジ10本40fps\\Image0090.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); 
    IplImage * img= cvLoadImage("背景処理.bmp",CV_LOAD_IMAGE_GRAYSCALE );
//--------------------------------------------------------------------------  

//変換画像用IplImage  
    scale_img=cvCreateImage(cvSize((int)((float)img->width*(float)SCALE_X), (int)((float)img->height*(float)SCALE_Y)), IPL_DEPTH_8U, 1);  
//変換  
    cvResize(img, scale_img, CV_INTER_LINEAR);  

    printf("No float %d\n",img->width);
    printf("Float %d\n",(int)((float)img->width*SCALE_X));
    printf("SCALE_X %f\n",(float)SCALE_X);

//原画像コピー  
    grey_img1=cvCloneImage(scale_img);  
    grey_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(grey_img1,rect1);  

    CvRect rect2;  
    rect2.x = 185;  
    rect2.y = 70;  
    rect2.width = 55;  
    rect2.height =65;  
    cvSetImageROI(grey_img2,rect2);//左上、幅、高さ  
//----------------------------------------------------  
    //cvSaveImage("copy_img1.bmp",copy_img1);

//入力画像表示  
    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);    //テンプレートマッチング  

    printf("dst1.x_%d\n",dst1->width);
    printf("dts1.y_%d\n",dst1->height);


    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);  

     printf("上 %f %f\n",(double)max_point1.x,(double)max_point1.y);
     printf("鏡 %f %f\n",(double)max_point2.x,(double)max_point2.y);

//マッチング箇所を四角で描画  
    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; 
    std::cout << std::endl; 
    cvWaitKey(0);  


//メモリ解放  
    cvReleaseImage(&img);  
    cvReleaseImage(&scale_img);  
    cvReleaseImage(&copy_img1);  
    cvReleaseImage(&copy_img2);  
    cvReleaseImage(&grey_img1);  
    cvReleaseImage(&grey_img2);  
    cvReleaseImage(&dst1);  
    cvReleaseImage(&dst2);  
    cvDestroyWindow("result");  


//メモリ解放  
    cvReleaseImage(&temp_up);  
    cvReleaseImage(&temp_side);  
    cvReleaseImage(&grey_temp_up);  
    cvReleaseImage(&grey_temp_side);  


    cvDestroyWindow("img_window");  
    return 0;  
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

こんにちは。

とりあえず、cvSetImageROI()をコメントアウトしてみてはどうでしょうか?
その結果、同じassertionが発生するなら、結果画像サイズを間違っていることは間違いないです。何かミスがないかよ~~~く探してみましょう。

逆に、同じassertionが発生しなくなったらROIが有効です。その場合、結果エリアのサイズは(当たり前ですが)「ROIサイズ - テンプレートサイズ+1」になりますね。現在は結果画像サイズ計算にROIサイズは考慮されていないようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/17 18:55

    epistemeさん。今までの質問の履歴から判断されてください。でも何か気になる、育てたくなる質問者さんですので。暖かい目で。(おそらく会社命令での学習。ネジ屋さんも大変なのでしょう)

    キャンセル

  • 2016/11/17 18:59

    yamataさん逆ですよ。これだけの方が答えなくて良いのに英知を差し出したのですから。参考書や参考のサイト以上にあなたの課題に本気で答えられたのですから。過去からの私のコメントに従ってのデバッグプリントなどを見るとうれしく思います。頑張りましょう。

    キャンセル

  • 2016/11/17 19:12

    みなさん親切にありがとうございます。
    私自身ももっと勉強したいと思います。

    キャンセル

0

assertionメッセージそのまんまじゃないですか?
"マッチ結果を納める領域の幅/高もしくは型が合ってない"って言うてますけど。
imageの幅/高, templateの幅/高, 型 を確認しました?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/17 14:13

    ありがとうございます。確認済みです。

    キャンセル

  • 2016/11/17 14:15 編集

    だったらそんなassertion出るはずないやん。
    結果領域の幅/高/型との整合取れてますか? 確認ってそーゆーことよ?

    キャンセル

  • 2016/11/17 14:20

    申し訳ありません。幅と高さの確認はしましたあ、型の確認をしていませんでした。
    方の確認はどのようにしたらいいのでしょうか?

    キャンセル

0

OpenCVも、呼出元のどの行でアサートしたかも分かりませんが、cvSetImageROIで指定した幅と高さを与えよとの回答あります。
http://stackoverflow.com/questions/6083625/cvmatchtemplate-function-giving-assertion-failed-error-opencv

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/17 17:37

    念のため、以下のように一時変数を用いたtype()の結果はいくつになるでしょうか?
    cv::Mat tmp( dst1); printf( "%d\n", tmp.type());
    結果が「5」=CV_32Fならtypeは問題なし(→サイズに問題あり)。
    「8」=depthと同じなら、型が異なるのが原因です。この場合の解決法は私には分かりません。

    別回答の流れから推測すると、サイズの問題も捨てきれないと思います。

    キャンセル

  • 2016/11/17 18:01

    0が表示されました。

    キャンセル

  • 2016/11/17 19:03

    ではまだassert発生するはずですが、おかしいですよね?
    とはいえ、解決おめでとうございます。
    できれば、なぜassert発生しないのかの原因まで追究しておいたほうが今後のためによいかと思います。

    キャンセル

0

グレースケールなのに’
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);    //領域確保  
’でIPL_DEPTH_32Fで領域確保しているのが問題では?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/17 14:51

    いや、cvMatchTemplateの結果はfloat行列なんじゃね? IPL_DEPTH_32F でよくね?

    キャンセル

  • 2016/11/17 15:07

    私もそのように考えて、IPL_DEPTH_32Fを使用しています。

    キャンセル

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

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る