Я пишу дескрипторы (вывод SurfDescriptorExtractor) и ключевые точки (вывод SurfFeatureDetector) в файл XML.
Перед записью ключевых точек (std :: vector) выполняется преобразование в Mat (следующее: конвертировать ключевые точки в мат или сохранять их в текстовый файл opencv ). Для дескрипторов это не обязательно, они уже Мэт.
Так что оба сохраняются как Mat, проблем с чтением тоже нет. Но при использовании FlannBasedMatcher, а затем drawMatches этот метод запрашивает данные ключевой точки.
Вопрос в том, как бы вы конвертировали Mat в вектор Keypoint, и какой подход был бы наилучшим?
Вот как исходный код opencv делает преобразование в Джава, Я не смог найти это преобразование в C ++, оно может не существовать. Возможно, вы сможете перевести это на C ++, это не очень сложно.
//Code from Opencv4Android: utils/Converters.java
public static void Mat_to_vector_KeyPoint(Mat m, List<KeyPoint> kps) {
if (kps == null)
throw new java.lang.IllegalArgumentException("Output List can't be null");
int count = m.rows();
if (CvType.CV_64FC(7) != m.type() || m.cols() != 1)
throw new java.lang.IllegalArgumentException(
"CvType.CV_64FC(7) != m.type() || m.cols()!=1\n" + m);
kps.clear();
double[] buff = new double[7 * count];
m.get(0, 0, buff);
for (int i = 0; i < count; i++) {
kps.add(new KeyPoint((float) buff[7 * i], (float) buff[7 * i + 1], (float) buff[7 * i + 2], (float) buff[7 * i + 3],
(float) buff[7 * i + 4], (int) buff[7 * i + 5], (int) buff[7 * i + 6]));
}
}
Просто нашел это, посмотрев на источник OpenCV (в /modules/java/generator/src/cpp/converters.cpp, строка 185):
void Mat_to_vector_KeyPoint(Mat& mat, vector<KeyPoint>& v_kp)
{
v_kp.clear();
CHECK_MAT(mat.type()==CV_32FC(7) && mat.cols==1);
for(int i=0; i<mat.rows; i++)
{
Vec<float, 7> v = mat.at< Vec<float, 7> >(i,0);
KeyPoint kp(v[0], v[1], v[2], v[3], v[4], (int)v[5], (int)v[6]);
v_kp.push_back(kp);
}
return;
}
И я использую это как:
vector<KeyPoint> mat_to_keypoints(Mat* mat) {
vector<KeyPoint> c_keypoints;
for ( int i = 0; i < mat->rows; i++) {
Vec<float, 7> v = mat.at< Vec<float, 7> >(i,0);
KeyPoint kp(v[0], v[1], v[2], v[3], v[4], (int)v[5], (int)v[6]);
c_keypoints.push_back(kp);
};
return c_keypoints;
};