opencv学习笔记六:图像和大型数组类型

前言

关于图像和大型数组类型,最简单直接的就是Mat类,也不必理会什么稠密数组或者稀疏数组。关于Mat类也有很多各种类型的构造函数,也不必一个个去记,只要知道最常用的Mat m ; 这种用法就行了;
我们需要额外知道的就是和固定矩阵类Matx类似的三个操作:

  1. cv::Mat::zeros(rows,cols,type) ; --------构造一个大小为rows*cols,数据类型为type指定类型的,值全为0的矩阵;
  2. cv::Mat::ones(rows,cols,type) ;---------构造值全为1的矩阵
  3. 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]
	);

这种访问方法有很多变通,如下:

  1. M.at( i ) ; 整型数组M中的元素i
  2. M.at( i,j ) ; 浮点型数组M中的元素(i,j);
  3. M.at( pt ) ; 整型矩阵M处于(pt.x,pt.y)的元素
  4. M.at(i,j,k); 三维浮点型矩阵M中处于(i,j,k)位置的元素
  5. M.at(idx); 无符号字符数组M中位于idx[ ] 所索引的n维位置的元素

通过块访问数组元素

cv::Mat 区块访问有很多对象操作,下面就列举几个常用的:

  1. m.row( i ) ; m中的第 i 行数组
  2. m.col( j ) ; m中的第 j 列数组
  3. 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稠密数组相对应的稀疏数组,当目前没用到过,也就不说了。

全部评论

相关推荐

产品经理傅立叶:1.建议把个人信息码一下 2.简历的排版还得优化一下,看上去有点乱,另外有一个实习经历实习时间好像多写了一个; 3.实习产出要量化
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务