早期的OpenCV使用IplImage和CvMat数据结构来表示图像。OpenCV 2.0引入了C++类Mat来管理图像数据(矩阵)。
矩阵元素的表达
对于单通道图像,元素类型一般为8U,也可以是16S、32F等,它们可以直接用uchar、short、float等C/C++的基本数据类型表达。
对于多通道图像,如果仍然将图像视作二维矩阵,矩阵元素就不再是基本数据类型。此时可以将OpenCV中表示向量的模板类Vec用于表达矩阵元素。例如:
typedefVec<uchar2> Vec2b
typedefVec<uchar, 3> Vec3b
typedefVec<uchar, 4> Vec4b
typedefVec<float, 2> Vec2f
typedefVec<float, 3> Vec2f
typedefVec<float, 4> Vec4f
对于Vec对象,可以使用[]符号如操作数组般读写其元素:
矩阵元素的读写
at()函数
函数at()可以读取或赋值矩阵的某个元素。
需要注意的是,并不推荐使用at() 函数来遍历图像。这个函数的优点是代码的可读性高,但是其效率并不高。
迭代器
C++ STL库的迭代器(iterator)可以方便地遍历矩阵的所有元素。
数据指针
也可以通过C/C++中的指针操作来访问矩阵元素。
用指针操作来访问像素是非常高效的。若程序的运行速度是一个重要指标,建议遍历像素时使用指针,但是务必十分小心。C/C++ 中的指针操作是不进行类型以及越界检查的,如果指针访问出错,程序运行时有时候可能看上去一切正常,有时候却会突然弹出“段错误”(segment faultsegment fault)。所以,如果对指针使用没有自信,不建议直接通过指针操作来访问矩阵元素。虽然 at() 函数和迭代器也不能保证对像素访问进行充分的检查,但是总是比指针操作要可靠一些。