Hola quiero hacer un programa en Windows con Codeblocks utilizando las librerias de Opencv que reproduzca dos videos a la vez, uno en RGB y el otro en escala de grises.Cuando yo compilo el programa se genera el ejecutable y las 2 ventanas para reproducir los videos se abren pero no se llega a reproducir nada y aparece el siguiente error en una ventana:
" bad flag(parameter or structure field) (Unrecognized or unsupported array type) in function cvGETMAT, .\cxarray.cpp(2882)
¿A que se debe esto?
El codigo es el siguiente:
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include "comun.h"
#define fOriginal "OpenCV player"
#define fGris "OpenCV player gris"
int main(int argc, char* argv[])
{
int tecla, i, j;
IplImage *imgOrg, *imgGris;
CvSize imgSize; // size of visualisation image
CvCapture* videoOrg;
char nomVideoOrg[1024];
double fps, tiempoEntreCuadros;
int salir, // Controla la condición de terminación de la aplicación
parar; // La reproducc. del vídeo.
long int nCuadro = 0;
cvInitSystem( argc, argv );
printf("%s [OpenCV version %s]\n", argv[0], CV_VERSION );
printf("Va, %s en <%s>!\n", argv[0], (argc>1? argv[1]: ""));
//Comprobamos si han pasado un vídeo como parámetro, sino uno por defecto
sprintf( nomVideoOrg, "%s", (argc > 1? argv[1] : "laser.avi") );
if (nomVideoOrg == NULL)
{
fprintf(stderr, "Problemas con el fichero de vídeo: %s.\n", nomVideoOrg );
return( 1 );
}
videoOrg = cvCreateFileCapture( nomVideoOrg );
if (videoOrg == NULL)
{
fprintf(stderr, "Problemas abriendo el fichero de vídeo >%s<\n", nomVideoOrg );
return( 2 );
}
printf("Mostrando el contenido de la fuente de vídeo: >%s<\n \
ESC, q, Q - Salir.\n \
i/I - reIniciar el vídeo\n\
s/S - parar/continuar el vídeo\n",
nomVideoOrg );
imgOrg = cvQueryFrame( videoOrg );
cvCvtColor(imgOrg,imgGris,CV_BGR2GRAY);
if (imgOrg == NULL)
{
fprintf(stderr, "Problemas obteniendo imágenes en %s\n", nomVideoOrg );
return( 3 );
}
nCuadro++;
cvNamedWindow( fOriginal, CV_WINDOW_AUTOSIZE );
cvShowImage( fOriginal, imgOrg );
cvNamedWindow( fGris, CV_WINDOW_AUTOSIZE );
cvShowImage( fGris, imgGris);
imgSize.width = imgOrg->width;
imgSize.height = imgOrg->height;
fps = cvGetCaptureProperty( videoOrg, CV_CAP_PROP_FPS );
if (fps == 0.0)
fps = 25;
tiempoEntreCuadros = 1000.0 / fps;
salir = FALSE;
parar = FALSE;
while ( !salir )
{
if (parar == FALSE)
{
cvShowImage( fOriginal, imgOrg );
cvShowImage( fGris, imgGris );
nCuadro++;
fprintf(stdout, "%ld\r", nCuadro );
fflush( stdout );
}
tecla = cvWaitKey( tiempoEntreCuadros ) & 255;
switch ( tecla )
{
case ESC:
case 'q':
case 'Q': // Si 'ESC', q ó Q, ¡acabar!
// fprintf(stderr, "Acabando ...\n" );
salir = TRUE;
break;
case 'i': // Reiniciar
case 'I':
cvReleaseCapture( &videoOrg );
videoOrg = cvCreateFileCapture( nomVideoOrg );
if (videoOrg == NULL)
{
fprintf(stderr, "Problemas abriendo el fichero de vídeo >%s<\n", nomVideoOrg );
return( 2 );
}
parar = FALSE;
// fprintf(stderr, "Reiniciando ...\n" );
break;
case 's': // Stop
case 'S':
// fprintf(stderr, "Parar/continuar %d ...\n", parar );
parar = !parar;
break;
default: ; // fprintf(stdout, "Se ha pulsado la tecla %c (código %d)\n", tecla, tecla);
} // Fin de "switch ( tecla )"
if (parar == FALSE)
if (cvGrabFrame (videoOrg))
imgOrg = cvQueryFrame( videoOrg );
// Esta imgOrg es interna a OpenCV: no modificarla.
// Para hacer cambios, generar una copia y trabajar sobre esta
// if (cvGrabFrame (videoOrg)) {imgAux=cvQueryFrame(videoOrg); imgOrg=cvClone(imgAux); ...}
if ((parar == FALSE) AND (imgOrg == NULL))
{
parar = TRUE;
fprintf(stdout, "Fi del fitxer: ESC para terminar o 'i' para reiniciar. " );
fflush( stdout );
}
} // Fin de for(;
//cvWaitKey( 0 );
cvReleaseCapture( &videoOrg );
cvDestroyAllWindows( );
// No hace falta liberar la "imgOrg", ya que es una copia interna
// cvReleaseImage( &imgOrg );
return 0;
}// Fin de "main"
//
// Fi de fitxer "opencv_player"
//