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