获取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数据结构的所有微妙之处,所以我很高兴您指出了这一点。