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

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

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

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

C++

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

Q&A

解決済

1回答

6833閲覧

2枚の画像で特徴点マッチングをし、対応する特徴点を矢印で結びたい。

tanaka_kazuya

総合スコア15

OpenCV

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

C++

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

0グッド

0クリップ

投稿2018/12/20 15:18

前提・実現したいこと

OpenCVで二つの画像から特徴点を検出しマッチングするプログラムを作成しています。
マッチングから得られたkeypoint1,keypoint2のxy座標を指定して矢印の線で結びたいです。

発生している問題

opencvのarrowedLineを用いたのですがうまくできません。 arrowedLine(dst, Point(keypoint1[1].pt.x, keypoint1[1].pt.y), Point(keypoint2[1].pt.x, keypoint2[1].pt.y), (0, 0, 255), 8, LINE_4, 0, 0.3); 上記のPointの指定が間違っているのでしょうか?

該当のソースコード

C++

1#include "stdafx.h" 2#include <opencv2/opencv.hpp> 3#pragma comment(lib, "opencv_world341d.lib") 4using namespace std; 5using namespace cv; 6 7 8int main() 9{ 10 11 Mat ref1(imread("62866.jpg")), ref2(imread("62865.jpg")); 12 resize(ref1, ref1, cv::Size(), 0.3, 0.3); 13 14 resize(ref2, ref2, cv::Size(), 0.3, 0.3); 15 16 while (1) { 17 18 // 特徴の抽出と記述 19 vector<KeyPoint> keypoint1, keypoint2; 20 Mat descriptor1, descriptor2; 21 Ptr<ORB> feature = ORB::create(); 22 feature->detectAndCompute(ref1, noArray(), keypoint1, descriptor1); 23 feature->detectAndCompute(ref2, noArray(), keypoint2, descriptor2); 24 25 // 特徴点マッチング 26 vector<DMatch> allMatch, goodMatch; 27 BFMatcher matcher(NORM_HAMMING); 28 matcher.match(descriptor1, descriptor2, allMatch); 29 30 // 似ている特徴点ペアのみピックアップ 31 for (int i = 0; i < (int)allMatch.size(); i++) { 32 if (allMatch[i].distance < 30) goodMatch.push_back(allMatch[i]); 33 } 34 35 // 描画 36 Mat dst(480, 1280, CV_8UC3); 37 drawMatches(ref1, keypoint1, ref2, keypoint2, goodMatch, dst, 38 Scalar::all(-1), Scalar::all(-1), vector<char>(), 39 DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 40 //DrawMatchesFlags::DRAW_RICH_KEYPOINTS); 41 //DrawMatchesFlags::DEFAULT); 42 //DrawMatchesFlags::DRAW_OVER_OUTIMG); 43 arrowedLine(dst, Point(keypoint1[1].pt.x, keypoint1[1].pt.y), Point(keypoint2[1].pt.x, keypoint2[1].pt.y), (0, 0, 255), 8, LINE_4, 0, 0.3); ←ここ 44 45 46 // 一致率 47 float matchRate = (float)goodMatch.size() / (float)keypoint1.size(); 48 stringstream st; 49 st.precision(3); 50 st << fixed << matchRate; 51 putText(dst, st.str(), Point(8, 24), FONT_HERSHEY_SIMPLEX, 1, 0, 2); 52 if (matchRate > 0.01) 53 putText(dst, "Detect", Point(650, 40), FONT_HERSHEY_SIMPLEX, 1.5, 0, 4); 54 imshow("特徴点マッチング", dst); 55 56 57 } 58}

試したこと

ここに問題に対して試したことを記載してください。

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

Visual Studio 2017
OpenCV 3.4.1

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

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

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

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

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

tiitoi

2018/12/20 16:28

"うまくいかない"とは具体的にはどのようにうまくいかないのでしょうか?
tanaka_kazuya

2018/12/20 16:46

あいまいな質問で申し訳ありませでした。 具体的には、プログラムを実行した結果、矢印の表示は出来たのですが、明らかにkeypointで指定した2点を結んでいませんでした。 ですので、 Point(keypoint1[1].pt.x, keypoint1[1].pt.y), Point(keypoint2[1].pt.x, keypoint2[1].pt.y) の、指定が正しいのか質問しました。よろしければ回答をお願いします。
guest

回答1

0

ベストアンサー

Point(keypoint1[1].pt.x, keypoint1[1].pt.y)Point(keypoint2[1].pt.x, keypoint2[1].pt.y) を結んでいますが、これはそれぞれの画像で見つかった特徴点が格納されている配列であり、対応関係はないと思います。

マッチングした点をむすびたいのであれば、goodMatch を参照するべきでないでしょうか。

int kp1_idx = goodMatch[i].queryIdx; // keypoint1 のインデックス int kp2_idx = goodMatch[i].trainIdx; // keypoint2 のインデックス // 矢印の始点と終点 Point start(keypoint1[kp1_idx].pt.x, keypoint1[kp1_idx].pt.y); Point end(keypoint2[kp2_idx].pt.x, keypoint1[kp2_idx].pt.y);

cv::Dmatch オブジェクトのメンバ変数は以下のようになっています。

DMatch.distance - 特徴量記述子の距離
DMatch.trainIdx - train 画像の特徴量記述子のインデックス
DMatch.queryIdx - query 画像の特徴量記述子のインデックス

train, query が何を言ってるのかわかりづらいが、特徴点マッチングで2枚の画像を比較するので、一方が train でもう一方が query と解釈すればOK。

What is query and train in openCV features2D

投稿2018/12/20 17:01

tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問