OpenCV系列(四):矩阵操作

关于矩阵的操作,异常繁多,而且OpenCV提供的函数也相对很丰富,这里作一个简单的系统介绍,主要涉及矩阵的基本运算,矩阵的属性运算和一些其他常用操作。

矩阵基本运算

OpenCV提供了矩阵常用的一些操作包括矩阵的相加,相乘,逐元素相乘,逐元素相除,求逆等。

Mat类内部实现

设为A,B为Mat类型,s是Scalar类型,a是一个实数。下面列出关于Mat的常用运算:

  • 矩阵加减: A+B,A-B,A+s,A-s,s+A,s-A,-A.
  • 矩阵乘以实数: A*a,a*A
  • 逐元素乘除: A.mul(B),A/B,a/A
  • 矩阵乘法: A*BmaxVal; Point minPos,m
  • 矩阵倒置: A.t()
  • 矩阵的逆: A.inv()
  • 矩阵比较: A comp B,A comp a,a comp A。这里comp包括 >, >=,==,!=,<=,<。得出的结果是一个单通道8位的矩阵,元素的值为255或0。
  • 矩阵位操作: A logic B, A logic s,s logic A。这里logic包括:&,|,^
  • 向量的差乘和内积: A.cross(B),A.dot(B);

Read More

OpenCV系列(三):Mat详解

Mat类是OpenCV最基本的一个数据类型,它可以表示一个多维的多通道的数组。Mat常用来存储图像,包括单通道二维数组——灰度图,多通道二维数组——彩色图。当然也可以用来存储点云,直方图等等,对于高维的数组可以考虑存储在SparseMat中。对于一个Mat对象M,其数据布局是由M.step[]决定的,数据存放在M.data里面,假设M有d维,则数据的寻址方式为:

\[addr(M_{i_0,...,i_{d-1}}) = M.data + i_0*M.step[0] + ... + i_{d-1}*M.step[d-1] \]

例如\(Img\)是一个二维三通道矩阵,则,

\[addr(Img_{i_0,i_1}) = M.data + i_0*M.step[0] + i_1*M.step[1] \]

这里需要说明的是各个维度的步长满足如下关系:M.step[i] >= M.step[i+1]*M.size[i+1],也就是二维数组的数据的存放是一行一行的,三维数组数据存放是一面一面的。

Read More

OpenCV系列(二):基本数据结构

常用的OpenCV数据结构像Mat,Point等我们并不陌生,但最近仔细阅读OpenCV手册后发现有些数据结构的一些便捷操作以及一些新加入的功能自己并没有掌握,这里做个记录算是学习笔记。

众多的类模板

我们平时常用的数据结构像Point,Rect其实是类模板某一数据类型的实例。比如Point对应Point_<int>Rect对应Rect_<int>。 这里就简单罗列一下Point对应的定义:

1
2
3
4
typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;

而且,Point也重载了加减乘除等操作运算符,比如:

1
2
3
4
5
6
7
Point pt1,pt2,pt3;
int a;
pt1 = pt2 + pt3, pt1 = pt2 - pt3;
pt1 = pt2 * a, pt1 = a * pt2;
pt1 += pt2, pt1 -= pt2, pt1 *= a;
double value = norm(pt); // L2 norm
pt1 == pt2, pt1 != pt2;

Read More

OpenCV系列(一):简介

一直都想系统全面地学习一下OpenCV,但却迟迟懒于行动,虽然平时也用OpenCV的一些东西,但毕竟没有对其没有一个全面的把握。这次借此机会打算参考OpenCV手册系统地整理一下自己的学习心得。

OpenCV主要模块

OpenCV主要包括core,imgproc,video,cliab3d,feature2d,objdetect,highgui,gpu等几个模块,其中

  • core 主要是图像的一些基本数据结构如Mat,Point,Rect等及其相应的操作;
  • imgproc 主要包括一些针对图像的基本处理,像线性或非线性的图像滤波,几何形变操作(如尺寸变化,仿射变换等);
  • video 主要包括运动估计,背景差分法跟踪,以及一些其他目标跟踪算法;
  • calib3d 主要是多视角几何,单目相机和双目相机的参数标定,目标姿态估计,立体匹配和三维重建方面的算法;
  • feature2d 主要包括基于特征点的检测器,特征点的提取和匹配。objdetect主要包括检测目标或是特定的目标(像人脸,行人等);
  • highgui 包括视频和图像的读写,以及一些简单的UI功能;
  • gpu 主要是一些视觉算法基于GPU加速的实现。

    Read More