【问题标题】:Using cvGet2D OpenCV function使用 cvGet2D OpenCV 函数
【发布时间】:2011-07-04 18:17:59
【问题描述】:

我正在尝试使用 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”实例后调用终止
什么():/build/buildd/opencv-2.1.0/src/cxcore/cxarray.cpp:1824:错误:(-5)函数cvPtr2D中无法识别或不支持的数组类型

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

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

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

你知道我该如何解决吗?

【问题讨论】:

  • 你确定 ''imageArray[0]'' 是一个有效的 IplImage 指针吗?您可以对其进行调试并查询其成员的值。

标签: opencv


【解决方案1】:

尽管它的响应很晚,但我想有人可能仍在使用CvGet2D 寻找解决方案。在这里。

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

例子:

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

文档中没有提到它,但你只能在core.h/core_c.h 中找到它。尝试去CvGet2D()的声明,在函数原型之上,很少有cmet可以解释这一点。

【讨论】:

  • 该死,OpenCV 文档真的很烂。感谢您指出这一点。
【解决方案2】:

是的,消息是正确的。

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

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 次时,你会毫无困难地工作。

【讨论】:

  • 请注意,这是假设图像上没有设置 ROI。
【解决方案3】:

抱歉,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;

此代码计算白色像素并为您提供图像中白色像素的百分比。

【讨论】:

  • 您好豪尔赫,感谢您的回复。我正在尝试使用您的代码,但遇到了分段错误。我认为这是一个 C++ 问题而不是 OpenCv 问题。变量data初始化为:data = (uchar *)imageArray[0]->imageData;当我尝试打印第一个通道的值时发生错误: std::cout
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2017-03-20
  • 2019-12-05
  • 2018-12-29
  • 2010-11-01
相关资源
最近更新 更多