使用cvGet2D OpenCV函数

时间:2011-02-26 05:41:26

标签: opencv

我正在尝试使用OpenCV中的函数cvGet2D从图像中获取信息。

我创建了一个包含10个IplImage指针的数组:

IplImage *imageArray[10];  

我正在从我的网络摄像头保存10张图片:

imageArray[numPicture] = cvQueryFrame(capture);  

当我调用该函数时:

info = cvGet2D(imageArray[0], 250, 100);  

其中info

CvScalar info;  

我收到了错误:

  

OpenCV错误:cvPtr2D中的错误参数(无法识别或不支持的数组类型),文件/build/buildd/opencv-2.1.0/src/cxcore/cxarray.cpp,第1824行
  抛出'cv :: Exception'的实例后终止被调用     what():/ build / buildd / opencv-2.10 / src / cxcore / cxarray.cpp:1824:错误:( - 5)函数cvPtr2D中无法识别或不支持的数组类型

如果我使用函数cvLoadImage来初始化IplImage指针然后将其传递给cvGet2D函数,则代码可以正常工作:

IplImage* imagen = cvLoadImage("test0.jpg");
info = cvGet2D(imagen, 250, 100);  

但是,我想使用已经存储在我的数组中的信息。

你知道我怎么解决它?

3 个答案:

答案 0 :(得分:12)

即使它的响应非常晚,但我猜有人可能仍在使用CvGet2D搜索解决方案。在这里。

对于CvGet2D,我们需要先按Y然后X的顺序传递参数。

示例:

CvScalar s = cvGet2D(img, Y, X);

文档中的任何地方都没有提到它,但只能在core.h / core_c.h内找到它。尝试转到CvGet2D()的声明,在函数原型之上,很少有注释可以解释这一点。

答案 1 :(得分:9)

是的,消息是正确的。

如果你想存储一个像素值,你需要做这样的事情。

int value = 0;
value = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels +0];
cout << "pixel value for Blue Channel and (i,j) coordinates: " << value << endl;

总结,要绘制或存储数据,您必须创建一个整数值(像素值在0到255之间变化)。但是如果你只想测试像素值(比如if闭包或类似的东西),你可以直接访问像素值而不使用整数值。

我认为当你开始时有点奇怪,但是当你使用它2到3次时你会毫无困难地工作。

答案 2 :(得分:1)

抱歉,cvGet2D不是获取像素值的最佳方法。我知道它是最简洁明了的方法,因为你只需要一行代码并且知道坐标就可以获得像素值。

我建议你这个选项。当你看到这段代码时,你会认为这是如此复杂但更有效。

int main()
{
// Acquire the image (I'm reading it from a file);
IplImage* img = cvLoadImage("image.bmp",1);

int i,j,k;
// Variables to store image properties
int height,width,step,channels;
uchar *data;
// Variables to store the number of white pixels and a flag
int WhiteCount,bWhite;

// Acquire image unfo
height    = img->height;
width     = img->width;
step      = img->widthStep;
channels  = img->nChannels;
data      = (uchar *)img->imageData;

// Begin
WhiteCount = 0;
for(i=0;i<height;i++) 
{
  for(j=0;j<width;j++) 
  { // Go through each channel of the image (R,G, and B) to see if it's equal to 255
    bWhite = 0;
    for(k=0;k<channels;k++)
    {       // This checks if the pixel's kth channel is 255 - it can be faster.
            if (data[i*step+j*channels+k]==255) bWhite = 1;
            else 
            {
                    bWhite = 0;
                    break;
            }
    }
    if(bWhite == 1) WhiteCount++;
  }
}           

printf("Percentage: %f%%",100.0*WhiteCount/(height*width));

return 0;

此代码计算白色像素,并为您提供图像中白色像素的感知。