конвертировать ключевые точки в мат или сохранять их в текстовый файл opencv - PullRequest
5 голосов
/ 04 октября 2011

Я извлек функции SIFT в (opencv с открытым исходным кодом), и они извлекаются как ключевые точки.Теперь я хотел бы преобразовать их в матрицу (с их координатами x, y) или сохранить их в текстовом файле ...

Здесь вы можете увидеть пример кода для извлечения ключевых точек, и теперь я хотел быхотелось бы узнать, как конвертировать их в MAT или сохранить их в TXT, XML или YAML ...

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

Ответы [ 2 ]

7 голосов
/ 19 февраля 2012

Преобразовать в 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);
1 голос
/ 26 июля 2018

Сегодня я столкнулся с той же проблемой, что и в этом вопросе. Ответ, предложенный Appleman1234, хорош, если вас не волнует время выполнения. Я считаю, что для циклов всегда будет стоить вам дорого, если вы заботитесь о времени выполнения. Поэтому я наткнулся на и нашел эту интересную функцию (cv::KeyPoint::convert()) в OpenCV, которая позволяет напрямую преобразовывать вектор KeyPoints (std::vector<KeyPoint> keypoints_vector) в вектор Point2f (std::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

Подробнее см. В документации здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...