我正在尝试使用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);
但是,我想使用已经存储在我的数组中的信息。
你知道我怎么解决它?
答案 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;
此代码计算白色像素,并为您提供图像中白色像素的感知。