我已经编写了以下代码示例,该示例应该创建一个外观奇特的渐变,并将其保存到用户指定的文件中:
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
static IplImage *image = 0;
void main() {
char path[1024];
int x, y;
CvScalar scalar;
scanf("%s", path);
image = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
for (y = 0; y < 480; y++) {
for (x = 0; x < 640; x++) {
scalar = cvGet2D(image, x, y);
scalar.val[0]=(unsigned char)(x + y);
cvSet2D(image, x, y, scalar);
}
}
cvSaveImage(path, image, 0);
}
我使用:gcc opencv.c -o opencv `pkg-config --libs --cflags opencv` -lm
编译它,一切似乎都很好。然而,在运行时(输入:"sample.png"),我得到了以下错误:
OpenCV错误:cvPtr2D中的一个参数值超出范围(索引超出范围),文件/builddir/build/build/OpenCV-2.3.1/modules/core/src/array.cpp,第1797行在引发"cv::Exception"的实例后调用了terminatewhat():/builddir/build/build/OpenCV-2.3.1/modules/core/src/array.cpp:1797:错误:函数cvPtr2D中的(-211)索引超出范围中止(堆芯转储)
有什么需要帮忙的吗?提前感谢!:)
cvGet2D和cvSet2D与opencv中的许多其他函数一样使用[行,列]约定。
有关进一步的读数:http://www.cs.iit.edu/~agam/cs512/elect notes/occv intro/
cvGet2D
和cvSet2D
函数将行作为第一个参数,将列作为第二个参数:x和y参数的循环方式错误。因此,你正在走出图像。呼叫应为:
cvGet2D(image, y, x);