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;
}