浅谈Opencv Mat类(常用构造函数和成员函数整理)
来源:互联网 发布:php开源库存管理系统 编辑:程序博客网 时间:2024/06/06 02:56
在Opencv1代的时候,是使用lplImage 和 CvMat 数据结构来表示图像的。他们都是C语言的结构,申请的内存需要自己手动管理。从Opencv2.3往后就引入了Mat类,他可以自动管理内存,而我接触opencv开始,用的就是Mat类,再之后在学习opencv过程中才接触了lplImage和CvMat 但是这两个数据结构毕竟给我们带来了一定的负担,所以我不是很喜欢用。所以lplImage 和 CvMat 就不聊了。我们还是看看Mat类。
Mat类关键的属性和定义如下:
class CV_EXPORTS Mat{public:/ /一系列函数.../*flag 参数中包含序号关于矩阵的信息,如: -Mat 的标识 -数据是否连续 -深度 -通道数目 */int flags;int dims ;//!数组的维数,取值大于等于2//!行和列的数量,如果矩阵超过 2 维,那这两个值为-1int rows,cols;uchar *data ;//!指向数据的指针int * refcount ;//!指针的引用计数器 ;/ / 阵列指向用户分配的数据时,当指针为 NULL/ / 其他成员...};
然后我们看看Mat常用的构造函数:
1、Mat::Mat()
无参数构造方法;
2、Mat::Mat(int rows, int cols, int type)
创建行数为 rows,列数为 col,类型为 type 的图像;
3、Mat::Mat(Size size, int type)
创建大小为 size,类型为 type 的图像;
4、Mat::Mat(int rows, int cols, int type, const Scalar& s)
创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始化为值 s;
5、Mat::Mat(Size size, int type, const Scalar& s)
创建大小为 size,类型为 type 的图像,并将所有元素初始化为值 s;
6、Mat::Mat(const Mat& m)
将m赋值给新创建的对象,此处不会对图像数据进行复制,m和新对象共用图像数据,属于浅拷贝;
7、Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
创建行数为rows,列数为col,类型为type的图像,此构造函数不创建图像数据所需内存,而是直接使用data所指内存,图像的行步长由 step指定。
8、Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
创建大小为size,类型为type的图像,此构造函数不创建图像数据所需内存,而是直接使用data所指内存,图像的行步长由step指定。
9、Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
创建的新图像为m的一部分,具体的范围由rowRange和colRange指定,此构造函数也不进行图像数据的复制操作,新图像与m共用图像数据;
10、Mat::Mat(const Mat& m, const Rect& roi)
创建的新图像为m的一部分,具体的范围roi指定,此构造函数也不进行图像数据的复制操作,新图像与m共用图像数据。
这些构造函数中,很多都涉及到类型type。type可以是CV_8UC1,CV_16SC1,…,CV_64FC4 等。里面的 8U 表示 8 位无符号整数,16S 表示 16 位有符号整数,64F表示 64 位浮点数(即 double 类型);C 后面的数表示通道数,例如 C1 表示一个
通道的图像,C4 表示 4 个通道的图像,以此类推。
如果你需要更多的通道数,需要用宏 CV_8UC(n),例如:
Mat M(3,2, CV_8UC(5));//创建行数为 3,列数为 2,通道数为 5 的图像。
构造函数就说到这里,然后我们看看Mat类常用的成员函数:
Mat::Create
创建新的阵列数据
void Mat::create(int rows, int cols, int type)void Mat::create(Size size, int type)void Mat::create(int ndims, const int* sizes, inttype)
ndims – 新数组的维数。
rows –新的行数。
cols – 新的列数。
size – 替代新矩阵大小规格:Size(cols, rows)。
sizes – 指定一个新的阵列形状的整数数组。
type – 新矩阵的类型。
Mat::resize
重新定义图片大小
void Mat::resize(size_t sz)void Mat::resize(size_t sz, const Scalar& s)
sz –新的行数。
s –分配给新添加的元素的值。
Mat::adjustROI
调整子阵大小及其在父矩阵中的位置
Mat& Mat::adjustROI(int dtop, int dbottom,int dleft, int dright)
dtop –顶部子阵边界向上的平移量。
dbottom –底部子阵边界向下的平移量。
dleft –左子阵边界向左的平移量。
dright –右子阵边界向右的平移量。
Mat::total
返回数组元素的总数
size_t Mat::total() const
Mat::isContinuous
判断矩阵是否连续
bool Mat::isContinuous() const
Mat::elemSize
返回矩阵元素大小 (以字节为单位)。
size_t Mat::elemSize() const
该方法返回以字节为单位的矩阵元素大小。例如,如果矩阵类型是 CV_16SC3,该方法返回3*sizeof(short)或 6。
Mat::elemSize1
以字节为单位返回每个矩阵元素通道的大小。
size_t Mat::elemSize1() const
该方法返回以字节为单位的矩阵元素通道大小,也就是忽略通道的数量。例如,
如果矩阵类型是 CV_16SC3,该方法返回 sizeof(short) 或 2。
Mat::type
返回一个矩阵元素的类型。
int Mat::type() const
该方法返回一个矩阵的元素类型。这是兼容CvMat 类型系统,像 CV_16SC3标识符
或 16 位有符号的3 通道阵列,等等。
Mat::depth
返回一个矩阵元素的深度。
int Mat::depth() const
该方法返回矩阵元素深度(每个单独的通道类型)的标识符。例如,对于16位有符号的3通道数组,该方法返回CV_16S。矩阵类型的完整列表包含以下内容值:
• CV_8U-8 位无符号整数 (0…..255)
• CV_8S-8 位符号整数 (-128…..127)
• CV_16U-16 位无符号整数 (0……65535)
• CV_16S-16 位符号整数 (-32768…..32767)
• CV_32S-32 位符号整数 (-2147483648……2147483647)
• CV_32F-32 位浮点数 (-FLT_MAX ………FLT_MAX,INF,NAN)
• CV_64F-64 位浮点数(-DBL_MAX ……….DBL_MAX,INF,NAN)
Mat::channels
返回矩阵通道的数目。
int Mat::channels() const
Mat::step1
返回矩阵归一化迈出的一步。
size_t const Mat::step1()
该方法返回以矩阵的step除以Mat::elemSize1()。它对快速访问任意矩阵元素很有用。
Mat::size
返回一个矩阵大小。
Size Mat::size() const
该方法返回一个矩阵大小:Size(cols, rows)。矩阵超过 2 维时返回大小为(-1,-1)。
Mat::empty
如果数组有没有 elemens,则返回 true。
bool Mat::empty() const
如果 Mat::total() 是 0 或 Mat::data 为 NULL,则方法返回 true。因为pop_back() 和 resize()方法M.total()== 0,并不意味着M.data = =NULL。
Mat::ptr
返回指定矩阵行的指针。
uchar* Mat::ptr(int i=0)const uchar* Mat::ptr(int i=0) consttemplate<typename _Tp> _Tp* Mat::ptr(inti=0)template<typename _Tp> const _Tp*Mat::ptr(int i=0) const
参数:
i –一个基于0的行索引。
Mat::at
返回对指定数组元素的引用。
template<typename T> T& Mat::at(int i)consttemplate<typename T> const T&Mat::at(int i) consttemplate<typename T> T& Mat::at(int i,int j)template<typename T> const T&Mat::at(int i, int j) consttemplate<typename T> T& Mat::at(Pointpt)template<typename T> const T&Mat::at(Point pt) consttemplate<typename T> T& Mat::at(int i,int j, int k)template<typename T> const T&Mat::at(int i, int j, int k) consttemplate<typename T> T& Mat::at(constint* idx)template<typename T> const T&Mat::at(const int* idx) const
参数
i –索引 0 维度
j – 1 维度的索引
k – 沿 2 维度的索引
pt – Point(j,i) 作为指定元素的位置。
idx – Mat::dims 数组的索引。
该模板方法返回指定数组元素的引用。为了具有更高的性能,索引范围检查只在调试配置下执行。请注意使用具有单个索引 (i) 的变量可以访问的单行或单列的2 维的数组元素。也就是比方说,如果A是1 x N 浮点矩阵和B是M x 1的整数矩阵,您只需编写A.at(k+4) 和 B.at(2*i+1) 分别代替A.at(0,k+4)和
B.at(2*i+1,0)。
//下面的示例将初始化希尔伯特矩阵:Mat H(100, 100, CV_64F);for(inti=0; i<H.rows; i++)for(intj=0; j<H.cols; j++)H.at<double>(i,j)=1./(i+j+1);
Mat::begin
返回矩阵迭代器,并将其设置为第一矩阵元。
template<typename _Tp>MatIterator_<_Tp> Mat::begin()template<typename _Tp>MatConstIterator_<_Tp> Mat::begin() const
该方法返回矩阵的只读或读写的迭代器。矩阵迭代器的使用和双向 STL 迭代器的使用是非常相似的。在下面的示例中,alpha融合函数是使用矩阵迭代器重写:
template<typename T>void alphaBlendRGBA(const Mat& src1,const Mat& src2, Mat& dst){ typedef Vec<T, 4> VT; const float alpha_scale =(float)std::numeric_limits<T>::max(), inv_scale = 1.f/alpha_scale; CV_Assert( src1.type() == src2.type()&& src1.type() == DataType<VT>::type&& src1.size() == src2.size()); Size size = src1.size(); dst.create(size, src1.type()); MatConstIterator_<VT> it1 =src1.begin<VT>(), it1_end = src1.end<VT>(); MatConstIterator_<VT> it2 =src2.begin<VT>(); MatIterator_<VT> dst_it =dst.begin<VT>(); for( ; it1 != it1_end; ++it1, ++it2,++dst_it ) { VT pix1 = *it1, pix2 = *it2; float alpha = pix1[3]*inv_scale, beta =pix2[3]*inv_scale; *dst_it =VT(saturate_cast<T>(pix1[0]*alpha + pix2[0]*beta), saturate_cast<T>(pix1[1]*alpha + pix2[1]*beta), saturate_cast<T>(pix1[2]*alpha +pix2[2]*beta), saturate_cast<T>((1 -(1-alpha)*(1-beta))*alpha_scale)); }}
Mat::end
返回矩阵迭代器,并将其设置为 最后元素之后(after-last)的矩阵元。
template<typename _Tp>MatIterator_<_Tp> Mat::end()template<typename _Tp>MatConstIterator_<_Tp> Mat::end() const
该方法返回矩阵只读或读写的迭代器,设置为紧随最后一个矩阵元素的点。
Mat的构造和常用的成员函数就梳理到这里了,如果有未提到的后续会继续补充。
- 浅谈Opencv Mat类(常用构造函数和成员函数整理)
- opencv Mat() 构造函数
- 浅谈C#中构造函数和成员函数
- opencv中Mat类成员函数clone()和copyto()的区别
- 构造函数和成员函数
- OpenCV学习:Mat类详细解析+源码剖析(二)构造函数
- Opencv中的Mat类型常用函数数据
- opencv常用函数整理(一)
- opencv常用函数整理(二)
- opencv图像拼接,即把两个矩阵合并为一个(vconcat和hconcat)、Mat成员函数size()
- 浅谈C++类(1)--概念和构造函数
- 浅谈C++类(1)--概念和构造函数
- 浅谈C++类(1)--概念和构造函数
- OpenCV中的Mat函数
- 构造函数和成员函数的区别(通用)
- const成员函数和构造函数
- C++成员函数和构造函数
- 拷贝构造函数和const成员函数
- 剑指offer-从尾到头打印链表
- 计算机网络系列(11)之应用场景Virtual Private Networks
- MIT18.06线性代数课程笔记17:正交标准矩阵
- codeforce 895B XK Segments (结论)
- 纯css写出爱心版加载效果,等待加载也是一种享受
- 浅谈Opencv Mat类(常用构造函数和成员函数整理)
- C语言第二讲
- java泛型详解和反射泛型通用BaseDao实现
- 1003. 我要通过!(20)
- ctguoj-取石头 (15分)
- cisco 命令行(静态路由 配置)CCNA
- JSP内置对象(下)
- 编译原理-递归子程序法
- 设计模式的艺术之道--建造者模式