0

我编写了以下代码示例,它应该创建一个外观奇特的渐变并将其保存到用户指定的文件中:

#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' 的实例后调用终止
  什么():/builddir/build/BUILD/OpenCV-2.3.1/modules/core/src/array.cpp:1797:错误:(-211)索引超出函数cvPtr2D的范围

中止(核心转储)

请问有什么帮助吗?提前致谢!:)

4

2 回答 2

4

cvGet2D 和 cvSet2D 使用 [row,column] 约定,就像 opencv 中的许多其他函数一样。

进一步阅读: http ://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/

于 2013-02-03T22:12:29.260 回答
1

cvGet2Dand函数将cvSet2D行作为第一个参数,将列作为第二个参数:您的 x 和 y 参数反了。因此,您将离开图像。调用应该是:

cvGet2D(image, y, x);
于 2013-02-03T22:12:33.177 回答