0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV的Mat数据格式及其遍历的程序资料说明

C语言专家集中营 来源:未知 2019-02-17 09:42 次阅读

在opencv早期的版本中,图像通过一个叫做IplImage的结构(structure)存储在内存中。由于C语言程序员高度的信任,因此它需要手动地对内存进行管理,比如内存的分配和回收,这在大型程序设计中是比较麻烦的。幸运地是,C++可以很好地帮助程序员管理内存,因此opencv2.0后就引入了C++接口。但是C++也有缺点,比如说目前大部分的嵌入式系统只支持C语言,在这些平台上开发opencv程序的话用C++就不是很好。

cv::Mat是一个C++类,包含两部分:1)Matrix header,包括矩阵的size、存储方式、矩阵的存储地址等信息;2)指向Marix的指针ji。由于图像处理算法通常都是计算密集型算法,出于程序速度上的考虑,opencv的设计应尽可能地避免拷贝大图像,为了解决这个问题,opencv使用了引用计数机制(reference counter system)【python也使用了这个机制,参考之前的博客】。简单来说,灭个Mat对象都有自己的header,在进行copy运算时,只有headers和指向矩阵的指针会被拷贝,而矩阵本身不会被拷贝,举个栗子:

上面的三个Mat对象srcImg,dstImg,C最终都只想同一个数据矩阵,虽然它们的headers是不同的。对它们其中的任意一个进行修改都会影响另外两个对象。上面程序的运行结果如图:

当然,如果想拷贝矩阵本身也是有办法的,opencv提供了两个方法:clone()和copyTo():

Mat F = A.clone();

Mat G;

A.copyTo(G);

最后总结一下:

1)opencv函数中输出图像的内存是自动分配的;

2)赋值运算和拷贝构造函数只是拷贝了header,我们可以把这种拷贝理解为一种浅拷贝;

3)如果想进行深拷贝,即拷贝矩阵本身的数据,可以采用clone()或copyTo()函数。

对1和2的理解可以很重要,这可以解释下面这个程序:

其运行结果为:

关于如何创建一个Mat对象,最好的办法就是看mat.hpp,因为实在有太多了...,这里在介绍一下opencv里面的一下data

type,比如说CV_8UC3,CV_32FC3,CV_32F是什么意思:

CV_[the number of bits per item][signed or unsigned][Type prefix]C[The channel number]

最后是一个大头部分:介绍如何遍历cv::Mat。

Q1:图像在Mat中是如何存储的呢?

通常我们有足够多的内存,使得上面这个矩阵可以一行接着一行地连续存储,具体是不是呢,可以用isContinous()函数来判断。因此最高效的遍历方法还是采用指针(还有迭代器方法):

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72880
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40758
  • python
    +关注

    关注

    51

    文章

    4667

    浏览量

    83441

原文标题:opencv——Mat数据格式及其遍历

文章出处:【微信号:C_Expert,微信公众号:C语言专家集中营】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    VTHD这个寄存器的数据格式是?3.21带符号格式是什么格式

    VTHD这个寄存器的数据格式是?3.21带符号格式是什么格式?没有找到相关说明,那位高人给兄弟指点下,非常感谢!
    发表于 12-27 07:56

    标准数据格式实用程序快速参考

    标准数据格式实用程序快速参考
    发表于 01-22 11:32

    标准数据格式实用程序

    标准数据格式实用程序
    发表于 01-23 17:02

    串口的数据格式

    文章目录一.前言二.串口数据的发送与接收三.串口波特率四.串口的数据格式(1)起始位(2)数据位(1)奇偶检验位(1)停止位五.物理接口的形式六.TTL、RS232、RS485电平标准六.九针串口
    发表于 08-06 07:28

    串口通信数据格式的相关资料推荐

    通信方式:串口通信数据格式:一位起始位,8位数据位,一位停止位波特率: 9600校验算法:CRC-16 (MODBUS), 具体算法代码见附录控制板发送数据格式帧头和帧尾:
    发表于 12-03 08:03

    数据格式,计算机中数据格式详细介绍

    数据格式,计算机中数据格式详细介绍    计算机中常用的数据表示格式有两种,一是定点格式,二是浮点格式
    发表于 04-13 11:36 3270次阅读

    gps数据格式含义说明

    本内容介绍了gps数据格式的含义,给出了GPS输出的是NMEA-0183的数据格式,GPS固定数据输出语句($GPGGA)
    发表于 12-19 14:57 1.2w次阅读

    遍历图像像素的14种方法_OpenCV2版书本配套示例程序24

    遍历图像像素的14种方法_OpenCV2版书本配套示例程序24,来自一本国外OpenCV2书籍的示例-遍历图像像素的14种方法。
    发表于 06-06 15:20 0次下载

    opencv中三种常见数据容器:Mat,cvMat和IplImage及它们编程显示图像的差异

    IplImage, CvMat, Mat 的关系opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,
    发表于 11-25 13:18 6417次阅读

    java生成json格式数据 和 java遍历json格式数据

    本文档内容介绍了基于java生成json格式数据 和 java遍历json格式数据,供参考
    发表于 03-19 15:04 0次下载

    OPENCV数据容器之CVMAT 、MAT、IplImage

    之前的cvMat和lplImage,相比之下Mat最大的好处就是能够更加方便的进行内存管理,不再需要程序员手动管理内存的释放。opencv2.3中提到Mat是一个多维的密集
    发表于 06-15 18:36 241次阅读

    如何使用OpenCV访问Mat图像中每个像素的值

    本文档的主要内容详细介绍的是如何使用OpenCV访问Mat图像中每个像素的值
    发表于 11-26 16:13 4次下载

    总结一下OpenCV遍历图像的几种方法

    在图形处理中,遍历每个像素点是最基本的功能,是做算法的基础,这篇文章来总结一下OpenCV遍历图像的几种方法。
    的头像 发表于 01-18 15:08 1342次阅读

    串口通讯的基本概念、数据格式

    本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。
    的头像 发表于 04-23 11:13 4593次阅读
    串口通讯的基本概念、<b class='flag-5'>数据格式</b>

    如何实现PIL和OpenCV之间图像数据的转换呢?

    PIL图像数据格式转换成OpenCV图像数据格式
    的头像 发表于 02-25 13:43 382次阅读