5

我在(opencv 开源)中提取了 SIFT 特征,它们被提取为关键点。现在,我想将它们转换为矩阵(使用它们的 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);

写入文件存储是

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 循环总是会让您付出高昂的代价。cv::KeyPoint::convert()所以我在 OpenCV 中偶然发现了这个有趣的函数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 回答