赞
踩
OpenCV是一个基于BSD许可(开源)发行的轻量级跨平台计算机视觉库。它可以运行在Linux、Windows、Android和Mac OS操作系统上。它由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java MATLAB的接口。
三原色原理和RGB色彩模式
色彩模式是数字领域表示颜色的一种算法,自然界中所有颜色的光都可以由红(R)绿(G)蓝(B)三种光按照不同比例混合而成。据此原理,计算机屏幕上每个像素点可以被划分为红绿蓝三种色彩通道,分别表示这三种颜色的强度,这就是RGB色彩模式。在RGB色彩模式下,每个通道用一个字节大小的空间来储存,故每个通道所表示的颜色强度可量化为0到255,当所有通道值均为0时,该像素点显示为纯黑色,反之,当所有通道值均为255时,该像素点显示为纯白色。
对于一幅图像,即为一堆像素点排列为一个矩阵,而每个像素点均由RGB三个通道组成,大多数图片格式下,三通道的顺序为RGB,而在OpenCV中,顺序为BRG。一幅n×m大小的图片,用OpenCV读取后,在内存中的排布方式如下图所示:
按照矩阵顺序依次存储每个像素点的值,每个像素点包含BGR三个通道,总内存消耗为n×m×3 bytes,这种排布方式称为HWC。除此之外,还有一种排布方式为,依次先存储每个像素点的R通道,存完之后再依次存储每个像素点的G通道,最后存储每个像素点的B通道,内存消耗与HWC相同,只是排列方式不同,这种排列方式被成为CHW,当前流行的深度学习前向框架caffe采用的输入就是CHW的格式
1.Mat
Mat是OpenCV自定的数据结构,代表的是矩阵(Matrix),如上一章所讲,图像其实也是一种二维矩阵,所以在OpenCV中,不论进行矩阵运算,或是图像处理,都是使用Mat类型进行管理。
Mat主要分为矩阵头和矩阵数据,其中矩阵头中存储着矩阵的基本信息,主要包括矩阵长、宽、像素形态、像素深度、通道数、色彩模式、以及指向矩阵数据的指针等。
OpenCV是一个图像处理库,它包含大量的图像处理功能。为了解决计算挑战,大多数时候会使用到库的多个功能。因此,将图像传递给功能是常见的用法,为了避免制作不必要的大图像副本,OpenCV使用引用计数系统。这个方法是每个Mat对象都有自己的头,但是通过使它们的矩阵指针指向相同的地址,矩阵可以在它们的两个实例之间共享。此外,复制操作符只会复制矩阵头和指针,而不是数据本身。
- int main(int argc, char* argv[])
- {
- cv::Mat A, C;
-
- A = cv::imread(argv[1], IMREAD_COLOR)
-
- cv::Mat B(A);
-
- C = A;
- }
对于上述所有Mat对象,最后指向相同的矩阵数据。
如果想复制矩阵本身,可以使用OpenCV提供的cv :: Mat :: clone()和cv :: Mat :: copyTo()函数。
对于一个Mat对象,获取其最基本的信息的接口如下:
矩阵高(行数):Mat.rows
矩阵宽(列数):Mat.cols
矩阵通道数:int Mat::channels() const
像素深度:int Mat::depth() const
像素深度返回值如下:
CV_8U |
每个像素占8位,无符号整型(uchar) |
CV_8S |
每个像素占8位,有符号整型(char) |
CV_16U |
每个像素占16位,无符号整型(ushort) |
CV_16S |
每个像素占16位,有符号整型(short) |
CV_32S |
每个像素占32位,有符号整型(int) |
CV_32F |
每个像素占32位,浮点型(float) |
CV_64F |
每个像素占64位,浮点型(double) |
像素形态:int Mat::type() const
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。