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

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

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

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

C++

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

Q&A

解決済

1回答

4844閲覧

特徴点マッチングで得たKeypointの座標をエクセルに出力したい。

tanaka_kazuya

総合スコア15

OpenCV

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

C++

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

0グッド

0クリップ

投稿2018/12/13 19:10

編集2018/12/13 19:14

前提・実現したいこと

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

こういう場合、インデックスでループ回すのが早いです。

C++

1ofs << "x1,y1,angle1,x2,y2,angle2" << endl; 2 3for (int i = 0; i < keypoint1.size(); i++) { 4 ofs << keypoint1[i].pt.x << "," << keypoint1[i].pt.y << "," << keypoint1[i].angle << ","; 5 ofs << keypoint2[i].pt.x << "," << keypoint2[i].pt.y << "," << keypoint2[i].angle << endl; 6}

投稿2018/12/13 23:29

編集2018/12/14 01:08
kazto

総合スコア7196

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

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

tanaka_kazuya

2018/12/14 00:25 編集

回答ありがとうございます。 さっそくデバッグしてみたところ、 エラー E0135 class "std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint>>" にメンバー "length" がありません 。 エラー C2039 'length': 'std::vector<cv::KeyPoint,std::allocator<_Ty>>' のメンバーではありません。 とエラーがでました。 https://docs.opencv.org/3.4.1/d2/d29/classcv_1_1KeyPoint.html#a507d41b54805e9ee5042b922e68e4372 上記のURLを見るとkeypointにはlengthは含まれていないようですが、どのようにすればいいのでしょうか。
kazto

2018/12/14 01:08

失礼しました。length()ではなく、size()でした。
tanaka_kazuya

2018/12/14 02:27

keypointの座標をエクセルに出力することができました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問