如何从opencv中的RGB图像(3通道图像)访问图像数据

时间:2010-02-24 11:32:23

标签: c++ c opencv computer-vision

我想在这里拍摄图像的imageData,其中w =图像宽度,h =图像高度

for (int i = x; i < x+h; i++) //height of frame pixels
{
    for (int j = y; j < y+w; j++)//width of frame pixels
    {
        int pos = i * w * Channels + j; //channels is 3 as rgb 
        // if any data exists
        if (data->imageData[pos]>0) //Taking data (here is the problem how to take)
        {
            xPos += j;
            yPos += i;
            nPix++;
        }
    }
}

5 个答案:

答案 0 :(得分:4)

jeff7为您提供了一个非常旧版本的OpenCV的链接。 OpenCV 2.0有一个新的C ++包装器,它比链接中提到的C ++包装器好得多。我建议您阅读C++ reference of OpenCV,了解有关如何访问单个像素的信息。

另外需要注意的是:外部循环应该是y方向上的循环(垂直),内部循环是x方向上的循环。 OpenCV使用C / C ++,它将值存储在行major中。

答案 1 :(得分:1)

请参阅有关在OpenCV中访问IplImage中像素的多种方法的详细解释here

从您发布的代码中,您的问题在于您的位置变量,您需要类似int pos = i*w*Channels + j*Channels的内容,然后您可以访问RGB像素

unsigned char r = data->imageData[pos];

unsigned char g = data->imageData[pos+1];

unsigned char b = data->imageData[pos+2];

(假设是RGB,但在某些平台上我认为它可以存储BGR)。

答案 2 :(得分:1)

这篇文章的源代码显示了您要完成的任务:

Accessing negative pixel values OpenCV

答案 3 :(得分:1)

uchar* colorImgPtr;
for(int i=0; i<colorImg->width; i++){

    for(int j=0; j<colorImg->height; j++){

        colorImgPtr = (uchar *)(colorImg->imageData) + (j*colorImg->widthStep + i-colorImg->nChannels)

        for(int channel = 0; channel < colorImg->nChannels; channel++){

            //colorImgPtr[channel] here you have each value for each pixel for each channel
        }
    }
}

答案 4 :(得分:0)

有很多方法可以做到这一点(jeff7提供的链接非常有用)。

访问图像数据的首选方法是cvPtr2D方法。你会想要这样的东西:

for(int x = 0; x < width; ++x)
{
    for(int y = 0; y < height; ++y)
    {
        uchar* ptr = cvPtr2D(img, y, x, NULL);
        // blue channel can now be accessed with ptr[0]
        // green channel can now be accessed with ptr[1]
        // red channel can now be accessed with ptr[2]
    }
}

(img是上面代码中的IplImage*

不确定这是否是最有效的方法,但我觉得这是最简单,最简单的方法。

您可以找到此方法的文档here