首页  >  文章  >  后端开发  >  如何在 OpenCV 中访问 Mat 图像中的像素通道值?

如何在 OpenCV 中访问 Mat 图像中的像素通道值?

DDD
DDD原创
2024-11-25 01:46:14137浏览

How do you access pixel channel values in a Mat image in OpenCV?

在 OpenCV 中从 Mat 图像中提取像素通道值

在 OpenCV 中,有多种方法可以访问和操作 Mat 图像中的像素值。一种常见的场景是检索特定像素的通道值。

使用 Vec3b

如果图像以 CV_8UC3 格式存储,它表示具有 8 位无符号整数的三通道图像值 (BGR),您可以使用 Vec3b 数据类型来访问各个通道。例如,如果 foo 是这种类型的 Mat 图像,您可以使用以下代码迭代像素:

for (int i = 0; i < foo.rows; i++)
{
    for (int j = 0; j < foo.cols; j++)
    {
        Vec3b bgrPixel = foo.at<Vec3b>(i, j);
        
        // Access the pixel's BGR values...
    }
}

使用直接数据缓冲区访问

出于性能原因,您可以也可以通过访问数据缓冲区直接访问像素值。这提供了更快的访问,但需要更多的手动处理数据转换和通道偏移。以下是如何执行此操作的示例:

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
        
        // Access the pixel's 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

        // Access the pixel's BGR values...
    }
}

请记住,OpenCV 以 BGR 格式(蓝色、绿色、红色)而不是 RGB 存储像素值,因此您需要访问频道时要注意这一点。

以上是如何在 OpenCV 中访问 Mat 图像中的像素通道值?的详细内容。更多信息请关注PHP中文网其他相关文章!

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