你可以在 OpenCV 文档中看到是连续的 http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-iscontinuous:
如果矩阵元素连续存储且每行末尾没有间隙,则该方法返回 true。否则,返回 false。显然,1x1 或 1xN 矩阵始终是连续的。使用 Mat::create() 创建的矩阵始终是连续的。但是,如果您使用 Mat::col()、Mat::diag() 等提取矩阵的一部分,或者为外部分配的数据构造矩阵头,则此类矩阵可能不再具有此属性。
因此,只要您创建一个新矩阵(即您调用create http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-create),你的矩阵将是连续的。
create
工作原理如下:
- 如果当前数组形状和类型与新的匹配,则立即返回。否则,通过调用 Mat::release() 取消引用先前的数据。
- 初始化新的标头。
- 分配total()*elemSize()字节的新数据。
- 分配与数据关联的新引用计数器并将其设置为 1。
这意味着当您(隐式)调用 create 时,矩阵将是连续的(步骤 3)。
你的问题
如果我创建一个新矩阵imread
数据是否保证连续
Yes, 因为imread
内部调用create
.
我知道通过借用现有矩阵的数据来创建新矩阵会导致数据不连续。
正确,数据将是非连续的。要使新矩阵连续,可以调用clone()
,这称为create
创建新的矩阵。
如果我创建一个全新的矩阵而不借用现有矩阵的数据,那么这个全新的矩阵是否会有不连续的数据?
Yes,构造函数内部调用create
.
矩阵构造函数保证创建一个具有连续数据的矩阵吗?
Yes,构造函数内部调用create
.
这是一个小例子来总结:
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
// Read image
Mat img = imread("path_to_image");
cout << "img is continuous? " << img.isContinuous() << endl;
// Yes, calls create internally
// Constructed a matrix header for externally allocated data
Mat small_mat = img.col(0);
cout << "small_mat is continuous? " << small_mat.isContinuous() << endl;
// No, you're just creating a new header.
// Matrix (self) expression
small_mat = small_mat + 2;
cout << "small_mat is continuous? " << small_mat.isContinuous() << endl;
// No, you're not even creating a new header
// Matrix expression
Mat expr = small_mat + 2;
cout << "expr is continuous? " << expr.isContinuous() << endl;
// Yes, you're creating a new matrix
// Clone
Mat small_mat_cloned = img.col(0).clone();
cout << "small_mat_cloned is continuous? " << small_mat_cloned.isContinuous() << endl;
// Yes, you're creating a new matrix
// Create
Mat mat(10, 10, CV_32FC1);
cout << "mat is continuous? " << mat.isContinuous() << endl;
// Yes, you're creating a new matrix
return 0;
}