5

(opencvオープンソース)でSIFT特徴を抽出し、キーポイントとして抽出しました。次に、それらをMatrix(x、y座標を使用)に変換するか、テキストファイルに保存します...

ここでは、キーポイントを抽出するためのサンプルコードを見ることができます。次に、キーポイントをMATに変換する方法、またはtxt、xml、またはyamlに保存する方法を知りたいです...

cv::SiftFeatureDetector detector;
std::vector<cv::KeyPoint> keypoints;
detector.detect(input, keypoints);
4

2 に答える 2

7

cv::Matへの変換は次のとおりです。

std::vector<cv::KeyPoint> keypoints;
std::vector<cv::Point2f> points;
std::vector<cv::KeyPoint>::iterator it;

for( it= keypoints.begin(); it!= keypoints.end();it++)
{
    points.push_back(it->pt);
}

cv::Mat pointmatrix(points);

filestorageへの書き込みは

cv::FileStorage fs("test.yml", cv::FileStorage::WRITE);
cv::FileStorage fs2("test2.xml", cv::FileStorage::WRITE);

detector.write(fs);
detector.write(fs2);
于 2012-02-18T23:58:47.387 に答える
2

今日、私はこの質問と同じ問題に遭遇しました。ランタイムを気にしないのであれば、Appleman1234によって提案された答えは素晴らしいです。ランタイムを気にするなら、forループは常にあなたにかなりの費用がかかると私は信じています。そこで私は、OpenCVでこの興味深い関数()を見つけました。これにより、KeyPoints( )のcv::KeyPoint::convert()ベクトルをPoint2f()のベクトルに直接変換できます。std::vector<KeyPoint> keypoints_vectorstd::vector<cv::Point2f> point2f_vector

あなたの場合、それは次のように使用することができます:

std::vector<cv::KeyPoint> keypoints_vector; //We define vector of keypoints
std::vector<cv::Point2f> point2f_vector; //We define vector of point2f
cv::KeyPoint::convert(keypoints_vector, point2f_vector, std::vector< int >()); //Then we use this nice function from OpenCV to directly convert from KeyPoint vector to Point2f vector
cv::Mat img1_coordinates(point2f_vector); //We simply cast the Point2f vector into a cv::Mat as Appleman1234 did

詳細については、こちらのドキュメントを参照してください

于 2018-07-26T19:39:37.997 に答える