Home > Backend Development > C++ > body text

How do I efficiently convert an OpenCV Mat object to a C array or vector?

Linda Hamilton
Release: 2024-10-26 14:08:03
Original
783 people have browsed it

How do I efficiently convert an OpenCV Mat object to a C   array or vector?

Convert Mat to Array/Vector in OpenCV

In OpenCV, accessing and manipulating image data is crucial for various image processing tasks. One common requirement is the conversion of the Mat object, which represents an image or matrix, to an array or vector.

Conversion to Array

If the Mat object's memory is continuous, meaning all its data is stored consecutively, you can directly obtain a 1D array using the following code:

<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels());
if (mat.isContinuous())
    array = mat.data;</code>
Copy after login

where mat is the Mat object, array is the converted array, .rows, .cols, and .channels() represent the image dimensions and number of channels, and .data is a pointer to the image data.

Conversion to Vector

For non-continuous Mats, data needs to be retrieved row by row. Here's an example for converting to a 2D array/vector:

<code class="cpp">uchar **array = new uchar*[mat.rows];
for (int i = 0; i < mat.rows; ++i)
    array[i] = new uchar[mat.cols * mat.channels()];

for (int i = 0; i < mat.rows; ++i)
    array[i] = mat.ptr<uchar>(i);</code>
Copy after login

However, using a std::vector can simplify the conversion:

<code class="cpp">std::vector<uchar> array;
if (mat.isContinuous()) {
    array.assign(mat.data, mat.data + mat.total() * mat.channels());
} else {
    for (int i = 0; i < mat.rows; ++i) {
        array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i) + mat.cols * mat.channels());
    }
}</code>
Copy after login

Mat Data Continuity

Understanding Mat data continuity is essential for efficient conversion. Here are some key points:

  • Mats created using imread(), clone(), or a constructor are always continuous.
  • Mats will only become non-continuous when they borrow data from an existing Mat (except when borrowing single rows or multiple rows with full original width).

For example, in the following code snippet:

<code class="cpp">cv::Mat image = cv::imread("image.jpg"); // continuous Mat
cv::Mat sub_image = image(cv::Rect(100, 100, 100, 100)); // non-continuous Mat since it borrows data from `image`</code>
Copy after login

image is a continuous Mat because it was created using imread(), while sub_image is non-continuous because it references a portion of the image Mat.

The above is the detailed content of How do I efficiently convert an OpenCV Mat object to a C array or vector?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!