###前提・実現したいこと
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
実力が伴っていないのは重々承知しているので、よろしければ解決策の調べ方だけでもご教授頂けるとありがたいです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/22 10:04