OpenCV 2.1: error de tiempo de ejecución

3 minutos de lectura

OpenCV 21 error de tiempo de ejecucion
HaggarTheHorrible

Tengo un programa que usa OpenCV. Tengo una cámara web y captura marcos de color y quiero convertir los marcos de color en marcos de escala de grises. Entonces, usé el cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY); para convertir los marcos de color en marcos BW.

Al usar esta función de conversión de color->escala de grises, aparece un error de tiempo de ejecución como:

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

¿Alguien ha experimentado este problema antes? ¿Alguna solución para solucionar esto?

Gracias

Mi programa

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

}

Veo a mucha gente tratando de hacer esta tarea simple y teniendo problemas con ella.

Así que me tomé la libertad de cambiar su código fuente a un programa que mostraría en la pantalla el video convertido en escala de grises de la cámara web.

Utilice este código como referencia.

Compilé en mi Macbook Pro con:

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

Expediente: gris.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;
}

¿No tienes que asignar tu IplImage? No está especificado por la función de conversión, pero creo que debe asignar un dst del mismo tamaño/tipo que la fuente.

  • IplImage* gray_frame = cvCreateImage(cvSize(color_frame->ancho,color_frame->alto),IPL_DEPTH_8U, 1);

    – código-gijoe

    9 de agosto de 2010 a las 19:08

  • Hola… gracias por responder. El dst en mi caso es gray_frame que es del tipo IplImage, así que creo que no debería ser un problema. Estoy editando el programa. ¿Puede probar una vez este nuevo programa en su sistema? Todavía no funciona.

    – Haggar El Horrible

    9 de agosto de 2010 a las 19:08


  • TIENE que asignar IplImage antes de entregarlo al convertidor. Sin embargo, solo necesita asignarlo una vez.

    – código-gijoe

    9 de agosto de 2010 a las 19:19

  • Está utilizando la API “C” que se basa en un puntero, por lo que debe realizar sus asignaciones mediante funciones de asignación como cvCreateImage.

    – código-gijoe

    9 de agosto de 2010 a las 19:20

  • Code-gijoe, lo intenté, pero una vez más mi aplicación se cuelga, esta vez en el punto donde tengo la línea, IplImage* gray_frame = cvCreateImage(cvSize(color_frame->width,color_frame->height),IPL_DEPTH_8U, 1); ¿Pudo ejecutar su programa después del cambio que ha sugerido? ¿Puede por favor pegar su programa en su respuesta?

    – Haggar El Horrible

    9 de agosto de 2010 a las 19:56


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad