首頁 > 後端開發 > C++ > 主體

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

Susan Sarandon
發布: 2024-10-27 03:32:30
原創
232 人瀏覽過

How to Efficiently Convert OpenCV Mat to an Array or Vector?

OpenCV 中將 Mat 轉換為陣列或向量

在 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>
登入後複製

轉換為Row-Based Array

在記憶體不連續的情況下,可以取得row的資料按行,產生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 提供了將Mat 轉換為陣列的另一種方法:

<code class="cpp">std::vector<uchar> array;
if (mat.isContinuous()) {
    // array.assign(mat.datastart, mat.dataend); // May cause issues for sub-matrices
    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>
登入後複製

轉換為其他類型的向量

對於其他資料類型的OpenCV Mat,例如CV_32F,轉換過程類似:

<code class="cpp">std::vector<float> array;
if (mat.isContinuous()) {
    // array.assign((float*)mat.datastart, (float*)mat.dataend); // May cause issues for sub-matrices
    array.assign((float*)mat.data, (float*)mat.data + mat.total() * mat.channels());
} else {
    for (int i = 0; i < mat.rows; ++i) {
        array.insert(array.end(), mat.ptr<float>(i), mat.ptr<float>(i) + mat.cols * mat.channels());
    }
}</code>
登入後複製

理解Mat 資料連續性

理解Mat 資料連續性

  • 理解Mat 資料連續性
  • 理解Mat 資料連續性
理解Mat 資料連續性理解Mat 資料連續性透過 imread()、clone() 或建構子建立的 Mat 本質上是連續的。 只有當 Mat 借用資料時才會出現資料不連續性。現有的 Mat(除了某些涉及完整原始寬度的場景)。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!