Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV 2.1:运行时错误_C_Opencv_Runtime Error - Fatal编程技术网

OpenCV 2.1:运行时错误

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

我有一个使用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\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)进行分配,我试过了,但我的应用程序再次挂起,这次在我有线的时候,我