使用cvget2dopencv函数

使用cvget2dopencv函数,opencv,Opencv,我试图使用OpenCV中的函数cvGet2D从图像中获取信息 我创建了一个包含10个IplImage指针的数组: IplImage *imageArray[10]; 我正在从我的网络摄像头中保存10幅图像: imageArray[numPicture] = cvQueryFrame(capture); 当我调用函数时: info = cvGet2D(imageArray[0], 250, 100); 其中info: CvScalar info; 我得到了一个错误: Ope

我试图使用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.1.0/src/cxcore/cxarray.cpp:1824:错误:(-5)函数cvPtr2D中的数组类型无法识别或不受支持

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

IplImage* imagen = cvLoadImage("test0.jpg");
info = cvGet2D(imagen, 250, 100);  
但是,我想使用数组中已经存储的信息


你知道我怎么解决吗

抱歉,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;
intmain()
{
//获取图像(我正在从文件中读取);
IplImage*img=cvLoadImage(“image.bmp”,1);
int i,j,k;
//用于存储图像属性的变量
整数高度、宽度、步长、通道;
uchar*数据;
//用于存储白色像素数和标志的变量
int白计数,bWhite;
//获取图像unfo
高度=img->height;
宽度=img->width;
步长=img->widthStep;
通道=img->n通道;
数据=(uchar*)img->imageData;
//开始
白细胞计数=0;

对于(i=0;i是的,消息是正确的

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

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;
int值=0;
值=((uchar*)(img->imageData+i*img->widthStep))[j*img->nChannels+0];

cout虽然这是一个非常晚的响应,但我猜可能有人仍然在使用
CvGet2D
搜索解决方案。这是它

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

例如:

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

文档中没有提到它,但您只能在
core.h
/
core\u c.h
中找到它。尝试转到
CvGet2D()
的声明,在函数原型上方,很少有注释解释这一点。

您确定“imageArray[0]''是一个有效的IPLICON指针吗?你可以在它上调试并查询它的成员值。嗨,豪尔赫,谢谢你的响应。我正在尝试你的代码,但是我得到了一个分段错误。我认为这是C++问题而不是OpenCV问题。变量数据被初始化为:data =(uCHAR*)IMALAREL[ 0 ]。->imageData;当我尝试打印第一个通道的值时出错:std::cout注意,这假设图像上没有设置ROI。该死,OpenCV文档真的很糟糕。感谢您指出这一点。