首頁 >後端開發 >C++ >如何有效地將 OpenCV Mat 物件轉換為 C 陣列或向量?

如何有效地將 OpenCV Mat 物件轉換為 C 陣列或向量?

Linda Hamilton
Linda Hamilton原創
2024-10-26 14:08:03856瀏覽

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

在OpenCV 中將Mat 轉換為陣列/向量

在OpenCV 中,存取和操作影像資料對於各種影像處理任務至任務至關重要。一個常見的需求是將代表影像或矩陣的 Mat 物件轉換為陣列或向量。

轉換為陣列

如果Mat 物件的記憶體是連續的,表示它的所有資料都是連續儲存的,可以使用下列程式碼直接取得一維陣列:

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

其中mat是Mat對象,array是轉換後的數組,.rows,.cols , and.channels() 表示影像尺寸和通道數,.data 是指向影像資料的指針。

轉換為向量

對於非連續的 Mats,需要逐行擷取資料。以下是轉換為2D 陣列/向量的範例:

<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>

但是,使用std::vector 可以簡化轉換:

<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>

Mat 資料連續性

了解Mat 資料連續性對於高效轉換至關重要。以下是一些關鍵點:

  • 使用 imread()、clone() 或建構子建立的 Mat 總是連續的。
  • Mats 僅在藉用資料時才會變得不連續來自現有的 Mat(借用單行或多行具有完整原始寬度的情況除外)。

例如,在以下程式碼片段中:

<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>

影像是連續的Mat 因為它是使用imread() 建立的,而sub_image 是不連續的,因為它引用了圖像Mat 的一部分。

以上是如何有效地將 OpenCV Mat 物件轉換為 C 陣列或向量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn