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

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

ただいまの
回答率

90.86%

  • C#

    5978questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C++

    3012questions

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

  • OpenCV

    867questions

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

opencvでエラー

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 386

yamata

score 28

oepncvで、テンプレートマッチングをしています。

http://www.cellstat.net/rotatematch/
上のサイトを参考にしているのですが、エラーが出てきました。

やりたいことは、引用サイトと同様に、ワークを回転させて何度傾いているか判断したいです。
また、引用サイトと異なり、長い長方形を回転させるのではなく、50*97の長方形を回転させたいと考えています。

エラー内容は、写真の様になっています。
イメージ説明

よろしくお願い致します。

using namespace cv;
using namespace std;

//RANE_WIDTHは各レーンの幅を表します.
#define RANE_WIDTH 50


int main()
{

Mat tmpl=imread("temp_up.bmp");
Mat screws=imread("result_0381.bmp");

double maxVal=0;

//3本のレーンがあるので3回、iでループを回しています.
    int roi_x=215; 

    //各レーンの位置を決めます. レーンを矩形とした時の左上の点のx座標をここで指定します.
    //レーンを切り出す処理です. Rectは切り出す位置のx座標、y座標、幅、高さを順に引数に取ります. 
    //screws.rowsと書くことでscrew[Mat型]の高さを取得できます. 
    Rect roi_rect = Rect(roi_x,53,50,97); 
    Mat single_screw(screws.clone(),roi_rect);

    //実際の切り出し処理の部分 
    rectangle(screws, roi_rect, Scalar(0,0,255), 1);

    //レーンの領域に矩形を描画(赤) 
    //これから回転させるので、回転しても、はみ出ないように広いMatの中央に切り出したレーン画像をコピーする. 
    Mat single_screw_large = Mat::zeros(screws.rows, screws.rows, CV_8UC3);

    //空のMatを用意する. 縦横ともに、レーンの高さと同じ. 
    Rect copy_rect = Rect(215,53,RANE_WIDTH,97);

    //コピー先のROIの指定 
    single_screw.copyTo(single_screw_large(copy_rect));

    //コピー処理 
    imshow("single_screw_large", single_screw_large);

    //切り出した回転前のレーンを表示 
    //1度ずつ回転させるときに、どの角度で最もマッチしたかを保持するための変数 
    int max_angle=-1; 
    double maxVal_global=-1; 

    //テンプレートマッチング 
    for(int angle=-180;angle<180;angle+=1)
    { 
        Mat rot_single_screw; 
        float scale = 1.0; 

        // 中心:画像中心 
        cv::Point2f center(single_screw_large.cols*0.5, single_screw_large.rows*0.5);

        // 2次元の回転行列を計算 
        const cv::Mat affine_matrix = cv::getRotationMatrix2D( center, angle, scale );
        warpAffine(single_screw_large, rot_single_screw, affine_matrix, single_screw_large.size()); 
        Mat result_img;
        matchTemplate(rot_single_screw,tmpl,result_img, CV_TM_CCOEFF_NORMED); 
        Point max_pt; 

        minMaxLoc(result_img, NULL, &maxVal, NULL, &max_pt);

        //マッチした場所に矩形を描画 
        Rect roi_rect2(0, 0, tmpl.cols, tmpl.rows);
        roi_rect2.x = max_pt.x; 
        roi_rect2.y = max_pt.y;
        rectangle(rot_single_screw, roi_rect2, Scalar(0,0,255*maxVal), 1);
        imshow("rot_single_screw", rot_single_screw);
        imshow("result_img", result_img);

        if(maxVal>maxVal_global)
        {
            maxVal_global=maxVal; 
            max_angle=angle;
        }
        waitKey(1);
    }
    printf("角度=%lf\n",maxVal);
    return 0; 
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

0

エラー内容はAssertエラーでmatrix.cppの323行目で条件に合致しないので実行時エラーになったという内容ですね。
matrix.cppの323行目にブレークポイントをつけてデバッグすれば、どの条件でエラーになったかわかるはずです。
また、どこから呼び出されたかもわかるはずなのでそうやって調べていけばわかるかと。
(私自身はopenCVはやってないので、matrix.cppの323行目がどういう関数なのかわからないのでこれ以上はコメントできません。すいません)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/05 20:00

    ありがとうございます。
    今回のプログラムは、323行目まで達していないプログラムになっています。

    キャンセル

  • 2017/01/06 17:05

    ん?自分が作ったソースコードではなくてopenCVのコアのソースであるmatrix.cppの323行目です。

    キャンセル

0

ROIがMatをはみ出してるようです。
参考にしたサイトとは画像のサイズが違うと思われますので実際に値を入れている部分を書き換える必要が有ります。
どのような画像サイズかわからないのでなんとも言えませんが

#define RANE_WIDTH 50
Rect copy_rect = Rect(215,53,RANE_WIDTH,97);


これあたりが原因かと

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/06 12:28

    画像サイズが720*480になっていて、
    その画像の(215,53)の位置に50*97の四角形を回転させたいと思います。

    Rect copy_rect = Rect(215,53,RANE_WIDTH,97);
    上の値は、画像サイズにする必要があるのでしょうか?

    キャンセル

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

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

関連した質問

  • 解決済

    python,opencvで円弧型の部分にのみ処理をしたい

    Python,OpenCVともに使うのが初めてです。 現在、類似画像検索のようなものを作っています。 そこで、画像の一部(円弧型)にある処理(ただ白いpixelを数えるだけ)を

  • 解決済

    opencvでの画像の回転

    opencvを用いて読み込んだ画像の回転を行っています。 以下のプログラムで画像の回転を行い実行できたのですが、 画像が回転し、元の画像の場所が黒く表示されるのが気に入りません

  • 解決済

    Bitmap/ImageをSystem.Windows.Interop.InteropBitmapに...

    こんにちは。  Windows10でWPFのアプリケーションを開発しています。  Visual Studio 2015 Communityを使っています。  前提・実現し

  • 解決済

    opencvで画像のある行の全ピクセルを取得し、貼り付けたい

    opencvで画像の一行分(800×800ピクセルの画像なら、ある行にあるピクセルすべて(800個))をトリミングし、新たな画面に張り付けたいです。 以下のようにやりましたが、う

  • 解決済

    OpenCVのソースコードについての質問

    AndroidstudioでOpenCVを使いテンプレートマッチングを行いたいと考えています。サンプルが無いかと探した所下記のコードを発見しました。 inFIleはマッチングする

  • 受付中

    テンプレートマッチング時のエラーについて教えてくださいm(__)m

    以前質問をし、エラーが解決しましたがうまくテンプレートマッチングが行えません。 デバックでみたところ49行目の"Point matchLoc;"で✖がついてしまいます・・・ 原

  • 解決済

    OpenCvSharp3で重心を求めたいです

    以下のように、ラベリングを実行するプログラムはできたのですが、ここから重心の座標や面積を求めるプログラムを作成したいです。どなたか、教えていただけますか? 最終的な目標としては

  • 解決済

    OpenCVを使った笑顔検出での問題

    前提・実現したいこと OpenCVで元からあるサンプルコード「smiledetect.cpp」を用いて笑顔検出のシステムを作っています。 検出機能を実装中に以下の問題が発生しました

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

  • C#

    5978questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C++

    3012questions

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

  • OpenCV

    867questions

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