摘要

本文对OpenCV Mat类的convertTo函数进行了测试,测试其功能,能否改变元素类型?能否改变Mat通道数?以及是否支持就地(in-place)操作?

先说结论,如下:

  • convertTo可以改变Mat的深度,例如可以把Mat的type从CV_8UC3改为CV_16SC3
  • convertTo可以改变Mat的通道数,例如可以把Mat的type从CV_8UC3改为CV_8UC1,即使你填入的转换类型通道数不同,输出的通道数还是与输入的通道数相同
  • convertTo支持就地(in-place)操作

介绍

关于convertTo官网介绍如下:
在这里插入图片描述
看完有两个疑惑:

  1. convertTo转换时,输出的通道数与输入的通道数相同,那如果我填写的rType通道数不同,会怎么样?
  2. convertTo支不支持就地(in-place)操作?
    下面来测试一下。

测试代码

测试代码如下:

//验证 convertTo 是否支持in place  和 改变通道数
#include <opencv2/opencv.hpp>  //头文件
using namespace cv;  //包含cv命名空间
using namespace std;  

void main( )
{    
	// 【1】读入一张图片,载入图像
	Mat ImgColor = imread("1.jpg", IMREAD_COLOR);// CV_8UC3
	Mat ImgGray = imread("1.jpg", IMREAD_GRAYSCALE);// CV_8UC1
	cout << "original" << endl;
	cout << "ImgColor.type()" << ImgColor.type() << endl;
	cout << "ImgGray.type()" << ImgGray.type() << endl << endl;

	// 能否转为16位深度3通道
	Mat ImgColorC3;
	Mat ImgGrayC3;
	ImgColor.convertTo(ImgColorC3, CV_16UC3);
	ImgGray.convertTo(ImgGrayC3, CV_16UC3);
	cout << "convertTo CV_16UC3" << endl;
	cout << "ImgColorC3.type()" << ImgColorC3.type() << endl;
	cout << "ImgGrayC3.type()" << ImgGrayC3.type() << endl << endl;

	// 能否转为16位深度1通道
	Mat ImgColorC1;
	Mat ImgGrayC1;
	ImgColor.convertTo(ImgColorC1, CV_16UC1);
	ImgGray.convertTo(ImgGrayC1, CV_16UC1);
	cout << "convertTo CV_16UC1" << endl;
	cout << "ImgColorC1.type()" << ImgColorC1.type() << endl;
	cout << "ImgGrayC1.type()" << ImgGrayC1.type() << endl << endl;

	// convertTo是否支持in-place 操作
	ImgColor.convertTo(ImgColor, CV_16UC3);
	ImgGray.convertTo(ImgGray, CV_16UC3);
	cout << "in place" << endl;
	cout << "ImgColor.type()" << ImgColor.type() << endl;
	cout << "ImgGray.type()" << ImgGray.type() << endl << endl;

}  

测试结果

运行结果如下:
在这里插入图片描述
结果分析:
首先,我们要知道type()返回的值得含义,Mat.type()的返回值对应类型如下(其中CV_8U表示元素类型为uchar,C3表示通道数为3,希望理解更多type的含义见这里):

CV_8UCV_8SCV_16UCV_16SCV_32SCV_32FCV_64F
C10123456
C2891011121314
C316171819202122
C424252627282930

由上表可以得到运行结果的对应关系:
在这里插入图片描述

结论

根据上图,那么可以推断出:

  • convertTo可以改变Mat的深度,例如可以把Mat的type从CV_8UC3改为CV_16SC3
  • convertTo可以改变Mat的通道数,例如可以把Mat的type从CV_8UC3改为CV_8UC1,即使你填入的转换类型通道数不同,输出的通道数还是与输入的通道数相同。
  • convertTo支持就地(in-place)操作

相关/参考链接

OpenCV convertTo官方介绍:https://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html#a3f356665bb0ca452e7d7723ccac9a810
OpenCV Mat类型介绍:https://www.jianshu.com/p/204f292937bb

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐