videocapture reproducir open guardar example con c++ macos opencv

c++ - guardar - reproducir video con opencv



OpenCV C++ Video Capture no parece funcionar (5)

Estoy usando una máquina Mac OS X 10.6. Tengo OpenCV 2.1 x64 compilado de la fuente usando Xcode y su compilador GCC.

Tengo problemas para usar las funciones de lectura de video en C ++ de OpenCV. Aquí está el código de prueba simple que estoy usando (vino directamente de la documentación de OpenCV):

#include "cv.h" #include "highgui.h" using namespace cv; int main(int, char**) { VideoCapture cap(0); // open the default camera if(!cap.isOpened()) // check if we succeeded return -1; Mat edges; namedWindow("edges",1); for(;;) { Mat frame; cap >> frame; // get a new frame from camera cvtColor(frame, edges, CV_BGR2GRAY); GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); Canny(edges, edges, 0, 30, 3); imshow("edges", edges); if(waitKey(200) >= 0) break; } // the camera will be deinitialized automatically in VideoCapture destructor return 0; }

El programa compila bien, pero cuando intento ejecutarlo, veo que la luz verde de mi cámara web se enciende por unos segundos, luego el programa sale con el mensaje de error:

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /Users/mark/Downloads/OpenCV-2.1.0/src/cxcore/cxarray.cpp, line 2476 terminate called after throwing an instance of ''cv::Exception'' what(): /Users/mark/Downloads/OpenCV-2.1.0/src/cxcore/cxarray.cpp:2476: error: (-206) Unrecognized or unsupported array type in function cvGetMat

En modo de depuración, la matriz todavía parece estar vacía después de la línea cap >> frame.

Obtengo un comportamiento similar cuando intento capturar desde un archivo de video o una imagen, por lo que no es la cámara. ¿Qué pasa? ¿Crees? ¿Hay algo que pueda hacer para que esto funcione?

EDITAR: Me gustaría agregar que si uso las funciones C, todo funciona bien. Pero me gustaría seguir con C ++ si puedo.

Gracias


Intente simplificar el programa para que pueda identificar la ubicación exacta del problema, por ejemplo, cambie su ciclo para que se vea así:

for(;;) { Mat frame; cap >> frame; // get a new frame from camera // cvtColor(frame, edges, CV_BGR2GRAY); // GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); // Canny(edges, edges, 0, 30, 3); // imshow("edges", edges); imshow("edges", frame); if(waitKey(200) >= 0) break; }

Si eso funciona bien, intente agregar nuevamente las llamadas de procesamiento, una a la vez, por ejemplo

for(;;) { Mat frame; cap >> frame; // get a new frame from camera cvtColor(frame, edges, CV_BGR2GRAY); // GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); // Canny(edges, edges, 0, 30, 3); imshow("edges", edges); if(waitKey(200) >= 0) break; }

y así...

Una vez que haya identificado la línea problemática, puede enfocarse en eso e investigar más a fondo.


Vaya a project->project properties->configuration properties->linker->input

En las dependencias adicionales pegue cv210.lib cvaux210.lib cxcore210.lib highgui210.lib


He visto el mismo problema. Cuando uso las características C, a veces también aparece la pregunta similar. Desde el mensaje de error del código C, creo que sucedió porque la cámara obtuvo un fotograma NULL. Entonces creo que se puede resolver de esta manera:

do { capture>>frame; }while(frame.empty());

De esa manera funciona en mi máquina.


Hola, tengo la solución para ti :)

VideoCapture san_cap(0); if (san_cap.isOpened()) { while (1) { san_cap.read(san); imshow("Video", san); Mat frame; san_cap.read(frame); // get a new frame from camera cvtColor(frame, edges, CV_BGR2GRAY); imshow("Video2", edges); int key = cv::waitKey(waitKeyValue); if (key == 27 ) { break; } } }


Me encontré con el mismo problema, parece que los primeros dos intentos de obtener el video no devolverán ninguna señal, por lo que si intentas usarlo obtendrás un error, aquí es cómo lo solucioné, simplemente añadiendo un contador y verificando el tamaño del video

int cameraNumber = 0; if ( argc > 1 ) cameraNumber = atoi(argv[1]); cv::VideoCapture camera; camera.open(cameraNumber); if ( !camera.isOpened() ) { cerr << "ERROR: Could not access the camera or video!" << endl; exit(1); } //give the camera 40 frames attempt to get the camera object, //if it fails after X (40) attemts the app will terminatet, //till then it will display ''Accessing camera'' note; int CAMERA_CHECK_ITERATIONS = 40; while (true) { Mat cameraFrame; camera >> cameraFrame; if ( cameraFrame.total() > 0 ) { Mat displayFrame( cameraFrame.size(), CV_8UC3 ); doSomething( cameraFrame, displayFrame ); imshow("Image", displayFrame ); } else { cout << "::: Accessing camera :::" << endl; if ( CAMERA_CHECK_ITERATIONS > 0 ) CAMERA_CHECK_ITERATIONS--; if ( CAMERA_CHECK_ITERATIONS < 0 ) break; } int key = waitKey(200); if (key == 27) break; }