获取OpenCV图像类型的枚举名称(例如CV_32FC1)? 在OpenCV的C++接口中,检查图像的类型似乎很容易。如果您有一个映像cv::Mat img=cv::imread(“someImage.xyz”),只需执行int theType=img.type()

获取OpenCV图像类型的枚举名称(例如CV_32FC1)? 在OpenCV的C++接口中,检查图像的类型似乎很容易。如果您有一个映像cv::Mat img=cv::imread(“someImage.xyz”),只需执行int theType=img.type(),c++,image-processing,opencv,enums,image-formats,C++,Image Processing,Opencv,Enums,Image Formats,但是,正如您所料,调用img.type()只会给出一个整数,而不是枚举名(例如CV_32FC1) 如果我知道OpenCV枚举的整数值,是否有一种简单的方法来打印枚举名称(例如CV_32FC1) 据我所知,OpenCV中不存在这样的函数 我认为您最好编写自己的函数来获取这些。很多开关箱,但我想它能起作用。可以找到枚举 编辑: 这是可以用来提取类型的东西。我想可能会有一种更有效的方法,但我现在还不知道该怎么办 std::string getImageType(int number) { //

但是,正如您所料,调用
img.type()
只会给出一个整数,而不是枚举名(例如
CV_32FC1


如果我知道OpenCV枚举的整数值,是否有一种简单的方法来打印枚举名称(例如
CV_32FC1

据我所知,OpenCV中不存在这样的函数

我认为您最好编写自己的函数来获取这些。很多开关箱,但我想它能起作用。可以找到枚举

编辑:

这是可以用来提取类型的东西。我想可能会有一种更有效的方法,但我现在还不知道该怎么办

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();
}
std::string getImageType(整数)
{
//查找类型
int-imgTypeInt=编号%8;
std::string imgTypeString;
开关(imgTypeInt)
{
案例0:
imgTypeString=“8U”;
打破
案例1:
imgTypeString=“8S”;
打破
案例2:
imgTypeString=“16U”;
打破
案例3:
imgTypeString=“16S”;
打破
案例4:
imgTypeString=“32S”;
打破
案例5:
imgTypeString=“32F”;
打破
案例6:
imgTypeString=“64F”;
打破
违约:
打破
}
//查找频道
int通道=(数字/8)+1;
std::stringstream类型;

键入按照@Bob的建议,我编写了自己的函数来解决这个问题。它是:

// 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";
}
//获取数字图像类型数字(来自cv::Mat.type()),获取OpenCV的枚举字符串。
字符串getImgType(int-imgTypeInt)
{
int numgtypes=35;//7个基本类型,每个类型有五个通道选项(无或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};
字符串枚举字符串[]={“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”};

对于(int i=0;i对于那些碰巧熟悉CUDA的人,我正在寻找的OpenCV函数有点像CUDA中的
cudaGetErrorString(int)
函数。思考得好。我按照你的建议编写了一些代码来实现这一点。请参阅下面的答案。而不是使用ints(在您在特定构建中检查它们时,它们是正确的)您应该使用枚举本身。
case 8U:str=“8U”
如果枚举在另一个版本中发生更改,那么您一定要确保它们正确。不过,您必须注意两件事。首先,没有零通道的情况,总是至少有一个通道,这实际上意味着CV_8U=CV_8UC1等。其次,根据2.4.2文档,您最多可以有CV_CN_MAX通道tion设置为512,因此您将自己限制为4个通道。我写了一些东西,请参阅我的编辑,确保测试它,因为我没有编译它。@Bob您确定实现了5到512像素的枚举吗?编译器说CV_8UC5没有定义。它们没有定义,但它们是使用CV_MAKETYPE派生的,例如CV_MAKETYPE(CV_32F,5);当然,如果您不打算使用这么多通道,您可以使用您的函数,只需删除CV_8U等,因为它们返回与CV_8UC1相同的结果etc@Bob啊,这是有道理的。我试图理解cv::Mat数据结构的所有微妙之处,所以我很高兴您指出了这一点。