
在OpenCV 中將Mat 轉換為陣列/向量
在OpenCV 中,存取和操作影像資料對於各種影像處理任務至任務至關重要。一個常見的需求是將代表影像或矩陣的 Mat 物件轉換為陣列或向量。
轉換為陣列
如果Mat 物件的記憶體是連續的,表示它的所有資料都是連續儲存的,可以使用下列程式碼直接取得一維陣列:
1 2 3 | <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 陣列/向量的範例:
1 2 3 4 5 6 | <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 可以簡化轉換:
1 2 3 4 5 6 7 8 | <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 資料連續性對於高效轉換至關重要。以下是一些關鍵點:
- 使用 imread()、clone() 或建構子建立的 Mat 總是連續的。
- Mats 僅在藉用資料時才會變得不連續來自現有的 Mat(借用單行或多行具有完整原始寬度的情況除外)。
例如,在以下程式碼片段中:
1 2 | <code class = "cpp" >cv::Mat image = cv::imread( "image.jpg" );
cv::Mat sub_image = image(cv::Rect(100, 100, 100, 100));
|
登入後複製
影像是連續的Mat 因為它是使用imread() 建立的,而sub_image 是不連續的,因為它引用了圖像Mat 的一部分。
以上是如何有效地將 OpenCV Mat 物件轉換為 C 陣列或向量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!