variable valor tipo programacion obtener numerico español enum ejemplo clase c++ image-processing opencv enums image-formats

c++ - valor - Obtener nombres enum(por ejemplo, CV_32FC1) de tipos de imágenes OpenCV?



obtener el valor numerico de un enum c# (2)

En la interfaz de C ++ para OpenCV, parece bastante fácil verificar el tipo de imagen. Si tiene una imagen cv::Mat img = cv::imread("someImage.xyz") , simplemente haga int theType = img.type() .

Sin embargo, como era de esperar, llamar a img.type() simplemente da un entero, un nombre no enum (por ejemplo, CV_32FC1 ).

¿Hay una manera fácil de imprimir el nombre de la enumeración (por ejemplo, CV_32FC1 ) si conozco el valor entero de la enumeración de OpenCV?


Que yo sepa, tal función no existe en OpenCV.

Creo que sería mejor que escribieras tu propia función para obtenerlos. Una gran cantidad de casos de cambio, pero supongo que hace el trabajo. La enumeración se puede encontrar here .

EDITAR:

Esto es algo que podrías usar para extraer los tipos. Supongo que podría haber un método más eficiente, pero no puedo entenderlo ahora mismo.

std::string getImageType(int number) { // find type int imgTypeInt = number%8; std::string imgTypeString; switch (imgTypeInt) { case 0: imgTypeString = "8U"; break; case 1: imgTypeString = "8S"; break; case 2: imgTypeString = "16U"; break; case 3: imgTypeString = "16S"; break; case 4: imgTypeString = "32S"; break; case 5: imgTypeString = "32F"; break; case 6: imgTypeString = "64F"; break; default: break; } // find channel int channel = (number/8) + 1; std::stringstream type; type<<"CV_"<<imgTypeString<<"C"<<channel; return type.str(); }


Siguiendo el consejo de @Bob, escribí mi propia función para resolver este problema. Aquí está:

// take number image type number (from cv::Mat.type()), get OpenCV''s enum string. string getImgType(int imgTypeInt) { int numImgTypes = 35; // 7 base types, with five channel options each (none or C1, ..., C4) int enum_ints[] = {CV_8U, CV_8UC1, CV_8UC2, CV_8UC3, CV_8UC4, CV_8S, CV_8SC1, CV_8SC2, CV_8SC3, CV_8SC4, CV_16U, CV_16UC1, CV_16UC2, CV_16UC3, CV_16UC4, CV_16S, CV_16SC1, CV_16SC2, CV_16SC3, CV_16SC4, CV_32S, CV_32SC1, CV_32SC2, CV_32SC3, CV_32SC4, CV_32F, CV_32FC1, CV_32FC2, CV_32FC3, CV_32FC4, CV_64F, CV_64FC1, CV_64FC2, CV_64FC3, CV_64FC4}; string enum_strings[] = {"CV_8U", "CV_8UC1", "CV_8UC2", "CV_8UC3", "CV_8UC4", "CV_8S", "CV_8SC1", "CV_8SC2", "CV_8SC3", "CV_8SC4", "CV_16U", "CV_16UC1", "CV_16UC2", "CV_16UC3", "CV_16UC4", "CV_16S", "CV_16SC1", "CV_16SC2", "CV_16SC3", "CV_16SC4", "CV_32S", "CV_32SC1", "CV_32SC2", "CV_32SC3", "CV_32SC4", "CV_32F", "CV_32FC1", "CV_32FC2", "CV_32FC3", "CV_32FC4", "CV_64F", "CV_64FC1", "CV_64FC2", "CV_64FC3", "CV_64FC4"}; for(int i=0; i<numImgTypes; i++) { if(imgTypeInt == enum_ints[i]) return enum_strings[i]; } return "unknown image type"; }

¿Olvidé incluir cualquier tipo de imagen OpenCV en mi tabla de búsqueda?