前提・実現したいこと
テンプレートマッチングでマッチングした箇所だけを切り取りたいです。
どのような関数を使い,切り取ればいいのでしょうか。
###ソースコード
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++
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/15 06:12
2020/01/15 06:51 編集