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

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

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

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

C++

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

解決済

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

tanaka_kazuya
tanaka_kazuya

総合スコア15

OpenCV

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

C++

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

1回答

0評価

0クリップ

4773閲覧

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

#include "stdafx.h" #include <opencv2/opencv.hpp> #pragma comment(lib, "opencv_world341d.lib") using namespace std; using namespace cv; int main() { Mat ref1(imread("62866.jpg")), ref2(imread("62865.jpg")); resize(ref1, ref1, cv::Size(), 0.3, 0.3); resize(ref2, ref2, cv::Size(), 0.3, 0.3); while (1) { // 特徴の抽出と記述 vector<KeyPoint> keypoint1, keypoint2; Mat descriptor1, descriptor2; Ptr<ORB> feature = ORB::create(); feature->detectAndCompute(ref1, noArray(), keypoint1, descriptor1); feature->detectAndCompute(ref2, noArray(), keypoint2, descriptor2); // 特徴点マッチング vector<DMatch> allMatch, goodMatch; BFMatcher matcher(NORM_HAMMING); matcher.match(descriptor1, descriptor2, allMatch); // 似ている特徴点ペアのみピックアップ for (int i = 0; i < (int)allMatch.size(); i++) { if (allMatch[i].distance < 30) goodMatch.push_back(allMatch[i]); } // 描画 Mat dst(480, 1280, CV_8UC3); drawMatches(ref1, keypoint1, ref2, keypoint2, goodMatch, dst, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); //DrawMatchesFlags::DRAW_RICH_KEYPOINTS); //DrawMatchesFlags::DEFAULT); //DrawMatchesFlags::DRAW_OVER_OUTIMG); 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); ←ここ // 一致率 float matchRate = (float)goodMatch.size() / (float)keypoint1.size(); stringstream st; st.precision(3); st << fixed << matchRate; putText(dst, st.str(), Point(8, 24), FONT_HERSHEY_SIMPLEX, 1, 0, 2); if (matchRate > 0.01) putText(dst, "Detect", Point(650, 40), FONT_HERSHEY_SIMPLEX, 1.5, 0, 4); imshow("特徴点マッチング", dst); } }

試したこと

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

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

Visual Studio 2017
OpenCV 3.4.1

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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) の、指定が正しいのか質問しました。よろしければ回答をお願いします。

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

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OpenCV

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

C++

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