OpenCV从Mat图像获取像素通道值

HRÓ*_*LFR 33 c++ opencv getpixel

也许我看起来不够努力,但似乎所有东西都要我使用数组.因此,如果foo是这样的话,如何获取foo的特定像素的通道值Mat foo = imread("bar.png")

mev*_*ron 93

假设类型是CV_8UC3,你会这样做:

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

        // do something with BGR values...
    }
}
Run Code Online (Sandbox Code Playgroud)

是Vec3b的文档.希望有所帮助!另外,不要忘记OpenCV内部存储的东西为BGR而不是RGB.

编辑:
出于性能原因,您可能希望使用直接访问数据缓冲区来处理像素值:

您可以采用以下方式:

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

        // do something with BGR values...
    }
}
Run Code Online (Sandbox Code Playgroud)

或者:

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

        // do something with BGR values...
    }
}
Run Code Online (Sandbox Code Playgroud)


Yod*_*oda 15

以下代码适用于访问和更改像素值.

用于访问像素的通道值:

for (int i = 0; i < image.cols; i++) {
    for (int j = 0; j < image.rows; j++) {
        Vec3b intensity = image.at<Vec3b>(j, i);
        for(int k = 0; k < image.channels(); k++) {
            uchar col = intensity.val[k]; 
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

要更改频道的像素值:

uchar pixValue;
for (int i = 0; i < image.cols; i++) {
    for (int j = 0; j < image.rows; j++) {
        Vec3b &intensity = image.at<Vec3b>(j, i);
        for(int k = 0; k < image.channels(); k++) {
            // calculate pixValue
            intensity.val[k] = pixValue;
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

`

来源:访问像素值