將OpenCV Mat 轉換為數組/向量
問題:
問題:對於Open的函數將Mat 轉換為Array 可能具有挑戰性。 .ptr 和 .at 等現有方法可能無法提供所需的資料格式。
答案:<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) array = mat.data;</code>對於連續Mat(所有資料連續儲存),資料可以直接取得為一維數組:
<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>
對於非連續的Mats,需要逐行擷取數據,得到一個二維數組:
更新:<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>為了更簡單,建議使用std::vector:
對於CV_8UC1 以外的資料型態(例如CV_32F),請使用適當的資料輸入向量定義。
更新2:以上是如何有效率地將OpenCV Mat轉換為陣列或向量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!