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

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

Susan Sarandon
Susan Sarandon原創
2024-10-29 08:21:30374瀏覽

How to Efficiently Convert OpenCV Mat to Array or Vector?

將OpenCV Mat 轉換為數組/向量

問題:

問題:對於Open的函數將Mat 轉換為Array 可能具有挑戰性。 .ptr 和 .at 等現有方法可能無法提供所需的資料格式。

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

對於連續Mat(所有資料連續儲存),資料可以直接取得為一維數組:
<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>

對於非連續的Mats,需要逐行擷取數據,得到一個二維數組:

更新:
<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>

為了更簡單,建議使用std::vector:

對於CV_8UC1 以外的資料型態(例如CV_32F),請使用適當的資料輸入向量定義。

更新2:
  • 關於Mat 資料連續性:
由imread()、clone( ),或建構子總是是連續的。 非連續 Mat 僅在從現有矩陣借用資料時出現,除非借用的資料在原始矩陣中是連續的(例如,單行或全角行)。

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

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