OpenCV基础篇之Mat数据结构

Last edited time
Sep 23, 2024 03:04 PM
AI summary
Mat是OpenCV的基本数据结构,包含头部和指针,主要用于存储图像数据。文中介绍了Mat的初始化、数据复制、常用成员函数及其在图像处理中的应用,包括如何将IplImage转换为Mat和判断数据存储的连续性。
Tags
Mat Data Structure
OpenCV Basics
Image Processing
Last edited by

程序及分析

  1. Mat是OpenCV最基本的数据结构,Mat即矩阵(Matrix)的缩写,Mat数据结构主要包含2部分:Header和Pointer。Header中主要包含矩阵的大小,存储方式,存储地址等信息;Pointer中存储指向像素值的指针。我们在读取图片的时候就是将图片定义为Mat类型,其重载的构造函数一大堆,
    1. 要了解如何初始化Mat结构,就应该了解它的构造函数,比如程序中的第一初始化方式调用额就是
      这个构造函数。
      IplImage*是C语言操作OpenCV的数据结构,在当时C操纵OpenCV的时候,地位等同于Mat,OpenCV为其提供了一个接口,很方便的直接将IplImage转化为Mat,即使用构造函数
      上面程序中的第二种方法就是使用的这个构造函数。
  1. 关于Mat数据复制:前面说过Mat包括头和数据指针,当使用Mat的构造函数初始化的时候,会将头和数据指针复制(注意:只是指针复制,指针指向的地址不会复制),若要将数据也复制,则必须使用copyTo或clone函数
    1. notion image
      mat
  1. Mat还有几个常用的成员函数,在之后的文章中将会使用到:
    1. 这了解上面的函数作用前,得了解下OpenCV中存储像素的方法,如下,灰度图(单通道)存储按行列存储,
      notion image
      single_channel
      三通道RGB存储方式如下,每列含有三个通道,
      notion image
      rgb_channel
      为了加快访问的速度,openCV往往会在内存中将像素数据连续地存储成一行,isContinus()函数的作用就是用于判断是否连续存储成一行。存储成一行有什么好处呢?给定这行的头指针p,则只要使用p++操作就能逐个访问数据。
      因此当判断存放在一行的时候,可以通过数据指针++很容易遍历图像像素:
      请注意以上几个常用的Mat成员遍历和函数:
  1. 更多关于Mat的信息请参考安装目录下的include/opencv2/core.hpp文件

效果

notion image
result
左边是矩阵的一些操作输出结果,右边的图是通过IplImage *结构读入,转换为Mat后显示结果。
Loading...