一、什么是图像像素值数据类型
不同的图像有不同的像素类型,不过对于不同的像素类型,需要在模板参数传入不同的值。
首先像素的数据类型包括CV_32U,CV_32S,CV_32F,CV_8U,CV_8UC3等,那这些类型都是
什么含义呢;第一个数字表示比特数,第二个数字就表示C++中数据类型,如果还有后面两个字
符,这两个字符表示通道数。例如对于CV_32U,表示具有32比特的unsigned int类型;对于
CV_8UC3,表示具有8比特,并且有三个通道的unsigned char类型。对于这个类型,可以使用
type()来获取。
根据这些类型,又可以分为两种,一种单通道的,一种多通道的;单通道的一个像素用一个数
值表示即可,而多通道的一个像素需要用多个像素表示,最常用的三通道就需要RGB这三个数值
来表示。那具体的通道顺序是什么呢?在OpenCV中,则是按BGR的顺序来存储的,用数字代替
就是B用channels[0]来获取,G用channels[1]来获取,R用channels[2]来获取。Opencv的设计
者就是这样设计的,记住就好了。
二、代码实现
在做图像处理时,图像数据并非都是 CV_8U,此时需要对图像数据类型进行查看,以便后续处理,主要代码如下:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
string Type2String(int type)
{
string strType;
uchar depth = type & CV_MAT_DEPTH_MASK;
uchar chans = 1 + (type >> CV_CN_SHIFT);
switch (depth)
{
case CV_8U:
strType = "CV_8U"; break;
case CV_8S:
strType = "CV_8S"; break;
case CV_16U:
strType = "CV_16U"; break;
case CV_16S:
strType = "CV_16S"; break;
case CV_32S:
strType = "CV_32S"; break;
case CV_32F:
strType = "CV_32F"; break;
case CV_64F:
strType = "CV_64F"; break;
default:
strType = "UNKNOWN_TYPE"; break;
}
strType += "C";
strType += (chans + '0');
return strType;
}
void main()
{
Mat img = imread("1.tif", IMREAD_UNCHANGED);
cout << img.type() << endl;
cout << Type2String(img.type()) << endl;
}
说明:该博客属于转载,意在做笔记!!!