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稠密数组相对应的稀疏数组,当目前没用到过,也就不说了。

全部评论

相关推荐

Tom哥981:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务