OpenCV Mat类的convertTo函数,数据类型转换
本文对OpenCV Mat类的convertTo函数进行了测试,测试其功能,能否改变元素类型?能否改变Mat通道数?以及是否支持就地(in-place)操作?先说结论,如下:- `convertTo`可以改变Mat的深度,例如可以把Mat的type从CV_8UC3改为CV_16SC3- `convertTo`**不**可以改变Mat的通道数,例如**不**可以把Mat的type从CV_8UC3改为
摘要
本文对OpenCV Mat类的convertTo函数进行了测试,测试其功能,能否改变元素类型?能否改变Mat通道数?以及是否支持就地(in-place)操作?
先说结论,如下:
convertTo
可以改变Mat的深度,例如可以把Mat的type从CV_8UC3改为CV_16SC3convertTo
不可以改变Mat的通道数,例如不可以把Mat的type从CV_8UC3改为CV_8UC1,即使你填入的转换类型通道数不同,输出的通道数还是与输入的通道数相同convertTo
支持就地(in-place)操作
介绍
关于convertTo官网介绍如下:
看完有两个疑惑:
- convertTo转换时,输出的通道数与输入的通道数相同,那如果我填写的rType通道数不同,会怎么样?
- 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_8U | CV_8S | CV_16U | CV_16S | CV_32S | CV_32F | CV_64F |
---|---|---|---|---|---|---|---|
C1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
C2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
C3 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
C4 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
由上表可以得到运行结果的对应关系:
结论
根据上图,那么可以推断出:
convertTo
可以改变Mat的深度,例如可以把Mat的type从CV_8UC3改为CV_16SC3convertTo
不可以改变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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)