OpenCV(cv::Mat 類的成員函式 ptr<T>())

做梦当财神發表於2024-09-03

目錄
  • 1. 函式定義
  • 2. 功能
  • 3. 示例
  • 4. 注意事項
  • 總結



在 OpenCV 中,Mat 類的成員函式 ptr<T>() 用於獲取指向矩陣資料的指標,允許直接訪問底層資料。T 是指標的型別,它通常與矩陣的元素型別對應。透過這個函式,你可以以一種低開銷的方式訪問和修改矩陣資料。



1. 函式定義

template<typename T>
T* ptr(int row = 0);
  • T: 指定資料型別的指標,比如 float*, uchar* 等等。
  • row: 表示要訪問的矩陣行的索引(預設是 0)。


2. 功能

  1. 訪問矩陣的指定行: ptr<T>(row) 返回矩陣中指定行的資料指標。例如,在處理影像時,你可以獲取每一行的資料並進行逐畫素的操作。

  2. 型別安全的指標: 透過模板引數 T,你可以獲得型別安全的指標,並且能夠確保讀取到的資料符合指定的型別。



3. 示例

假設有一個 2D 浮點型矩陣,你想高效地遍歷和訪問矩陣中的每一個元素,ptr<float>() 可以幫助你直接訪問指定行的所有資料。

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 建立一個3x3的浮點矩陣
    cv::Mat mat = (cv::Mat_<float>(3, 3) << 1.0, 2.0, 3.0, 
                                             4.0, 5.0, 6.0, 
                                             7.0, 8.0, 9.0);

    // 遍歷矩陣的每一行
    for (int i = 0; i < mat.rows; i++) {
        // 獲取指向該行首元素的指標
        float* rowPtr = mat.ptr<float>(i);

        // 透過指標遍歷該行的所有列元素
        for (int j = 0; j < mat.cols; j++) {
            // 修改該元素的值
            rowPtr[j] += 1.0;  // 每個元素加1
        }
    }

    std::cout << "Updated Matrix:\n" << mat << std::endl;

    return 0;
}

輸出:

Updated Matrix:
[2, 3, 4;
 5, 6, 7;
 8, 9, 10]
  • mat.ptr<float>(i):用於獲取矩陣 mat 的第 i 行的指向 float 型別資料的指標。
  • 直接訪問資料:rowPtr[j] 允許你像訪問普通陣列那樣訪問每一列的元素。
  • 高效性:由於 ptr<T>() 直接返回指標,你可以直接操作底層資料。這種方式比使用 at() 方法更高效,尤其是在處理大量資料時。

假設有一個 8 位單通道(灰度)影像 Mat 物件 img,你可以使用 ptr<uchar>() 訪問和修改影像資料。

cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);

// 遍歷每一行
for (int i = 0; i < img.rows; ++i) {
    // 獲取第 i 行的指標
    uchar* row_ptr = img.ptr<uchar>(i);

    // 遍歷每一列
    for (int j = 0; j < img.cols; ++j) {
        // 訪問第 i 行第 j 列的畫素
        uchar pixel = row_ptr[j];

        // 修改畫素值
        row_ptr[j] = pixel / 2;  // 例如,將畫素值減半
    }
}

在這個例子中,ptr<uchar>(i) 返回指向第 i 行資料的指標,型別為 uchar*,每個元素是影像中的一個畫素。



4. 注意事項

  • 型別匹配: ptr<T>() 中的 T 必須與 Mat 物件的實際資料型別匹配,否則會出現未定義行為。
  • 行索引有效性ptr<T>() 接受行索引 i,確保傳遞的索引值在矩陣行數範圍內,否則會產生越界訪問錯誤。


總結

ptr<T>() 是 OpenCV 提供的高效資料訪問手段,它允許你繞過矩陣的邊界檢查和安全性檢查,直接訪問矩陣的底層資料,尤其適用於對效能有要求的場景。



相關文章