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

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

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

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

C++

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

Q&A

解決済

1回答

1325閲覧

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

taeyang_88

総合スコア10

OpenCV

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

C++

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

0グッド

0クリップ

投稿2020/01/15 04:22

編集2020/01/15 08:03

前提・実現したいこと

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

###ソースコード

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++

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

投稿2020/01/15 04:40

fana

総合スコア11634

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

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

taeyang_88

2020/01/15 06:12

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

2020/01/15 06:51 編集

> 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 の持っているメソッドについて調べるべきです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問