OpenCV中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage。
一、Mat类型:矩阵类型,Matrix。
在openCV中,Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。
Mat有3个重要的方法:
1、Mat mat
= imread(const String* filename); 读取图像
2、imshow(const
string frameName, InputArray mat); 显示图像
3、imwrite (const string& filename, InputArray img); 储存图像
Mat类型较CvMat与IplImage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。在计算密集型的应用当中,将CvMat与IplImage类型转化为Mat类型将大大减少计算时间花费。
关于Mat的数学方面的函数略过。
二、CvMat类型与IplImage类型:“图像”类型
在openCV中,Mat类型与CvMat和IplImage类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。
我们知道openCV是完全用C实现的,但是,IplImage类型与CvMat类型的关系就像是java(C++?)中的继承关系。实际上,CvMat之上还有一个更抽象的基类----CvArr,这在源代码中会常见。
关于CvMat:
其定义如下:
typedef struct CvMat
{
int type;
int step;
/* for internal use only */
int* refcount;
int hdr_refcount;
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
#ifdef __cplusplus
union
{
int rows;
int height;
};
union
{
int cols;
int width;
};
#else
int rows;
int cols;
#endif
}
CvMat;
在openCV中,没有向量(vector)的数据结构。任何时候,但我们要表示向量时,用矩阵数据表示即可。但是,CvMat类型与我们在线性代数课程上学的向量概念相比,更抽象,比如CvMat的元素数据类型并不仅限于基础数据类型,比如,下面创建一个二维数据矩阵:
CvMat*
cvCreatMat(int rows ,int cols , int type);
这里的type可以是任意的预定义数据类型,比如RGB或者别的多通道数据。这样我们便可以在一个CvMat矩阵上表示丰富多彩的图像了。
关于IplImage:
在类型关系上,我们可以说IplImage类型继承自CvMat类型,当然还包括其他的变量将之解析成图像数据。
其定义如下:
typedef struct _IplImage
{
int nSize; /* sizeof(IplImage) */
int ID; /* version (=0)*/
int nChannels; /* Most of OpenCV functions support 1,2,3 or 4 channels */
int alphaChannel; /* Ignored by OpenCV */
int depth; /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported. */
char colorModel[4]; /* Ignored by OpenCV */
char channelSeq[4]; /* ditto */
int dataOrder; /* 0 - interleaved color channels, 1 - separate color channels.
cvCreateImage can only create interleaved images */
int origin; /* 0 - top-left origin,
1 - bottom-left origin (Windows bitmaps style). */
int align; /* Alignment of image rows (4 or 8).
OpenCV ignores it and uses widthStep instead. */
int width; /* Image width in pixels. */
int height; /* Image height in pixels. */
struct _IplROI *roi; /* Image ROI. If NULL, the whole image is selected. */
struct _IplImage *maskROI; /* Must be NULL. */
void *imageId; /* " " */
struct _IplTileInfo *tileInfo; /* " " */
int imageSize; /* Image data size in bytes
(==image->height*image->widthStep
in case of interleaved data)*/
char *imageData; /* Pointer to aligned image data. */
int widthStep; /* Size of aligned image row in bytes. */
int BorderMode[4]; /* Ignored by OpenCV. */
int BorderConst[4]; /* Ditto. */
char *imageDataOrigin; /* Pointer to very origin of image data
(not necessarily aligned) -
needed for correct deallocation */
}
IplImage;
我们可以看到,IplImage类型较之CvMat多了很多参数,比如depth和nChannels。在普通的矩阵类型当中,通常深度和通道数被同时表示,如用32位表示RGB+Alpha.但是,在图像处理中,我们往往将深度与通道数分开处理,这样做是OpenCV对图像表示的一种优化方案。
IplImage的对图像的另一种优化是变量origin----原点。在计算机视觉处理上,一个重要的不便是对原点的定义不清楚,图像来源,编码格式,甚至操作系统都会对原地的选取产生影响。为了弥补这一点,openCV允许用户定义自己的原点设置。取值0表示原点位于图片左上角,1表示左下角。
dataOrder参数定义数据的格式。有IPL_DATA_ORDER_PIXEL和IPL_DATA_ORDER_PLANE两种取值,前者便是对于像素,不同的通道的数据交叉排列,后者表示所有通道按顺序平行排列。
IplImage类型的所有额外变量都是对“图像”的表示与计算能力的优化。
分享到:
相关推荐
在OpenCV库中,处理图像数据时,有几种不同的数据结构可供选择,包括`Mat`、`CvMat`和`IplImage`。这些数据结构各有特点,适应不同的应用场景和编程需求。在实际开发中,有时需要在它们之间进行转换以实现功能的兼容...
OPENCV_Mat类存取方法 OPENCV_Mat类是OpenCV中最基本的数据结构,它是一个矩阵类,用于存储图像、视频、特征点等数据。Mat类提供了多种方法来存取和操作矩阵数据。 1. 数据元素地址计算公式: addr(M[i0,i1,…,im...
OpenCv —— 人脸识别(附完整源码)。具体查看csdn文章: ...
OpenCv —— 检测高速车流。具体查看csdn博文:https://blog.csdn.net/automoblie0/article/details/125440284?spm=1001.2014.3001.5502
封装在Opencv的Mat图像中绘制中文文字功能!解决Opencv中默认绘制中文字体出现乱码的情况!
IplImage 是 OpenCV 中的一个图像结构体,而 CvMat 是一个矩阵结构体。将 IplImage 转换为 CvMat 是非常有用的。下面将介绍两种常见的转换方式: 1.cvGetMat 方式: CvMat mathdr, *mat = cvGetMat( img, &mathdr ...
"Opencv图像Mat写入中文汉字"这个主题涉及到了如何在OpenCV的Mat图像对象上正确地显示中文字符。下面我们将详细探讨这一技术及其背后的原理。 首先,OpenCV本身并不直接支持中文字符的渲染,它依赖于系统字体库来...
在OpenCV库中,CvMat是一个非常基础且重要的数据结构,用于表示多维数组,尤其是在处理图像数据时。本文将深入探讨CvMat的用法,包括如何初始化矩阵、如何将IplImage转换为CvMat、如何将CvArr转化为CvMat以及对图像...
- `cvConvert` 方式则是将整个 `IplImage` 转换为新的 `CvMat`,适用于不同的数据类型或通道数转换。 3. cvArr(IplImage 或 cvMat)转化为 cvMat: - 当输入数据可能是 `IplImage` 或 `CvMat` 时,可以使用 `...
随着OpenCV的发展,IplImage已经被Mat类替代,但为了兼容早期的代码,IplImage仍然被保留了下来。 #### FreeImage库简介 FreeImage是一个免费、开源、跨平台的图像加载/保存/转换库,支持多种图像格式,包括GIF。...
`Mat`对象不仅支持基本的图像处理操作,如滤波、边缘检测、颜色空间转换等,还能方便地与其他数据类型进行转换,例如将图像数据转换为JPEG格式。 JPEG(Joint Photographic Experts Group)是一种常用的有损图像...
在 OpenCV 中,Mat、CvMat 和 IplImage 是三种常用的数据类型,每种类型都有其特点和应用场景。 一、Mat 类型 Mat 是 OpenCV 中的一种多维密集数据数组,用于处理向量、矩阵、图像和直方图等多维数据。Mat 有三个...
将内存中YUV数据(char* pBuf,int nLen)转成opencv的Mat格式,RGB显示
这个函数返回一个`cv::Mat`对象,这是OpenCV中表示图像的基本数据结构。 ```cpp cv::Mat image = cv::imread("1.jpg"); if (image.empty()) { std::cerr 无法读取图像文件!" ; return -1; } ``` 2. **预处理**:...
### OpenCV —— 寻找并绘制图像的轮廓 #### 概述 OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,它包含了大量用于实时计算机视觉、图像处理和机器学习的函数。本文将重点介绍如何使用...
在本文中,我们将深入探讨如何在64位环境下利用Visual Studio 2017与OpenCV 3.4.1及它的contrib模块进行安装和配置。OpenCV(开源计算机视觉库)是一个强大的图像处理和计算机视觉库,而contrib模块则包含了一些额外...
1: 输出一个Mat对象的像素 自定义一个Mat 对象,然后输出像素值(像素值基本... //矩阵数据类型(深度和通道数) MatType /* * 小图像的每一个像素值我们都是知道的,可以输出查看,验证算法正确性,然后在ran大图 *
1. **OpenCV的Mat对象**:`Mat`是OpenCV中的核心数据结构,用于存储图像和多维数组。它支持多种数据类型,如8位无符号整型(uchar)、32位浮点型(float)等,并且可以方便地进行图像处理操作,如滤波、边缘检测、...
opencv_source_code chm格式 很好用
具体查看博文:...