当下人们都在谈机器学习,深度学习,人工智能,大数据,机器视觉,而这些都离不开一些主要的算法,opencv就是这么一个可以应用到工业界的优秀算法实现的库(当然搞算法的第一选择还是matlab工具)。
在mat.hpp文件里有Mat类的定义,在此之前有一大段的注释,就是对该Mat类的用法的最好理解。花点时间研读一下,大有裨益。
Mat类的实现挺复杂但也强大,是使用opencv必须了解的一个重要的类。
n-dimensional dense array class
一个n维的稠密数组类
The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array. It
can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel
volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms
may be better stored in a SparseMat ).
Mat这个类代表了一个n维稠密的数值的单通道或多通道的数组。它能被用于存储实数(或复数)数值的向量和矩阵,灰度(或彩色)图像,体素容量,向量场,点云,张量,直方图(尽管很高维的直方图可能最好存放在稀疏矩阵里)。
下面结合一个例子,说明如何对图像数据进行访问。
Mat T = imread("test.png", IMREAD_COLOR);
cout << T.type() << endl;
打印出该图像数据矩阵的类型,比如这里是CV_8UC3表明有3个通道(通常是BGR顺序),每个通道是8位无符号数即unsigned char
在opencv的Mat里,图像数据矩阵中的数据与实际看到的图像的数据是一样的摆放,即都是正的。如何取得某一位置比如i行,j列处的像素数据?
需要用到Vec3b即Vec<uchar, 3>类型
Vec<uchar, 3> pixel = T.at<Vec<unsigned char, 3>>(i,j);
cout << pixel << endl;
这就打印出了图像i行,j列处的像素值。