Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放。Mat Class主要包括两部个数据部分:一个是matrix header(包括matrix的大小尺寸,储存方法,储存地址等等..),另一个是指向存储像素值的矩阵的指针。

Opencv中对Mat的复制分为两种,

Mat A, C; //creates just the header parts

A = imread(argv[1], CV_LOAD_IMAGE_COLOR); //here we'll know the method used (allocate matrix)

Mat B(A);//Use the copy constructor

C= A; //Assignment operator

Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle

Mat E = A(Range::all(), Range(1,3)); // using row and column boundaries

上面一类仅仅新建了matrix header,对与像素矩阵A,B,C共有,修改其中一项的像素值,其他的也都会改变,可以理解为他们提供了对相同底层数据的不同读取方法。 这么做的好处是为了减少计算成本。

如果仅仅想操作其中的一部分像素,可以创建一个读取部分的header matrix

当然Opencv也提供深度复制的方法

Mat F =A.clone();

Mat G;

A.copyTo(G);

Mat的创建

cv::Mat::Mat Constructor:

Mat M(2,2, CV_8UC3, Scalar(0,0,255));

cout << "M = " << endl << " " << M << endl << endl;

M.create(4,4, CV_8UC(2));

cout << "M = "<< endl << " " << M << endl << endl;

Mat E = Mat::eye(4, 4, CV_64F);

cout << "E = " << endl << " " << E << endl << endl;

Mat O = Mat::ones(2, 2, CV_32F);

cout << "O = " << endl << " " << O << endl << endl;

Mat Z = Mat::zeros(3,3, CV_8UC1);

cout << "Z = " << endl << " " << Z << endl << endl;

对于一些小的kernel可以自定义如下:

Mat C = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

cout << "C = " << endl << " " << C << endl << endl;

在对图像进行分析及操作时往往需要进行遍历或对某一区域的像素值进行操作。总结了一下比较常用的有以下几种方法。

1.利用ptr指针访问Mat像素

for(int j = 1; j < myImage.rows - 1; ++j)

{

const uchar* previous = myImage.ptr(j - 1);

const uchar* current = myImage.ptr(j );

const uchar* next = myImage.ptr(j + 1);

uchar* output = Result.ptr(j);

for(int i = nChannels; i < nChannels * (myImage.cols - 1); ++i)

{

*output++ = saturate_cast(5 * current[i]

-current[i - nChannels] - current[i + nChannels] - previous[i] - next[i]);

}

}

2.使用 Mat::at 函数

int main()

{

Mat img = imread("lena.jpg");

imshow("Lena Original", img);

if(img.channel() > 1)

{

for (int row = 0; row < img.rows; row++)

{

for (int col = 0; col < img.cols; col++)

{

/* 注意 Mat::at 函数是个模板函数, 需要指明参数类型, 因为这张图是具有红蓝绿三通道的图,

所以它的参数类型可以传递一个 Vec3b, 这是一个存放 3 个 uchar 数据的 Vec(向量). 这里

提供了索引重载, [2]表示的是返回第三个通道, 在这里是 Red 通道, 第一个通道(Blue)用[0]返回 */

if(img.at(row, col)[2] > 128)

img.at(row, col) = Vec3b(255, 255, 255);

}

}

}

else

{

for (int row = 0; row < img.rows; row++)

{

for (int col = 0; col < img.cols; col++)

{

if(img.at(row, col) > 128)

img.at(row, col) = 255;

}

}

}

imshow("Lena Modified", img);

cvWaitKey();

return 0;

}

opencv获取mat的指针_opencv中Mat类型数据操作与遍历相关推荐

  1. python查看dataframe数据类型_python pandas中DataFrame类型数据操作函数的方法

    python数据分析工具pandas中DataFrame和Series作为主要的数据结构. 本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数. 1)查看DataFrame数 ...

  2. python dataframe函数_python pandas中DataFrame类型数据操作函数的方法

    这篇文章主要介绍了关于python pandas中DataFrame类型数据操作函数的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 python数据分析工具pandas中Data ...

  3. Python—pandas中DataFrame类型数据操作函数

    python数据分析工具pandas中DataFrame和Series作为主要的数据结构.  本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数.  1)查看DataFram ...

  4. oracle的clob类型对应java,java对oracle9i中CLOB类型的操作

    这是一个完整的使用java对oracle9i的操作,其实,使用oracle10g后,操作将非常方便,但现在由于仍在使用oracle9i,所以不得不忍受这种痛苦.现将对oracle9i中CLOB类型的操 ...

  5. java中map转为json数据_Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回...

    Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回html 1.自定义工具类(简单易用)-下面是我写的一个简单的工具类前端 package com.test.util; i ...

  6. 关于Python3.7和Python3.6中元组类型数据内存存储问题

    关于Python3.7和Python3.6中元组类型数据内存存储问题 小编最近发现了一个瑕疵 当定义一个元组类型的变量后,若在程序后面再定义一个元组变量,这两个元组的内容相同,那么在不同的版本中会出现 ...

  7. mat 释放_OpenCV中Mat总结

    一.数字图像存储概述 数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵. 二.Mat的存储 1.OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘 ...

  8. matlab.mat文件读取,matlab中mat文件的生成和读取

    1.mat文件的生成 (1)直接在Matlab中创建并保存矩阵数据 打开Matlab软件,点击左上角文件(File),然后点击新建(new),选择变量(Variable),就新建了一个mat文件. 点 ...

  9. android字符串获取数字索引,从字符串中提取特定数据(Extract specific data from a string)...

    从字符串中提取特定数据(Extract specific data from a string) 我有一个带有描述的长字符串. 我想从字符串中提取一些信息. 但我无法弄明白该怎么做. 这是字符串: C ...

  10. 项目工程重启后,用RedisTemplate获取不了在redis中存在的数据

    今天碰到一个很奇怪的问题,redis中插入的数据,在工程没有重启之前,是可以读取到的,工程重启之后,就读取不到了,但是登录redis的客户端查看,发现数据其实是存在的 用的下面这种方式读写: @Ove ...

最新文章

  1. TSNE 附有codechina代码
  2. 命名空间元素的封装性
  3. 在VS2010下使用 UNICODE 和 ANSI 的混合编程
  4. YYDS!怪不得很多朋友去杭州,原来有10W+的福利!
  5. zkcli远程连接_ZooKeeper 学习笔记(二)-API 操作和应用
  6. tensorflow在训练的时候权重是nan,如何解决
  7. JSON——IT技术人员都必须要了解的一种数据交换格式
  8. Client does not support authentication protocol requested by server;
  9. Jerry给人做培训的记录
  10. cacti 忘记密码的方法
  11. java和c的反汇编_JAVAP -C反汇编指令的学习(转载)
  12. ionic 富文本编辑样式后,前台不能回显样式
  13. 力扣 买卖股票的最佳时机II
  14. 巴克莱分析师:今秋新iPhone外观设计与2018年款非常相似
  15. 双注入法/开路短路法
  16. 企业发布重要通知短信收不到该怎么办
  17. Linux 统计一段时间内的文件大小
  18. 阿里云 1H2G T5实例 与 腾讯云 1H2G 标准2实例 测试对比
  19. cosh matlab中怎么写,用MATLAB绘制cosh函数
  20. Lumia 1020 诞生:诺基亚拍照技术的一次狂欢

热门文章

  1. 阿里云原生“因云而生”心智大图重磅发布
  2. 从多云共存到多云融合:2020年多云管理市场展望
  3. python整数运算定律_PHP 操作redis 详细讲解
  4. 【优化算法】阿基米德优化算法(AOA)【含Matlab源码 1447期】
  5. 【背包问题】基于matlab离散粒子群算法求解0-1背包问题【含Matlab源码 1342期】
  6. python删库命令_python3 删除数据库
  7. 均衡器算法_必须像算法一样对算法进行仔细调整。 怎么样? 算法均衡器
  8. 台式计算机诞生,生物电脑 ①1946年,世界上第一台计算机诞生,这个庞然大物开创了一个电脑时代。从那时候起,人们不断革新、创造,把庞然大物的体积一减再减,现在我们所见的台式电脑、掌上电脑...
  9. wincc几个常用c语言编程软件,WINCC几个常用C语言编程
  10. pycharm查询mysql数据库_pycharm访问mysql数据库的方法步骤