首页 >后端开发 >C++ >如何高效访问 OpenCV 矩阵中的像素值?

如何高效访问 OpenCV 矩阵中的像素值?

Barbara Streisand
Barbara Streisand原创
2024-12-07 13:46:12937浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn