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

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

ただいまの
回答率

89.62%

OpenCVテンプレートマッチング切り取り(トリミング)

解決済

回答 1

投稿 編集

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

前提・実現したいこと

テンプレートマッチングでマッチングした箇所だけを切り取りたいです。
どのような関数を使い,切り取ればいいのでしょうか。

ソースコード

include <vector>
include <stdio.h>
include <iostream>
include <string.h>
include <opencv2/core/core.hpp>
include <opencv2/imgproc/imgproc.hpp>
include <opencv2/highgui/highgui.hpp>
include "opencv2/opencv.hpp"
include <opencv2/opencv.hpp>
pragma comment(lib, "opencv_world320d.lib")

using namespace std;
using namespace cv;

int main(int argh, char* argv[])
{
cv::VideoCapture cap(0);

if(!cap.isOpened())
{
cout << "ERROR: cannot open cam device." << endl;
return -1;
}

cv::Mat frame;
while(cap.read(frame))
{

cv::imshow("win", frame);
const int key = cv::waitKey(1);
if(key == 'q')
{
break;
}

else if(key == 's')
{
cv::waitKey(1);
cv::imwrite("/Users/i-am-kaito/Downloads/img.png", frame);
}
}

Mat src;
//テンプレート画像とその名称
vector<Mat> img{ imread("/Users/i-am-kaito/Downloads/IMG_4483.png"),
imread("/Users/i-am-kaito/Downloads/IMG_4484.png"),
imread("/Users/i-am-kaito/Downloads/IMG_4448.png")
};
vector<string> name{ "680","1000","150"};

//色情報
Mat src_image = imread("/Users/i-am-kaito/Downloads/img.png", 1);    // カラーで読み込む

// 画像の座標(0,0)の画素値を取得する
Vec3b pix = src_image.at<Vec3b>(Point(0, 0));

// 画素値はBGRの順に格納されている
cout << (int)pix[0] << "," << (int)pix[1] << "," << (int)pix[2] << endl;

while (1) {
cap >> src; if (src.empty()) break;

for (int num = 0; num < 3; num++){
Mat mapCC;
//テンプレートマッチング
matchTemplate(src, img[num], mapCC, cv::TM_CCOEFF_NORMED);//ZNCC法
double maxCC;
Point maxLoc;
//相互相関係数の最大値探索
minMaxLoc(mapCC, NULL, &maxCC, NULL, &maxLoc);

if (maxCC > 0.4){ //類似度が0.4以上なら枠描写
rectangle(src, maxLoc,
maxLoc + Point(img[num].cols, img[num].rows), 0, 4);
putText(src, name[num], maxLoc + Point(10, 30),
cv::FONT_HERSHEY_SIMPLEX, 1, 0, 2);

const int key = cv::waitKey(1);

if(key == 'k'){
cv::Rect roi(cv::Point(img[num].cols, img[num].rows), cv::Size(600,600));
cv::Mat subImg = src(roi);
imshow("kiri", src(roi));
}
else if(key == 'q'){
break;
}
}

imshow("Temp", src);
if (waitKey(20) == 27) break;

}
}
cv::destroyAllWindows();
return 0;

}

試したこと

rectangleでマッチング箇所を四角形で囲っています。                    
cv::Rect roi(cv::Point(x, y), cv::Size(600,600));
マッチング箇所だけを切り取る際はx,yに何を入れたらいいのでしょうか

補足情報(FW/ツールのバージョンなど)

OS Mac
言語 C++

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

cv::Matなら operator()( const cv::Rect & )とかで.
引数が違うoperator()もあるし,コンストラクタでも同様のことができるハズ.

切り出す目的次第では,
そのようにして作ったMatが,大元のMatと画素値データのメモリ領域を共有する状態になり得る点に注意.

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/15 15:12

    すいません。自身の勉強不足であまり理解できません。
    ソースコードを貼らせて頂いたのでどこに関数を入力するのか教えて頂けたら幸いです。よろしくお願いします。また、情報が足りない場合はその都度お伝えしますので、よろしくお願いします。

    キャンセル

  • 2020/01/15 15:50 編集

    > operator()( const cv::Rect & )
    の意味がわからない感じですかね……

    cv::Mat Img; //何らかの画像
    が存在しているとき,その部分画像を表す cv::Mat を,
    cv::Rect Area( 10,20, 50,60 ); //部分範囲(この例だと,左上位置(10,20)で50x60サイズ)
    cv::Mat AreaImg = Img( Area ); //部分画像
    のようにして得られる,という話です.

    一度,OpenCVのリファレンス等で cv::Mat の持っているメソッドについて調べるべきです.

    キャンセル

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

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

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