opencv3编程入门学习笔记1-----基本图像容器Mat

来源:互联网 发布:tk域名注册 编辑:程序博客网 时间:2024/04/28 07:24

1、Mat的结构

  Mat本质上是由两个数据部分组成: (包含信息有矩阵的大小用于存储的方法矩阵存储的地址等)的矩阵头一个指针指向包含了像素值的矩阵(可根据选择用于存储的方法采用任何维度存储数据)。矩阵头部的大小是恒定的。然而,矩阵本身的大小因图像的不同而不同,通常是较大的数量级。因此,当你在您的程序中传递图像并在有些时候创建图像副本您需要花费很大的代价生成图像矩阵本身,而不是图像的头部。OpenCV 是图像处理库,它包含大量的图像处理函数。若要解决的计算挑战,最终大部分时间你会使用库中的多个函数。由于这一原因图像传给库中的函数是一种常见的做法。我们不应忘记我们正在谈论往往是计算量相当大的图像处理算法。我们想要做的最后一件事是通过制作不必要的可能很大的图像的拷贝进一步降低您的程序的速度。

2、创建Mat对象的方法

(1)Mat M (2,2,CV_8UC3,Scalar(0,0,255)

在Mat类中我们可以找到以下函数相关定义,也就是用指定的值填充二维矩阵,这里第一个参数是rows是矩阵的行数,第二个参数cols是矩阵的列数,也就是2*2的矩阵,而类型是CV_(位数)+(数据类型)+(通道数),CV_8UC3表明使用8位的unsigned char 型,每个像素由三个元素组成三通道。

//! constucts 2D matrix and fills it with the specified value _s.
    Mat(int rows, int cols, int type, const Scalar& s);

(2)const Scalar& s参数

这里const代表是一个常数,不能被改变。Scalar是一个类,代表的是颜色,Scalar(a,b,c)定义 的RGB颜色值:红色分量为c,绿色分量为b,蓝色分量为a.Scalar& s中s是Scalar类的指针变量。

3、创建带Alpha通道的Mat

(1)什么是Alpha通道

阿尔法通道(Alpha Channel)是指一张图片的透明和半透明度。例如:一个使用16位存储的图片,可能5位表示红色,5位表示绿色,5位表示蓝色,1位是阿尔法。在这种情况下,它要么表示透明要么不是。一个使用32位存储的图片,每8位表示红绿蓝,和阿尔法通道。在这种情况下,就不光可以表示透明还是不透明,阿尔法通道还可以表示256级的半透明度。
(2)创建带Alpha通道的Mat的函数 createAlphaMat(mat)
也就是创建4通道(RGB+透明度),其中UCHAR_MAX的宏定义为0xff,对应的是R通道,对于G通道,((float (mat.cols - j)) / ((float)mat.cols) *UCHAR_MAX)表示越往右占的百分比就越少,颜色也就越深,同理,对于B通道,((float (mat.rows - i)) / ((float)mat.rows) *UCHAR_MAX)表示越往下占的百分比就越少,颜色也就越深。最后的透明度,取值为(0.5 * (rgba[1] + rgba[2])也就是取G和B通道的平均值。
void createAlphaMat(Mat &mat)
{
for(int i = 0; i < mat.rows; ++i) {
for(int j = 0; j < mat.cols; ++j) {
Vec4b&rgba = mat.at<Vec4b>(i, j);
rgba[0]= UCHAR_MAX;
rgba[1]= saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) *UCHAR_MAX);
rgba[2]= saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) *UCHAR_MAX);
rgba[3]= saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
}
}
}


0 0
原创粉丝点击