Opencv 中 Mat中元素的值读取方法总结
原文出处:http://lib.csdn.net/article/opencv/33144
1、利用 at 函数读取
(1)单通道图像读取方式
- Mat img1 = imread(filename,IMREAD_GRAYSCALE);
- for( size_t nrow = 0; nrow < img1.rows; nrow++)
- {
- for(size_t ncol = 0; ncol < img1.cols; ncol++)
- {
- uchar val = mat_CV_8UC1.at<uchar>(nrow,ncol);
- }
- }
(2) 三通道图像读取方式
- Mat img2 = imread(filename,IMREAD_COLOR);
- for( size_t nrow = 0; nrow < img2.rows; nrow++)
- {
- for(size_t ncol = 0; ncol < img2.cols; ncol++)
- {
- Vec3i bgr = mat_CV_8UC3.at<Vec3b>(nrow,ncol);//用Vec3b也行
- cout << "("<<bgr.val[0]<<","
- <<bgr.val[1]<<","
- <<bgr.val[2]<<")";
- }
- cout << endl;
- }
2、使用指针读取
- for( size_t nrow = 0; nrow < img3.rows; nrow++)
- {
- uchar* data = img3.ptr<uchar>(nrow);
- for(size_t ncol = 0; ncol < img3.cols * img3.channels(); ncol++)
- {
- cout << int( data[ncol] ) ;
- }
- cout << endl;
- }
3、使用迭代器
- Mat img4 = imread(filename,IMREAD_GRAYSCALE);
- MatIterator_<uchar> it = img4.begin<uchar>(), it_end = img4.end<uchar>();
- for(int cnt = 1; it != it_end; ++it)
- {
- cout << ( int(*it) ) ;
- if( (cnt++ % img4.cols) ==0 )
- cout << endl;
- }
4、使用矩阵元素的地址定位知识
- Mat img5(rows, cols,CV_8U, Scalar(0));
- for( size_t nrow = 0; nrow < img5.rows; nrow++)
- for(size_t ncol = 0; ncol < img5.cols; ncol++)
- {
- cout<<(int)(*(img5.data+img5.step[0]*nrow+img5.step[1]*ncol));
- }
5、补充:在使用 at 函数的情况下需要预先知道Mat变量中存储的元素类型,如果类型不匹配就会出现读错误。所以可以采用c++ boost库中的BOOST_TYPEOF来获取图像的元素数据类型。
例:
- Mat img6 = imread(filename);
- typedef BOOST_TYPEOF(*img6.data) ElementType
- for( size_t nrow = 0; nrow < img1.rows; nrow++)
- {
- for(size_t ncol = 0; ncol < img1.cols; ncol++)
- {
- cout<<mat_CV_8UC1.at<ElementType>(nrow,ncol);
- }
- }
Opencv 中 Mat中元素的值读取方法总结相关推荐
- 算法2.2 已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。
数据结构(C语言版)严蔚敏 吴伟民 算法2.2 已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列.例如,设 LA= ...
- 已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。例如,设 LA=(3,5,8,11) LB=(2,6,8,9,1
已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列.例如,设 LA=(3,5,8,11) LB=(2,6,8,9,1 ...
- python如何读取数据保存为新格式_Python Numpy中数据的常用保存与读取方法
在经常性读取大量的数值文件时(比如深度学习训练数据),可以考虑现将数据存储为Numpy格式,然后直接使用Numpy去读取,速度相比为转化前快很多. 下面就常用的保存数据到二进制文件和保存数据到文本文件 ...
- Python中键映射多个值的方法:defaultdict
Python中键映射多个值的方法有两种: 想保持元素的插入顺序就应该使用列表: 想去掉重复元素就使用集合并且不关心元素的顺序问题的话应该使用set from collections import de ...
- php取json子对象属性,php中输出json对象的值(实现方法)
实例如下所示: $json = '{"report":{"date":"2012-04-10","content":&q ...
- opencv的Mat中step的解释
网络上对Mat的详解,绝大多数是翻译官方的manual,而官方的manual却恰好对部分(官方认为)我们平时很少使用的内容没有详细的解释,或者对一些实现没有解释细节,因此我们就很难在刚入门时迅速地对某 ...
- OpenCV 笔记(06)— Mat 结构、像素值存储方法、创建 Mat 对象各种方法、Mat 对象的运算
数字图像中的每个点都称为像素(对于图像元素),并且每个像素可以存储一个或多个值,这取决于它是否是仅存储一个值的黑白图像(也称为二进制图像,比如只存储0或1),还是存储两个值的灰度图像,或者是存储三个值 ...
- python中修改列表元素的2种方法
一.在for循环中直接更改列表中元素的值不会起作用: 如: l = list(range(10)[::2]) print (l) for n in l: n = 0 print (l) 运行结果: [ ...
- Java删除ArrayList中的重复元素的2种方法
ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素,重复的元素,并保持元素的插入顺序.在编码时我们经常会遇到那种必须从已建成的ArrayList中删除重复元素的要求.这 ...
最新文章
- no argument specified with option /LIBPATH:错误的解决
- ThinkPHP连接数据库
- linux 入侵检测
- SpringBoot取出信息
- c语言实现天气预报步骤,天气预报是怎么预测天气的?天气预报制定需要哪些步骤...
- 从零开发一个命令行脚手架工具 等
- 光纤交换机产品功能介绍
- python模拟并发是多线程_Python并发编程之多线程
- php bmp中创建图像bmp2gd,让GD支持32位BMP
- Python中非纯文本文件的读取
- Java项目-食堂菜品点评系统(SpringBoot + SpringSecurity + Thymeleaf + Redis)
- 使用 Transmission 制作种子命令
- 信息论与编码_信道编码
- python安装教程
- 【JAVA复习系列】第一部分
- 搜索和浏览离线 Wikipedia 维基百科(中/英)数据工具
- LCA 最近公共祖先 (倍增算法)
- oracle定时器每天下午6点_强力巨彩冠名!6月23日下午15点直播抢先看
- C++核心准则​讨论:析构,释放和交换操作必须永不失败
- Java虚拟机:Java虚拟机结构
热门文章
- 10-2 使用Channel等待任务结束
- 计算机专业本科毕业答辩问题及回答
- linux安装步骤_图解 Debian 10(Buster)安装步骤 | Linux 中国
- 我用Python抓取了【S11全球总决赛】直播评论,EDG nb
- idea 删除补丁_带着好奇心去探索IDEA
- java抓取屏幕像素,以像素为单位获取屏幕尺寸
- java 表格树_00030-layui+java 树形表格treeTable
- php中函数的使用方法,php中header()函数的使用方法
- gflags.lib(gflags.obj) : error LNK2001: 无法解析的外部符号 __imp_PathMatchSpecA
- 致谢计算机组成原理老师的致谢,计算机组成原理课程报告(40页)-原创力文档...