#c #opencv #vector #mat #keypoint
#c #opencv #вектор #mat #ключевая точка
Вопрос:
Я извлек функции SIFT в (opencv с открытым исходным кодом), и они извлекаются как ключевые точки. Теперь я хотел бы преобразовать их в матрицу (с их координатами x, y) или сохранить их в текстовом файле…
Здесь вы можете увидеть пример кода для извлечения ключевых точек, и теперь я хотел бы знать, как преобразовать их в MAT или сохранить в txt, xml или yaml…
cv::SiftFeatureDetector detector;
std::vector<cv::KeyPoint> keypoints;
detector.detect(input, keypoints);
Ответ №1:
Преобразование в 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);
Ответ №2:
Сегодня я столкнулся с той же проблемой, что и в этом вопросе. Ответ, предложенный Appleman1234, хорош, если вы не заботитесь о времени выполнения. Я считаю, что циклы for всегда будут стоить вам дорого, если вы заботитесь о времени выполнения. Итак, я наткнулся и нашел эту интересную функцию ( cv::KeyPoint::convert()
) в OpenCV, которая позволяет напрямую преобразовывать вектор ключевых точек ( 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
Для получения более подробной информации обратитесь к этой документации здесь .