浅谈opencv中的Mat在处理图像数据中的用法

来源:互联网 发布:宁波行知实验小学网站 编辑:程序博客网 时间:2024/05/16 14:21

当下,满大街都在谈机器学习,深度学习,人工智能,大数据,机器视觉,而这些都离不开一些主要的算法,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列处的像素值。


原创粉丝点击