2011-08-02 19 views
29

¿Cómo convierto un cv :: Mat del tipo CV_32FC1 al tipo CV_64FC1 (equivalente a un cambio de float a double)?convert Matriz del tipo CV_32FC1 a CV_64FC1

Estoy abriendo una matriz que se guardó como XML (cvSave) pero como un flotador. Esto significa que el campo <dt> tiene el valor f en el archivo. Necesito cambiarlo a d para abrirlo. Pero prefiero no hacer esto, en cambio me gustaría abrirlo directamente como una matriz con elementos de tipo double, o convertirlo más tarde de float a double.

A continuación se muestra el código para abrir el archivo.

/** Load cv::Mat from XML file. 
*/ 
cv::Mat loadMat(const std::string filename) 
{ 
    cv::Mat result; 
    cv::FileStorage fs(filename, cv::FileStorage::READ); 
    fs.getFirstTopLevelNode() >> result; 
    return result; 
} 

Respuesta

51

Bien, soy un imbécil. Aquí está cómo va:

Hay la función convertTo que hace exactamente lo que quiero.

Gracias por matrix type conversion in opencv para señalar esto.

Aquí es cómo lo hago:

cv::Mat A = loadMat("mymat.xml"); // See function loadMat in the question! 
A.convertTo(A, CV_64F); 
+6

Además, si va a convertir de algo así como 16 U a 8U, es necesario agregar un factor de escala como tercer parámetro. 'A.convertTo (A, CV_8UC1, 255.0/65536.0);' –