OpenCV数据类型转换:cnvertTo函数的使用

功能描述

使用可选的类型和变换因子将转换稀疏矩阵到密集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)

猜你喜欢

转载自blog.csdn.net/jndingxin/article/details/109739241