web-dev-qa-db-fra.com

Obtenir des noms d'énumération (par exemple CV_32FC1) des types d'images OpenCV?

Dans l'interface C++ à OpenCV, il semble assez facile de vérifier le type d'une image. Si vous avez une image cv::Mat img = cv::imread("someImage.xyz"), vous faites simplement int theType = img.type().

Cependant, comme vous vous en doutez, appeler img.type() donne juste un entier, pas un nom enum (par exemple CV_32FC1).

Existe-t-il un moyen simple d'imprimer le nom de l'énumération (par exemple CV_32FC1) si je connais la valeur entière de l'énumération OpenCV?

22
solvingPuzzles

À ma connaissance, une telle fonction n'existe pas dans OpenCV.

Je pense que vous feriez mieux d'écrire votre propre fonction pour les obtenir. Beaucoup de boîtiers de commutation, mais je suppose que cela fait l'affaire. L'énumération peut être trouvée ici .

MODIFIER:

C'est quelque chose que vous pouvez utiliser pour extraire les types. Je suppose qu'il pourrait y avoir une méthode plus efficace, mais je ne peux pas m'en occuper pour le moment.

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();
}
30
Sassa

En suivant les conseils de @ Bob, j'ai écrit ma propre fonction pour résoudre ce problème. C'est ici:

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

Ai-je oublié d'inclure des types d'images OpenCV dans ma table de recherche?

19
solvingPuzzles