现在的位置: 首页 > 综合 > 正文

Opencv中的一些必须理解的简单概念

2013年10月14日 ⁄ 综合 ⁄ 共 1193字 ⁄ 字号 评论关闭

Opencv中的一些必须理解的简单概念

1.矩阵头和矩阵数据空间
在Opencv中数据大多用矩阵表示,我们可以用类Mat声明一个矩阵头,但矩阵头本身并不包含矩阵中的数据,矩阵中的数据存放在Mat的成员data所指向的位置。Opencv通过引用计数自动管理矩阵数据,比如若有一个新的矩阵头指向矩阵数据空间则引用计数自动增加,若一个指向矩阵数据空间的矩阵头指向了其它位置或被析构则引用计数自动减少,当引用计数减为0即没有任何矩阵头指向该空间时,Opencv自动释放该数据空间。
同样我们使用赋值运算复制一个矩阵时,矩阵数据并没有真正被复制,仅仅是增加了对矩阵数据空间的引用计数以表明新的矩阵头指向同样的数据空间。如果需要同时赋值矩阵数据矩阵我们可以用Mat::clone()函数进行深度拷贝。



2.矩阵元素类型

单通道:若矩阵的每一个元素都是标量,则我们称矩阵是单通道的。对于单通道矩阵,我们可以用下面这个枚举型变量表示元素的类型
enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 };
其中CV是COMPUTER VISION的缩写,数字8、16、32等表示元素的位数,字母U、S、F分别表示unsigned signed和float的首字母。
例如:CV_32S表示元素类型为32位有符号整形,CV_64F表示64位浮点数。

多通道:若矩阵中的每一个元素是矢量,则我们称矩阵是多通道的。对于多通道矩阵,我们可以用以下常量表示
CV_8UC1 CV_8UC2... CV_64FC3 CV_64FC4
CV_8UC(n)... CV_64FC(n)
以上常量除C(n)外其他字母和数字与单通道矩阵中的意义相同,增加的C是channel的表示通道,n表示通道数目
例如:CV_32FC2表示双通道32位浮点型数据


3.矩阵数据在空间中的排列

下图是读取一副彩色图像所得到的矩阵,观察他我们可以看到一个3通道二维矩阵在内存空间中是如何存放数据的,注意这里每一个像素是按照BGR排放的,而不是RGB

如下图所示,矩阵数据是安行排列的。Row0的最后一列衔接Row1的第一列


4.矩阵的连续性
所谓矩阵的连续性,就是指矩阵中的元素在空间上是否处于一段连续的空间。对于由Mat类的构造函数或create()函数所创建的新的矩阵,系统分配的是一段连续的数据空间,这样的矩阵必然是连续的。但对于由Mat::col(),Mat::colRange(),Mat::diag()等函数创建的矩阵,由上面的讲述的矩阵头和矩阵的数据空间,矩阵数据在空间中的排列等知识可知,这样的矩阵并没有分配新的数据空间而是对原数据空间进行了索引,因此若矩阵头指向的元素在原数据空间中存在间隔,则该矩阵的数据在空间上是不连续的。
我们可以用Mat::isContinuous()函数判断矩阵是否连续


抱歉!评论已关闭.