功能描述
使用可选的类型和变换因子将转换稀疏矩阵到密集n维矩阵。
函数原型
void convertTo( Mat& m, int rtype, double alpha=1, double beta=0 ) const;
参数释义
-
参数[out] m -输出矩阵,如果他在操作前没有合适的大小或类型它将要被重新分配 。
-
参数 [in] rtype - 所需的输出矩阵的类型,或者更确切的说是由于通道数与输入相同而产生的深度,如果类型是负值,输出矩阵将和输入矩阵具有相同的类型。
-
参数 [in] alpha - 可选,尺度变换因子。
-
参数 [in] beta - 可选,附加到尺度变换后的值上的偏移量。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
std::string getImageType(int type)
{
int typeCounts= 35; // 7个基础类型,加5个通道选项
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 };
std::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 < typeCounts; i++)
{
if (type == enum_ints[i])
return enum_strings[i];
}
return "unknown image type";
}
int main()
{
cv::Mat imageColor = cv::imread("D:\\OpenCVtest\\images\\juice.png", cv::IMREAD_COLOR);
cv::Mat imageGray = cv::imread("D:\\OpenCVtest\\images\\juice.png", cv::IMREAD_GRAYSCALE);
std::cout << "image color type:" << getImageType(imageColor.type()) << std::endl;
std::cout << "image Gray type:" << getImageType(imageGray.type()) << std::endl;
// 深度16位 3通道转换
cv::Mat imageColor2;
cv::Mat imageGray2;
imageColor.convertTo(imageColor2, CV_16UC3);
imageGray.convertTo(imageGray2, CV_16UC3);
std::cout << "image color convertTo CV_16UC3 image color type:" << getImageType(imageColor2.type()) << std::endl;
std::cout << "image Gray convertTo CV_16UC3 image Gray type:" << getImageType(imageGray2.type()) << std::endl;
// 深度16位 1通道转换
cv::Mat imageColor3;
cv::Mat imageGray3;
imageColor.convertTo(imageColor3, CV_16UC1);
imageGray.convertTo(imageGray3, CV_16UC1);
std::cout << "image color convertTo CV_16UC1 image color type:" << getImageType(imageColor3.type()) << std::endl;
std::cout << "image Gray convertTo CV_16UC1 image Gray type:" << getImageType(imageGray3.type()) << std::endl;
// 就地操作,深度16 3通道转换
imageColor.convertTo(imageColor, CV_16UC3);
imageGray.convertTo(imageGray, CV_16UC3);
std::cout << "image color convertTo CV_16UC3 image color type:" << getImageType(imageColor.type()) << std::endl;
std::cout << "image Gray convertTo CV_16UC3 image Gray type:" << getImageType(imageGray.type()) << std::endl;
}
输出结果
结论
-
convertTo函数支持转换深度,比如k可以把CV_8UC3的转换为深度CV_16UC3
-
convertTo函数不支持转换通道数,从上面运行结果看,转换后都保留了原来的通道。比如把CV_8U转换为CV_16UC3的结果是CV_16U。
-
convertTo函数支持就地操作(in-place)