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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

C++

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

Q&A

解決済

1回答

6268閲覧

画像マッチングの評価プログラムを作成したい(cv::KeyPointの構造)

stdnium

総合スコア15

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

C++

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

0グッド

0クリップ

投稿2017/11/21 07:08

編集2017/11/22 08:44

###前提・実現したいこと
OpenCVで二つの画像から特徴点を検出しマッチングするプログラムを作成しています。
今回はその中でも比較された二つの特徴点が同じ(もしくは近い)座標の点であるか確認するプログラムを作成したいと思っています。

###発生している問題・エラーメッセージ
std::vectorcv::KeyPointのメンバ(構造)がわからず、要素の取り出し方がわかりません。

###該当のソースコード

C++

1#include <opencv2/opencv.hpp> 2#include <opencv2/features2d.hpp> 3#include <opencv2/xfeatures2d.hpp> 4#include <opencv2/xfeatures2d/nonfree.hpp> 5#include <opencv2/core.hpp> 6#include <opencv2/highgui.hpp> 7 8 9void FeatureMatching(void) 10{ 11 bool crossCheck = false; 12 13 // 画像の読み込み 14 cv::Mat img1 = cv::imread("C:\opencv\image\lenna.jpg"); 15 cv::Mat img2 = cv::imread("C:\opencv\image\lenna2.jpg"); 16 17 // 特徴点抽出 18 auto detector = cv::xfeatures2d::StarDetector::create(); 19 std::vector<cv::KeyPoint> keypoint1, keypoint2; 20 detector->detect(img1, keypoint1); 21 detector->detect(img2, keypoint2); 22 23 cv::imshow("1", img1); 24 cv::imshow("2", img2); 25 26 // 特徴記述 27 auto extractor = cv::xfeatures2d::SIFT::create(); 28 cv::Mat descriptor1, descriptor2; 29 30 extractor->compute(img1, keypoint1, descriptor1); 31 extractor->compute(img2, keypoint2, descriptor2); 32 33 // マッチング 34 auto matcher = cv::DescriptorMatcher::create("BruteForce-L1"); 35 std::vector<cv::DMatch> dmatch; 36 if (crossCheck) 37 { 38 // クロスチェックする場合 39 std::vector<cv::DMatch> match12, match21; 40 matcher->match(descriptor1, descriptor2, match12); 41 matcher->match(descriptor2, descriptor1, match21); 42 for (size_t i = 0; i < match12.size(); i++) 43 { 44 cv::DMatch forward = match12[i]; 45 cv::DMatch backward = match21[forward.trainIdx]; 46 if (backward.trainIdx == forward.queryIdx) 47 dmatch.push_back(forward); 48 } 49 } 50 else 51 { 52 // クロスチェックしない場合 53 matcher->match(descriptor1, descriptor2, dmatch); 54 } 55 56 // マッチング結果の表示 57 cv::Mat out; 58 cv::drawMatches(img1, keypoint1, img2, keypoint2, dmatch, out); 59 cv::imshow("matching", out); 60 61 while (cv::waitKey(1) == -1); 62} 63 64int main(void) { 65 FeatureMatching(); 66 return 0; 67}

###試したこと
KeyPointにptなる座標を扱うメンバがあるような記載を見ましたが、試しにプログラムで動かしてみたところ「class "std::vector<cv::KeyPoint, std::allocatorcv::KeyPoint>" にメンバー "_pt" がありません」のコンパイルエラーが出ました。

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2017
OpenCV 3.3.0

実力が伴っていないのは重々承知しているので、よろしければ解決策の調べ方だけでもご教授頂けるとありがたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

std::vectorcv::KeyPointのメンバ(構造)がわからず、要素の取り出し方がわかりません。

std::vectorやstd::arrayはコンテナの一種で、配列を高級にしたものです。
それぞれの要素にアクセスするには、次のようにすると良いでしょう。(おすすめ順)

for-each
一番わかりやすく、最近の言語にはだいたいある気がする。
コンテナ名を複数形にするとわかりやすくなるのでおすすめ。

C++

1for(const auto& keypoint: keypoints) { 2 std::cout << keypoint.pt << "\n"; 3}

イテレータの利用
いろいろなパターン(例えば逆順)で巡回でき、柔軟な印象。

C++

1for(auto it = keypoints.cbegin(), end = keypoints.cend(); it != end; ++it) { 2 std::cout << it->pt << "\n"; 3}

コンテナのサイズを取得してループ
一番基本的な方法。入門書のfor文に毛が生えたようなもの。

C++

1for(size_t i = 0, end = keypoints.size(); i != end; ++i) { 2 std::cout << keypoints.at(i).pt << "\n"; 3}

実際かなり説明を端折っています。ここらへん奥が深いのです。
とりあえず使えるようになったら、少しずつ追求していけばよいでしょう。


解決策の調べ方

C++についてでしょうか?OpenCVについてでしょうか?

C++について、なら
とにかく基礎を固めることです。
非常に難しい言語なので、理解を積み重ねることが非常に大切です。

OpenCVについて、なら
公式のリファレンスが見られるので、それを見るとよいでしょう。
OpenCV 3.2.0: OpenCV modules

投稿2017/11/22 09:13

編集2017/11/22 09:14
LouiS0616

総合スコア35658

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

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

stdnium

2017/11/22 10:04

丁寧でわかりやすいご説明ありがとうございました。 お陰様で問題が解決し、学習のモチベーションも上がりました。 少しづつ理解を積み重ねていこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問