OpenCV 2.1:运行时错误
我有一个使用OpenCV的程序。我有一个网络摄像头,它捕捉彩色帧,我想把彩色帧转换成灰度帧。因此,我使用了OpenCV 2.1:运行时错误,c,opencv,runtime-error,C,Opencv,Runtime Error,我有一个使用OpenCV的程序。我有一个网络摄像头,它捕捉彩色帧,我想把彩色帧转换成灰度帧。因此,我使用了cvtcolor(color\u frame,gray\u frame,CV\u bgr2 gray)将颜色帧转换为BW帧 使用此颜色->灰度转换函数时,我得到一个运行时错误,如下所示: OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file ..\..\..\..\ocv\ope
cvtcolor(color\u frame,gray\u frame,CV\u bgr2 gray)
将颜色帧转换为BW帧
使用此颜色->灰度转换函数时,我得到一个运行时错误,如下所示:
OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file ..\..\..\..\ocv\opencv\src\cxcore\cxarray.cpp, line 2376
以前有人遇到过这个问题吗?有什么解决方案可以解决这个问题吗
谢谢
我的节目
#包括
#包括
#包括
#包括
#包括“cv.h”
#包括“highgui.h”
#包括“cxtypes.h”
#定义错误-1
#定义无错误1
int main()
{
int EXIT_STATUS=无错误;
int camera_索引=0;
CvCapture*capture=0;
IplImage*color_frame=NULL;
IplImage*灰色_帧=空;
int exit_key_press=0;
捕获=cvCaptureFromCAM(摄像机索引);
cvNamedWindow(“冲浪”,CV_窗口_自动调整大小);
同时(退出键按!=“s”)
{
/*抓拍一帧*/
color_frame=cvQueryFrame(捕获);
如果(颜色\帧==NULL)
{
打破
}
其他的
{
//启用此行时,会发生运行时错误。
//CVT颜色(彩色边框、灰色边框、CV边框、灰色);
cvShowImage(“冲浪”,彩色画框);
}
退出键按下=cvWaitKey(1);
}
CVD窗口(“输出”);
cvReleaseCapture(&capture);
printf(“\n\n~*~结尾~*~”;
退出(退出状态);
}
您不需要分配您的IplImage吗?它不是由转换函数指定的,但我相信您必须分配与源相同大小/类型的dst。您不需要分配IplImage吗?转换函数没有指定它,但我相信您必须分配一个与源相同大小/类型的dst。我看到很多人试图完成这个简单的任务,但遇到了麻烦
因此,我冒昧地将您的源代码更改为一个程序,该程序将在屏幕上显示从网络摄像头转换的灰度视频
请使用此代码作为参考
我在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<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;
}
#包括
#包括
#包括
#包括
#包括“cv.h”
#包括“highgui.h”
#包括“cxtypes.h”
#定义错误-1
#定义无错误1
int main()
{
int camera_索引=0;
IplImage*color_frame=NULL;
int exit_key_press=0;
CvCapture*capture=NULL;
捕获=cvCaptureFromCAM(摄像机索引);
如果(!捕获)
{
printf(!!!错误:cvCaptureFromCAM\n”);
返回-1;
}
cvNamedWindow(“灰度视频”,CV_窗口_自动调整大小);
同时(退出键按!=“q”)
{
/*抓拍一帧*/
color_frame=cvQueryFrame(捕获);
如果(颜色\帧==NULL)
{
printf(!!!错误:cvQueryFrame\n”);
打破
}
其他的
{
IplImage*gray\u frame=cvCreateImage(cvSize(颜色框架->宽度,颜色框架->高度),颜色框架->深度,1);
如果(灰色帧==NULL)
{
printf(!!!错误:cvCreateImage\n”);
继续;
}
CVT颜色(彩色边框、灰色边框、CV边框、灰色);
cvShowImage(“灰度视频”,灰度帧);
cvReleaseImage(灰色框架);
}
退出键按下=cvWaitKey(1);
}
视频窗口(“灰度视频”);
cvReleaseCapture(&capture);
返回0;
}
我看到很多人试图完成这项简单的任务,但却遇到了麻烦
因此,我冒昧地将您的源代码更改为一个程序,该程序将在屏幕上显示从网络摄像头转换的灰度视频
请使用此代码作为参考
我在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<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;
}
#包括
#包括
#包括
#包括
#包括“cv.h”
#包括“highgui.h”
#包括“cxtypes.h”
#定义错误-1
#定义无错误1
int main()
{
int camera_索引=0;
IplImage*color_frame=NULL;
int exit_key_press=0;
CvCapture*capture=NULL;
捕获=cvCaptureFromCAM(摄像机索引);
如果(!捕获)
{
printf(!!!错误:cvCaptureFromCAM\n”);
返回-1;
}
cvNamedWindow(“灰度视频”,CV_窗口_自动调整大小);
同时(退出键按!=“q”)
{
/*抓拍一帧*/
color_frame=cvQueryFrame(捕获);
如果(颜色\帧==NULL)
{
printf(!!!错误:cvQueryFrame\n”);
打破
}
其他的
{
IplImage*gray\u frame=cvCreateImage(cvSize(颜色框架->宽度,颜色框架->高度),颜色框架->深度,1);
如果(灰色帧==NULL)
{
printf(!!!错误:cvCreateImage\n”);
继续;
}
CVT颜色(彩色边框、灰色边框、CV边框、灰色);
cvShowImage(“灰度视频”,灰度帧);
cvReleaseImage(灰色框架);
}
退出键按下=cvWaitKey(1);
}
视频窗口(“灰度视频”);
cvReleaseCapture(&capture);
返回0;
}
IplImage*gray\u frame=cvCreateImage(cvSize(颜色\u frame->宽度,颜色\u frame->高度),IPL\u深度\u 8U,1);你好谢谢你的回复。在我的例子中,dst是IplImage类型的灰色框架,因此我认为这不应该是一个问题。我正在编辑节目。你能在你的系统上试一下这个新程序吗。它仍然不起作用。您必须先分配IplImage,然后再将其交给转换器。你只需要分配它一次。你使用的是基于指针的“C”api,因此你必须通过分配函数(如cvCreateImage.Code-gijoe)进行分配,我试过了,但我的应用程序再次挂起,这次在我有线的时候,我