OpenCV2.3+:vector和Mat的基本操作与转换

需积分: 9 1 下载量 94 浏览量 更新于2024-08-22 收藏 46KB PPT 举报
"这篇文档介绍了OpenCV 2.3.4版本中关于`vector`和`Mat`的基础知识,特别是`Mat`类在OpenCV 2.0之后面向对象的特性变化,以及如何进行有效操作。同时提到了与其他OpenCV数据结构的关系,如`IplImage`、`CvRect`等,并讲解了`Mat`对象的赋值、属性访问、重塑和类型转换方法。此外,还提及了与`vector`的交互以及一些额外的操作函数,如排序、计算样本均值等。" 在OpenCV 2.3.4及更高版本中,库的核心数据结构`Mat`采用了面向对象的设计,相比早期的`IplImage`,提供了更方便的内存管理和操作。`Mat`对象可以表示多维数组,常用于图像处理。在C++中,`Mat`类提供了丰富的成员函数来访问和操作其内部数据。 当需要从`vector`转换到`Mat`或反之时,可以通过`getMat()`函数实现。然而,推荐直接操作单个像素,以避免可能出现的错误。文档中提到,`lda.cpp`包含了一些OpenCV未公开的辅助操作函数,如对`Mat`对象进行排序、计算样本总均值和类均值等。 `Mat`的赋值通常是引用赋值,这意味着修改`Mat`的一个副本也会改变原始对象。例如,`Mat img(image)`会将`image`的引用赋给`img`。若不想引用赋值,可以使用`copyTo()`函数或者乘以1(`Mat image=img*1`)。对于`Mat`的行或列操作,如`img.row(n)=image.row(n)`,这里并未进行真正的赋值,需要加上`*1`以进行复制。 `Mat`的重塑(reshape)操作仅适用于连续的数据,即数据存储在一块连续的内存区域。如果`Mat`不连续,可以创建新的`Mat`并使用`copyTo()`函数复制数据。值得注意的是,`reshape`操作要求每一行的数据长度是4字节的倍数,否则可能会出现问题。 `Mat`的创建允许指定各种类型,如`CV_64F`表示`double`类型的数据。访问`Mat`中的像素值,可以使用`at<type>(i, j)`,其中`type`与`Mat`的类型匹配。`convertTo()`函数可用于改变`Mat`的类型。 此外,`Mat`支持矩阵运算,例如`img=image*img`,实现了矩阵乘法。OpenCV 2.0以后,许多旧的`cv`开头的函数被新类的成员函数替代,简化了代码并减少了指针管理的复杂性。通过熟悉这些基础操作,开发者可以更高效地利用OpenCV进行图像处理和计算机视觉任务。