首頁 > 後端開發 > C++ > 如何有效率地存取 OpenCV 矩陣中的像素值?

如何有效率地存取 OpenCV 矩陣中的像素值?

Barbara Streisand
發布: 2024-12-07 13:46:12
原創
942 人瀏覽過

How to Efficiently Access Pixel Values in an OpenCV Matrix?

存取OpenCV 矩陣中的像素值

可以透過基於資料結構的各種方法從OpenCV Mat 影像中取得像素值用於表示像素。

假設影像類型為CV_8UC3,其中每個像素都表示透過三個8 位元無符號通道(BGR),可以如下實現檢索特定像素的值:

for (int i = 0; i < foo.rows; i++) {
    for (int j = 0; j < foo.cols; j++) {
        Vec3b bgrPixel = foo.at<Vec3b>(i, j);

        // Access and manipulate BGR values...
    }
}
登入後複製

Vec3b 是3 個元素向量的容器,其中每個元素對應於B、G和R 通道值。

最佳化效能

改進為了提高效能,可以使用直接存取資料緩衝區:

uint8_t* pixelPtr = (uint8_t*)foo.data;
int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;

for (int i = 0; i < foo.rows; i++) {
    for (int j = 0; j < foo.cols; j++) {
        bgrPixel.val[0] = pixelPtr[i * foo.cols * cn + j * cn + 0]; // B
        bgrPixel.val[1] = pixelPtr[i * foo.cols * cn + j * cn + 1]; // G
        bgrPixel.val[2] = pixelPtr[i * foo.cols * cn + j * cn + 2]; // R

        // Process BGR values...
    }
}
登入後複製

或者,可以使用row() 方法來訪問各個行:

int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;

for (int i = 0; i < foo.rows; i++) {
    uint8_t* rowPtr = foo.row(i);

    for (int j = 0; j < foo.cols; j++) {
        bgrPixel.val[0] = rowPtr[j * cn + 0]; // B
        bgrPixel.val[1] = rowPtr[j * cn + 1]; // G
        bgrPixel.val[2] = rowPtr[j * cn + 2]; // R

        // Process BGR values...
    }
}
登入後複製

以上是如何有效率地存取 OpenCV 矩陣中的像素值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板