OpenCV 2.1:运行时错误

我有一个使用OpenCV的程序。 我有一个网络摄像头,它捕获彩色帧,我想将彩色帧转换为灰度帧。 所以,我使用了cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY); 将颜色帧转换为BW帧。

使用此颜色 – >灰度转换函数时,我得到一个运行时错误:

 OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file ..\..\..\..\ocv\opencv\src\cxcore\cxarray.cpp, line 2376 

以前有人遇到过这个问题吗 任何解决方案如何解决此问题?

谢谢

我的计划

 #include #include #include #include #include"cv.h" #include"highgui.h" #include"cxtypes.h" #define ERROR -1 #define NO_ERROR 1 int main() { int EXIT_STATUS = NO_ERROR; int camera_index = 0; CvCapture *capture = 0; IplImage *color_frame = NULL; IplImage *gray_frame = NULL; int exit_key_press = 0; capture = cvCaptureFromCAM(camera_index); cvNamedWindow("SURF", CV_WINDOW_AUTOSIZE); while(exit_key_press != 's') { /* Capture a frame */ color_frame = cvQueryFrame(capture); if(color_frame == NULL) { break; } else { // When this line is enabled the runtime error occurs. //cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY); cvShowImage("SURF", color_frame ); } exit_key_press = cvWaitKey(1); } cvDestroyWindow("Output"); cvReleaseCapture(&capture); printf("\n\n~*~The END~*~"); exit(EXIT_STATUS); } 

你不必分配你的IplImage吗? 它不是由转换函数指定的,但我相信您必须分配与源相同大小/类型的dst。

我看到很多人试图做这个简单的任务并且遇到麻烦。

因此,我冒昧地将您的源代码更改为一个程序,该程序将在屏幕上显示来自网络摄像头的灰度转换video。

请使用此代码作为参考。

我在我的Macbook Pro上编译:

 g++ -I/usr/include/opencv -c gray.cpp -o gray.o -m32 -arch i386 g++ gray.o -o gray -L/usr/lib -lcxcore -lcv -lhighgui -lcvaux -lml -ldl -m32 -arch i386 

文件: gray.cpp

 #include #include #include #include #include"cv.h" #include"highgui.h" #include"cxtypes.h" #define ERROR -1 #define NO_ERROR 1 int main() { int camera_index = 0; IplImage *color_frame = NULL; int exit_key_press = 0; CvCapture *capture = NULL; capture = cvCaptureFromCAM(camera_index); if (!capture) { printf("!!! ERROR: cvCaptureFromCAM\n"); return -1; } cvNamedWindow("Grayscale video", CV_WINDOW_AUTOSIZE); while (exit_key_press != 'q') { /* Capture a frame */ color_frame = cvQueryFrame(capture); if (color_frame == NULL) { printf("!!! ERROR: cvQueryFrame\n"); break; } else { IplImage* gray_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1); if (gray_frame == NULL) { printf("!!! ERROR: cvCreateImage\n"); continue; } cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY); cvShowImage("Grayscale video", gray_frame); cvReleaseImage(&gray_frame); } exit_key_press = cvWaitKey(1); } cvDestroyWindow("Grayscale video"); cvReleaseCapture(&capture); return 0; }