【问题标题】:OpenCV 2.1: Runtime errorOpenCV 2.1:运行时错误
【发布时间】:2011-03-27 04:39:18
【问题描述】:

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

使用此颜色->灰度转换函数时,出现运行时错误:

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

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

谢谢

我的计划

#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 = 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);

}

【问题讨论】:

    标签: c opencv runtime-error


    【解决方案1】:

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

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

    请使用此代码作为参考。

    我在我的 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;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • IplImage* gray_frame = cvCreateImage(cvSize(color_frame->width,color_frame->height),IPL_DEPTH_8U, 1);
      • 嗨...感谢您的回复。在我的例子中,dst 是类型为 IplImage 的 gray_frame,所以我认为这应该不是问题。我正在编辑程序。你能在你的系统上尝试一下这个新程序吗?还是不行。
      • 您必须先分配 IplImage,然后再将其交给转换器。你只需要分配一次。
      • 您使用的是基于指针的“C” api,因此您必须通过分配函数(例如 cvCreateImage)进行分配。
      • Code-gijoe,我试过了,但我的应用程序再次挂起,这次是在我有线条的地方,IplImage* gray_frame = cvCreateImage(cvSize(color_frame->width,color_frame->高度),IPL_DEPTH_8U,1);在您建议的更改之后,您是否能够运行您的程序?您能否将您的程序粘贴到您的回复中?
      猜你喜欢
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 2013-01-14
      相关资源
      最近更新 更多