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

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

ただいまの
回答率

91.36%

  • C++

    2420questions

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

  • OpenCV

    621questions

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

9×9の格子状の網目の作成

受付中

回答 0

投稿 2017/11/27 18:37

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

hoitya

score 2

今、画像にある2点を頂点とした3×3の格子状の網目をつけ、そこに自分が決めた座標を新しく定義して、
網目内にある認識した図形の座標を表示するアプリを作っています。(説明下手ですいません)
開発環境はwindows10,visual studio,OpenCV-3.2.0で言語はC++を使っています。
順序としては自分のイメージでは
1:網目をつける場所をOpenCVで画像のある2点A(x1,y1),B(x2,y2)として認識する

2:Aをy軸方向,Bをx軸方向に伸ばした交点C(x1,y2)とし、線分AC(x2-x1),CB(y2-y1)の長さをそれぞれ3等分するような3×3の格子状の網目を作る

3:チェスや将棋のように格子状の網目に9つの座標(a1,a2,a3,b1,b2.b3,c1,c2,c3のような)を定義する

4:最後にAやBとは別に存在する図形(例えば星などのような)が自身が定義した9つの座標のどの場所にあるかをテキストに表す

流れとしては以上になります。
最終的に4番の行為が行われていればいいので、網目を表示したり交点Cをいちいち求めることは特に必要ないです。

現状では1番まで出来ています。

#include<opencv\opencv.hpp>
#include <iostream>

int
main(int argc, char *argv[])
{
    //CvCapture *capture = cvCreateCameraCapture(0);

    // テンプレート画像
    cv::Mat tmp_imgs[3];
    tmp_imgs[0] = cv::imread("C:\\opencv\\sources\\tenA.jpg", 1);
    tmp_imgs[1] = cv::imread("C:\\opencv\\sources\\tenB.jpg", 1);
    tmp_imgs[2] = cv::imread("C:\\opencv\\sources\\zukei_hosi.jpg", 1);
//C:\\opencv\\sources\\samples\\data\\koma4\\

    // 枠線の色
    cv::Scalar cols[3];
    cols[0] = cv::Scalar(255, 255, 255);
    cols[1] = cv::Scalar(0, 0, 0);
    cols[2] = cv::Scalar(0, 255, 0);

    std::ofstream writing_file;
    writing_file.open("test.txt", std::ios::out);

    cv::namedWindow("search image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
    //    while (1) {

    // 探索画像
    cv::Mat search_img0 = cv::imread("C:\\opencv\\sources\\sousaku.jpg", 1);
    cv::Mat search_img;
    search_img0.copyTo(search_img);

    for (int j = 0; j<3; j++) {
        cv::Mat &tmp_img = tmp_imgs[j];
        cv::Mat result_img;
        // 50 個検出する
        for (int i = 0; i<50; i++) {
            // テンプレートマッチング
            // cv::matchTemplate(search_img, tmp_img, result_img, CV_TM_SQDIFF_NORMED);
            cv::matchTemplate(search_img, tmp_img, result_img, CV_TM_CCOEFF_NORMED);
            // 最大のスコアの場所を探す
            cv::Rect roi_rect(0, 0, tmp_img.cols, tmp_img.rows);
            cv::Point max_pt;
            double maxVal;
            cv::minMaxLoc(result_img, NULL, &maxVal, NULL, &max_pt);
            // 一定スコア以下の場合は処理終了
            if (maxVal < 0.58) break;

            roi_rect.x = max_pt.x;
            roi_rect.y = max_pt.y;

            if (j == 0) {
                std::cout << "A" << std::endl;
                writing_file << "A " << "(" << max_pt.x << ", " << max_pt.y << ")\n";
            }
            else if (j == 1) {
                std::cout << "B" << std::endl;
                writing_file << "B " << "(" << max_pt.x << ", " << max_pt.y << ")\n";
            }
            else if (j == 2) {
                std::cout << "☆" << std::endl;
                writing_file << "☆ " << "(" << max_pt.x << ", " << max_pt.y << ")\n";
            }

            std::cout << "(" << max_pt.x << ", " << max_pt.y << "), score=" << maxVal << std::endl;
            // 探索結果の場所に矩形を描画
            cv::rectangle(search_img0, roi_rect, cols[j], 3);
            cv::rectangle(search_img, roi_rect, cv::Scalar(0, 0, 255), CV_FILLED);
        }
        printf("%d\n", j);
    }

    cv::imshow("search image", search_img0);

            char ch = cv::waitKey(0);
            //if (ch == 27) break;

    //cvReleaseCapture(&capture);
}


コードでは点A,Bと図形☆の座標データをテキスト化するところまでできました。
ちなみにコードについては「Moonmile Solutions Blog」http://www.moonmile.net/blog/archives/2468というブログの複数の検出をしているほうのコードを参考にさせていただいております。
2番からのコードの書き方がうまくできないのでよろしければご教授いただきたいです。
上にも書きましたが、4番の最終的に図形☆が自身が定義した座標のどこにあるかをテキスト化できればいいので(イメージでは ☆(b2) のようなものがテキストファイルに書かれる)、もっと効率のいい方法があるのであれば1から3の手順は無視したり変更しても構いません。よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • yohhoy

    2017/11/29 19:07 編集

    9個ある網目(マス)のそれぞれで、マスの四隅座標(x,y)は計算できているのでしょうか?まずはご自身で処理ステップを(日本語や数式で)書き下してみてください。

    キャンセル

まだ回答がついていません

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

ただいまの回答率

91.36%

関連した質問

  • 解決済

    opencvのcvConvertScaleAbs関数エラーを直したい

    こんにちは。 どうしても解決できず、ずっと悩んでいるのでご助力いただけないかと思い投稿しました。 前提・実現したいこと XcodeでC++、opencvを用いて行列操作を

  • 解決済

    byte配列のcv::Matへの画像変換

    byte配列に格納している画像データをMatに画像配列として保存します。この時、cv::imdecodeを使用しています。その後に画素値の変換をかけてcv::imencodeで再び

  • 解決済

    opencvでの画像の回転

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

  • 解決済

    opencvの連番読み込み

    今まで、iplimage型でコードを書いていたのですが、 多くの人の指摘があり、mat型に変更したいと考えています。 そこで、画像の連番読み込み、保存を行いたいと考えていま

  • 解決済

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

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

  • 受付中

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

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

  • 解決済

    OpenCvSharp3で重心を求めたいです

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

  • 解決済

    ファイル名に変数を用いて繰り返し読み込み処理を行いたい

    現在画像編集のプログラムopnCVとC++を用いた上で作成している初歩的段階です。 複数枚の画像に対してimreaの処理をかけた上で繰り返し画像の読み込み画像番号順に(1から並んで

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

  • C++

    2420questions

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

  • OpenCV

    621questions

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