前提・実現したいこと
OpenCVで二つの画像から特徴点を検出しマッチングするプログラムを作成しています。
二枚の画像のkeypoint1、keypoint2に含まれている座標をエクセルに書き出すプログラムを作成したいと思っています。
発生している問題・エラーメッセージ
keypoint1、keypoint2それぞれの座標をエクセルに出力したいのですが、p.pt.x、p.pt.y、p.angle はどう書けば良いのでしょうか。添付画像のように出力したいです。
該当のソースコード
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); // 一致率 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); // ファイルに出力する。 //////////////////////////////////////////////////////// string filename = "keypoints.csv"; //std::string filename = "keypoints.txt"; ofstream ofs(filename); ofs << "x,y,angle" << endl; for (const auto &p : keypoint1) { ofs << p.pt.x << "," << p.pt.y << "," << p.angle << endl; } for (const auto &p : keypoint2) { ofs << p.pt.x << "," << p.pt.y << "," << p.angle << endl; int key = waitKey(20); if (key == 27) break; } } } ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) Visual Studio 2017 OpenCV 3.4.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/14 00:25 編集
2018/12/14 01:08
2018/12/14 02:27