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

如何在 OpenCV 中將 Mat 物件轉換為陣列或向量?

Barbara Streisand
發布: 2024-10-26 13:48:02
原創
192 人瀏覽過

How to Convert a Mat Object to an Array or Vector in OpenCV?

在 OpenCV 中將 Mat 轉換為 Array

OpenCV 提供了多種在不同資料結構之間進行轉換的方法。在本文中,我們將重點討論從 Mat 物件到陣列或向量的轉換。

從Mat 到數組的直接轉換

對於連續Mat,其中資料連續儲存在記憶體中,您可以直接將其資料作為一維數組存取:

<code class="cpp">cv::Mat mat;
// ...
std::vector<uchar> array(mat.rows * mat.cols * mat.channels());
if (mat.isContinuous()) {
    array = mat.data;
}</code>
登入後複製

轉換為二維數組

對於非連續Mat ,您可以逐行檢索其資料並將其儲存在2D 陣列中:

<code class="cpp">cv::Mat mat;
// ...
std::vector<std::vector<uchar>> array(mat.rows);
for (int i = 0; i < mat.rows; ++i) {
    array[i] = std::vector<uchar>(mat.cols * mat.channels());
    array[i] = mat.ptr<uchar>(i);
}</code>
登入後複製

轉換為向量

如果使用C 標準函式庫的向量,您可以採用以下方法:

<code class="cpp">cv::Mat mat;
// ...
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 的 ROI(感興趣區域)建立的矩陣可能不連續。

此程式碼片段示範了資料連續性方面的差異:

<code class="cpp">cv::Mat big_mat = cv::Mat::zeros(1000, 1000, CV_8UC3);
cv::Mat sub_mat = big_mat(cv::Rect(10, 10, 100, 100));

std::cout << "big_mat is continuous: " << big_mat.isContinuous() << std::endl; // true
std::cout << "sub_mat is continuous: " << sub_mat.isContinuous() << std::endl; // false</code>
登入後複製

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

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