OpenCV中图像的结构和区别

在OpenCV中,现在有很多种结构类型可以用来表示图像,它们之间有区别又有联系,现在记录一下它们之间的区别和相似之处,以便后面查看。

其中类型有:

1. Iplimage,2. Mat,3.CvMat, 4.CVArr;

其中:

1. IplImage:
 较老版本的图像存储类型,在2.0之前使用;

2. CvArr:

 也是较老的一种存储结构,是一种抽象的基类。

3. CvMat:
  

矩阵结构。

4. Mat:
  新版本中使用的,推荐使用,是一个图像容器,基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。(参考某文库资料)。

============================

这些类型之间的相互转换:

1. IplImage--> Mat

函数原型:

Mat::Mat(const IplImage* img, bool copyData=false);
默认情况下,新的Mat类型与原来的IplImage类型共享图像数据,转换只是创建一个Mat矩阵头。当将参数copyData设为true后,就会复制整个图像数据。

例子:
IplImage*iplImg = cvLoadImage("a.jpg", 1);

Matmtx(iplImg); // IplImage* ->Mat 共享数据

// or : Mat mtx = iplImg;

2.Mat-->IplImage
同样只是创建图像头,而没有复制数据。
例:
IplImage pImg= IplImage(imgMat);

3. Mat-->CvMat
与IplImage的转换类似,不复制数据,只创建矩阵头。
例:
// 假设Mat类型的imgMat图像数据存在
CvMat cvMat = imgMat; // Mat -> CvMat

 

4. CvMat-->Mat
与IplImage的转换类似,可以选择是否复制数据。
Mat::Mat(const CvMat* m, bool copyData=false);

===========

总结:

1. Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算,所以将IplImage类型和CvMat类型转换为Mat类型更易于数据处理。 Mat类型可用于直接存储图像信息,通过函数imread、imwrite、imshow等实现,似乎在某种程度上可以取代IplImage类型。在计算密集型的应用当中,将CvMat与IplImage类型转化为Mat类型将大大减少计算时间花费。

2. 在openCV中,Mat类型与CvMat和IplImage类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。

IplImage由CvMat派生,而CvMat由CvArr派生即 CvArr -> CvMat -> IplImage

CvArr用作函数的参数,无论传入的是CvMat或IplImage,内部都是按CvMat处理

OpenCV中图像的结构和区别,布布扣,bubuko.com

时间: 2024-12-24 01:32:08

OpenCV中图像的结构和区别的相关文章

OpenCV中图像算术操作与逻辑操作

OpenCV中图像算术操作与逻辑操作 在图像处理中有两类最重要的基础操作分别是图像点操作与块操作,简单点说图像点操作就是图像每个像素点的相关逻辑与几何运算.块操作最常见就是基于卷积算子的各种操作.实现各种不同的功能.今天小编就跟大家一起学习OpenCV中图像点操作相关的函数与应用场景.常见算术运算包括加.减.乘.除,逻辑运算包括与.或.非.异或.准备工作: 选择两张大小一致的图像如下.加载成功以后显示如下: 加法操作结果如下: 减法操作结果如下: 乘法操作结果如下: 除法操作结果如下: 权重加法

Opencv中图像的遍历与像素操作

Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0代表黑,255代表白):对于彩色图像,每个像素是一个三元向量,即由三个8位无符号数来表示三个颜色通道(Opencv中顺次为蓝.绿.红). 我们先来介绍下cv::Mat类的获取像素的成员函数at(),其函数原型如下: template<typename _Tp> _Tp& at(int i0

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

部分 V图像特征提取与描述 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相信你们大多数人都玩过拼图游戏吧.首先你们拿到一张图片的一堆碎片,要做的就是把这些碎片以正确的方式排列起来从而重建这幅图像.问题是,你怎样做到的呢?如果把你做游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了.如果计算机可以玩拼图,我们就可以给计算机一大堆自然图片,然后就可以让计算机把它拼成一张大图了.如果计算机可以自动拼接自然图片,那我们是不是可

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)

部分 V图像特征提取与描述 34 角点检测的 FAST 算法 目标 ? 理解 FAST 算法的基础 ? 使用 OpenCV 中的 FAST 算法相关函数进行角点检测原理 我们前面学习了几个特征检测器,它们大多数效果都很好.但是从实时处理的角度来看,这些算法都不够快.一个最好例子就是 SLAM(同步定位与地图构建),移动机器人,它们的计算资源非常有限.为了解决这个问题,Edward_Rosten 和 Tom_Drummond 在 2006 年提出里 FAST 算法.我们下面将会对此算法进行一个简单

opencv中各种矩阵乘的区别

尊重原创,转载请注明:http://blog.csdn.net/tangwei2014 OpenCV中每次遇到矩阵乘法就乱,各种翻各种查. 这次总结了一下,为了简单明了,还是让例子说话. 1. Mat*Mat: 第一个矩阵的列数必须等于第二个矩阵的行数. [0, 1, 2, 3;     [0, 0, 0;       [14, 14, 14; 0, 1, 2, 3;  *  1, 1, 1;  =    14, 14, 14; 0, 1, 2, 3]      2, 2, 2;        

openCV存储图像的结构和pictureBox存储图像结构的区别

这段时间在做一个基于emgu的行人统计项目,笔者在框定区域时,发现老是出现问题.然后笔者写了一个小程序测试,发现了问题出在图像矩阵扫描这一块 在pictureBox上鼠标的坐标是 而emgu的是从y方向开始扫描的 1 for (int x = 0; x < grayImage1.Width; x++) 2 { 3 for (int y = 0; y < grayImage1.Height; y++) 4 { 5 if (imganalysis.isInArea(x, y, plist)) 6

openCV中row与rows的区别

row(n)为图像第n行中的像素值,rows无参数,为图像的行数(即图像的高度) 代码: #include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>using namespace std;using namespace cv;int main(){ Mat img = imread("baboon.jpg",1); cout <&l

OpenCV中图像的读取,显示与保存

图像的读取,显示与保存 相关函数:cv2.imread().cv2.imshow().cv2.imwrite() 1.读入图像: 用cv2.imread()函数来读取图像,cv2.imread(路径,图像颜色空间)(其中颜色空间默认为BGR彩图)     cv2.IMREAD_COLOR:读入一副彩色图像 cv2.IMREAD_GRAYSCALE:以灰度模式读入图像 cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道 示例代码 import cv2 img

OpenCV中的结构体、类与Emgu.CV的对应表

OpenCv中的 C 结构 OpenCV中的 C++ 封装 Emgu.CV中的 C# 封装 OpenCV 和 Emgu.CV 中的结构罗列 谢谢阅读,有误希望指正 原文地址 Basic Structures: main data structures used in opencv. CvPoint CvPoint2D32f CvPoint2D64f CvPoint3D32f CvPoint3D64f Point_<typename _Tp> Point3_<typename _Tp>