OpenCV 中將 Mat 轉換為陣列或向量
在 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>
轉換為Row-Based Array
在記憶體不連續的情況下,可以取得row的資料按行,產生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 提供了將Mat 轉換為陣列的另一種方法:
<code class="cpp">std::vector<uchar> array; if (mat.isContinuous()) { // array.assign(mat.datastart, mat.dataend); // May cause issues for sub-matrices 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>
轉換為其他類型的向量
對於其他資料類型的OpenCV Mat,例如CV_32F,轉換過程類似:
<code class="cpp">std::vector<float> array; if (mat.isContinuous()) { // array.assign((float*)mat.datastart, (float*)mat.dataend); // May cause issues for sub-matrices array.assign((float*)mat.data, (float*)mat.data + mat.total() * mat.channels()); } else { for (int i = 0; i < mat.rows; ++i) { array.insert(array.end(), mat.ptr<float>(i), mat.ptr<float>(i) + mat.cols * mat.channels()); } }</code>
理解Mat 資料連續性
理解Mat 資料連續性
以上是如何有效率地將 OpenCV Mat 轉換為陣列或向量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!