opencv学习笔记六:图像和大型数组类型
前言
关于图像和大型数组类型,最简单直接的就是Mat类,也不必理会什么稠密数组或者稀疏数组。关于Mat类也有很多各种类型的构造函数,也不必一个个去记,只要知道最常用的Mat m ; 这种用法就行了;
我们需要额外知道的就是和固定矩阵类Matx类似的三个操作:
- cv::Mat::zeros(rows,cols,type) ; --------构造一个大小为rows*cols,数据类型为type指定类型的,值全为0的矩阵;
- cv::Mat::ones(rows,cols,type) ;---------构造值全为1的矩阵
- cv::Mat::eye(rows,cols,type) ; ----------构造单位矩阵
获取数组元素
独立获取数组元素
直接访问是通过模板函数at<>()来实现。举例:
Mat m = Mat::eye(10, 10, CV_32FC2 );
printf("Element (3,3) is %f \n",
m.at<float>(3, 3)
);
上面程序先创建了一个10*10大小的单位矩阵,然后对(3,3)处元素进行了访问。
Mat m1 = Mat::eye(10, 10, CV_32FC2 );
printf(
"Element (3,3) is (%f,%f) \n",
m.at<Vec2f>(3, 3)[0],
m.at<Vec2f>(3, 3)[1]
);
这种访问方法有很多变通,如下:
- M.at( i ) ; 整型数组M中的元素i
- M.at( i,j ) ; 浮点型数组M中的元素(i,j);
- M.at( pt ) ; 整型矩阵M处于(pt.x,pt.y)的元素
- M.at(i,j,k); 三维浮点型矩阵M中处于(i,j,k)位置的元素
- M.at(idx); 无符号字符数组M中位于idx[ ] 所索引的n维位置的元素
通过块访问数组元素
cv::Mat 区块访问有很多对象操作,下面就列举几个常用的:
- m.row( i ) ; m中的第 i 行数组
- m.col( j ) ; m中的第 j 列数组
- m.rowRange( i0,i1 ) ; M中的第i0行到第i1-1行所构成的数组
需要注意的是,当你(对数组m)使用m.col( )或者m.col()时,m的数据并没有被复制到新的数组中,比如表达式m2 = m.row( 3 ) ; 这个表达式将创建一个新的数组头,并且分配他的data指针,step数组以及其他一些东西,这样它将可以访问m中的第三行数据。如果修改了m2中得到的数据,也会修改处于m中的数据。
数组的其他操作
m1 = m0.clone();
从m0进行完全复制,该复制将复制所有的数据元素
m0.copyTo(m1);
将m0复制给m1,如果有必要,将给m1重分配内存空间(等同于m1 = m0.clone();)
m0.setTo(s,mask)
设置m0所有元素为s,如果存在mask,则只对mask指定区域进行操作
m0.push_back(s)
在末尾增加一个m*1大小的数组
m0.adjustROI(t,b,l,r)
通过四个值t(最上),b(最下) , l ( 最左) , r (最右) 来调整ROI区域的范围
m0.type()
返回m0元素的类型(比如CV_32FC3)
m0.depth()
返回m0通道中的元素类型(比如CV_32F)
m0.channels()
返回m0的通道数目
m0.size()
返回m0的大小
m0.empty()
如果数组没有元素,将返回true(比如m0.total= =0 或者 m0.data==NUILL)
此外还有与Mat稠密数组相对应的稀疏数组,当目前没用到过,也就不说了。