I have a program which uses OpenCV. I have a webcam and it captures color frames and I want to convert the color frames to gray-scale frames. So, I used the cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY);
to convert the color frames to BW frames.
Upon using this color->Grayscale conversion function, I get a runtime error as:
OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file ..\..\..\..\ocv\opencv\src\cxcore\cxarray.cpp, line 2376
Anyone experienced this problem before? Any solutions how to fix this?
Thanks
My Program
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/time.h>
#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 = cvQuer开发者_JAVA技巧yFrame(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);
}
I see a lot of people trying to do this simple task and having trouble with it.
So I took the liberty of changing your source code into a program that would display on the screen the grayscale converted video from the webcam.
Please use this code for reference.
I compiled on my Macbook Pro with:
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
File: gray.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/time.h>
#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;
}
Don't you have to allocate your IplImage? It is not specified by the conversion function but I believe you have to allocate a dst the same size/type as the source.
精彩评论