matchfeatures c++ opencv type-conversion computer-vision surf

c++ - matchfeatures opencv



¿Convertir Mat a Keypoint? (2)

Estoy escribiendo ambos descriptores (salida de SurfDescriptorExtractor) y puntos clave (salida de SurfFeatureDetector) en un archivo XML. Antes de escribir los puntos clave (std :: vector) se hace la conversión a Mat (siguiendo esto: convierta los puntos clave en mat o guárdelos en el archivo de texto opencv ). Para los descriptores no es necesario, ya son Mat. Entonces ambos se guardan como Mat, no hay problema en leer tampoco. Pero cuando se utiliza un FlannBasedMatcher, y luego drawMatches, este método solicita datos de punto clave.

La pregunta es: ¿cómo convertirías Mat en el vector de Keypoint, y cuál sería el mejor enfoque?


Así es como el código fuente de opencv realiza la conversión en Java , no pude encontrar esta conversión en C ++, es posible que no exista. Es posible que pueda traducir esto a C ++, no es muy complejo.

//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])); } }


Acabo de encontrar esto mirando el origen de OpenCV (en /modules/java/generator/src/cpp/converters.cpp, alrededor de la línea 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; }

Y lo estoy usando como:

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; };