在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>
其中mat是Mat對象,array是轉換後的數組,.rows,.cols , and.channels() 表示影像尺寸和通道數,.data 是指向影像資料的指針。
轉換為向量
對於非連續的 Mats,需要逐行擷取資料。以下是轉換為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 可以簡化轉換:
<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>
Mat 資料連續性
了解Mat 資料連續性對於高效轉換至關重要。以下是一些關鍵點:
例如,在以下程式碼片段中:
<code class="cpp">cv::Mat image = cv::imread("image.jpg"); // continuous Mat cv::Mat sub_image = image(cv::Rect(100, 100, 100, 100)); // non-continuous Mat since it borrows data from `image`</code>
影像是連續的Mat 因為它是使用imread() 建立的,而sub_image 是不連續的,因為它引用了圖像Mat 的一部分。
以上是如何有效地將 OpenCV Mat 物件轉換為 C 陣列或向量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!