我想在这里拍摄图像的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++;
}
}
}
答案 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)
这篇文章的源代码显示了您要完成的任务:
答案 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。