简介

IplImage是从2001年Opencv发布后就一直存在,是C语言的风格的数据结构,需要开发者自己分配与管理内存,对于大型程序容易出现内存泄漏。

Mat结构是Opencv2.0之后引出的,它可以自动分配内存空间,不会出现内存泄漏,是C++风格的数据结构,包含头部和数据部分。

Mat对象

mat对象分为矩阵头(包含信息有矩阵的大小,用于存储的方法,矩阵存储的地址等)和和一个指针,指向包含了像素值的矩阵。矩阵头部的大小是恒定的。然而,矩阵本身的大小因图像的不同而不同。

Mat的常见属性、方法

属性 说明
data uchar类型的指针,指向矩阵数据部分
dims 矩阵的维度
rows 矩阵的行数
cols 矩阵的列数
size 矩阵的大小rows*cols
channels() 矩阵的通道数
type 矩阵的数据类型和通道数
depth() 矩阵一个通道的数据类型
elemSize() 矩阵一个元素所占的字节数
elemSize1() 矩阵一个通道下的一个元素所占的字节数
total() 返回Mat类中的元素总数。例如,在图像中,该值等于图像宽度乘以高度
at<vec类型>(x,y) 获取像素点的值
forEach<>() 可以用来对Mat类的所有元素并行运行一个函数。需要为该函数提供函数对象、函数指针或lambda表达式

depth:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }

Mat的type属性

  • 数据类型
数值
CV_8U 8位无符号整数
CV_8S 8位符号整数
CV_16U 16位无符号整数
CV_16S 16位符号整数
CV_32S 32位符号整数
CV_32F 32位浮点数
CV_64F 64位浮点数
  • 通道类型
数值 说明
C1 单通道
C2 双通道
C3 三通道
  • type

数据类型+通道类型,如:CV_8UC3

Mat的step属性

矩阵有几维,step[]数组就有几个元素,如3维,则有3个元素,step[0],step[1],step[2].分别对应面,线,点。

常用构造方法

  • 初始化
  1. Mat(int rows,int cols,int type)
  2. Mat(Size size,int type)
  3. Mat(int rows,int cols,int type,const Scalar &s)
  4. Mat(Size size,int type,const Scalar &s)
  • 浅拷贝
  1. Mat img2 = img1;
  2. Mat img2(img1);
  • 深拷贝
  1. Mat img2 = img1.clone();
  2. Mat img2,img1.copyTo(img2);

常用运算

+号
-号
*(标量)
mul() 矩阵对应元素相乘
*(矩阵) 矩阵乘法
t() 转置
inv() 求逆

常用方法

  1. countNoeZero() 统计非零元素
  2. meanStdDev() 计算通道的均值和标准值
  3. minMaxLoc() 计算矩阵最小、大值及其位置
  4. bool empty()

其他数据类型

Vec

应用:以定义任何类型的向量和大量的组件
例: Vec<double,19> myVector;

  • 宏定义

typedef Vec<uchar,2> Vec2b;
typedef Vec<uchar,3> Vec3b;
typedef Vec<short,2> Vec2s;
typedef Vec<short,3> Vec3s;
typedef Vec<ushort, 2> Vec2w;
typedef Vec<ushort, 3> Vec3w;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;

Scalar

应用:表示一个像素点的像素值
Vec对象的派生,有四个元素。
若要访问Vec和Scalar值,可以使用[]运算符。

Point

应用:像素点的坐标,也可以表示三维点坐标。
宏定义:Point2i Point2f Point3f Point3i

Size

应用:图像的大小
成员:width 、height
方法:area()

Rect

应用:2D矩阵,规定区域
Rect r(x,y,w,h) 左上角坐标和矩阵宽高

RotatedRect

应用:旋转矩阵
RotatedRect(const Point2f& center,const Size2f& size,float angle); 中心点、宽高度以及旋转角度

基本数据存储

opencv有时需要存储和读取数据,这里提供两种文件来保存,xml和yaml。
把数据的读取和写入可以用FileStorage类,同时使用流运算符<<操作STL流。

#include <opencv2/opencv.hpp>
using namespace cv;
int main(int, char** argv) {
	//create our writer
	FileStorage fs("test.yml", FileStorage::WRITE);
	//create a simple sample
	Mat m1 = Mat::eye(2, 3, CV_32F);
	fs << "Result" << m1;
	fs.release();

	FileStorage fs2("test.yml", FileStorage::READ);
	Mat r;
	fs2["Result"] >> r;
	std::cout << r << std::endl;
	system("pause");
	return 0;
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐