I know that, the data contained in an opencv matrix is not guaranteed to be continuous. To make myself clear, here is a paragraph from Opencv documentation:
Opencv provides a function called isContinuous() to test if the data of a given matrix is continuous. My questions are
(1) If I create a new matrix as follows
Mat img = cv::imread(img_name)
Is the data in img guaranteed to be continuous?
(2) I know that creating a new matrix by borrowing data from existing matrix would result in incontinuous data
cv::Mat small_mat = large_mat.col(0);
The above code creates a new matrix, small_mat, by borrowing the 0-th column of large_mat, leading to incontinuous data in small_mat. So the question is, if I create a brand new matrix without borrowing data from existing matrix, will the brand new matrix have incontinuous data?
(3) Is the following code guaranteed to create a matrix with continuous data?
cv::Mat mat(nRows, nCols, CV_32FC1);
You can see in the OpenCV doc for isContinuous:
The method returns true if the matrix elements are stored continuously without gaps at the end of each row. Otherwise, it returns false. Obviously, 1x1 or 1xN matrices are always continuous. Matrices created with Mat::create() are always continuous. But if you extract a part of the matrix using Mat::col(), Mat::diag() , and so on, or constructed a matrix header for externally allocated data, such matrices may no longer have this property.
So, as long as you are creating a new matrix (i.e. you're calling create), your matrix will be continuous.
create
works like:
This means that when you (implicitly) call create, the matrix will be continuous (step 3).
Your questions
If I create a new matrix with
imread
is the data guaranteed to be continuous
Yes, because imread
internally calls create
.
I know that creating a new matrix by borrowing data from existing matrix would result in incontinuous data.
Correct, data will be non continuous. To make the new matrix continuous, you can call clone()
, which calls create
to create the new matrix.
if I create a brand new matrix without borrowing data from existing matrix, will the brand new matrix have incontinuous data?
Yes, the constructor internally calls create
.
Matrix constructor is guaranteed to create a matrix with continuous data?
Yes, the constructor internally calls create
.
This is a small example to summarize:
#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; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With