首頁  >  文章  >  後端開發  >  如何在 OpenCV 中將 Mat 物件轉換為陣列或向量?

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

Barbara Streisand
Barbara Streisand原創
2024-10-26 13:48:02193瀏覽

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中文網其他相關文章!

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