c++ - español - ejemplos programas en qt creator
OpenCV con cámaras de red (6)
El protocolo rtsp no funcionó para mí. mjpeg trabajó primero, intente. Supongo que está integrado en mi cámara (Dlink DCS 900).
Sintaxis encontrada aquí: http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera/
No necesité compilar OpenCV con soporte ffmpg.
Estoy usando openCV 1.1pre1 en Windows. Tengo una cámara de red y necesito tomar marcos de openCV. Esa cámara puede transmitir una secuencia mpeg4 estándar sobre RTSP o mjpeg a través de http. He visto muchos hilos hablando de usar ffmpeg con openCV pero no puedo hacerlo funcionar.
¿Cómo puedo tomar fotogramas de una cámara IP con openCV?
Gracias
Andrea
Incluí el código de C ++ para capturar fotogramas. Requiere OpenCV versión 2.0 o superior. El código usa la estructura cv :: mat, que es preferible a la antigua estructura de IplImage.
#include "cv.h"
#include "highgui.h"
#include <iostream>
int main(int, char**) {
cv::VideoCapture vcap;
cv::Mat image;
const std::string videoStreamAddress = "rtsp://cam_address:554/live.sdp";
/* it may be an address of an mjpeg stream,
e.g. "http://user:pass@cam_address:8081/cgi/mjpg/mjpg.cgi?.mjpg" */
//open the video stream and make sure it''s opened
if(!vcap.open(videoStreamAddress)) {
std::cout << "Error opening video stream or file" << std::endl;
return -1;
}
//Create output window for displaying frames.
//It''s important to create this window outside of the `for` loop
//Otherwise this window will be created automatically each time you call
//`imshow(...)`, which is very inefficient.
cv::namedWindow("Output Window");
for(;;) {
if(!vcap.read(image)) {
std::cout << "No frame" << std::endl;
cv::waitKey();
}
cv::imshow("Output Window", image);
if(cv::waitKey(1) >= 0) break;
}
}
Actualización Puede tomar cuadros de las transmisiones H.264 RTSP. Busque la API de su cámara para obtener detalles para obtener el comando URL. Por ejemplo, para una cámara de red Axis, la dirección URL podría ser:
// H.264 stream RTSP address, where 10.10.10.10 is an IP address
// and 554 is the port number
rtsp://10.10.10.10:554/axis-media/media.amp
// if the camera is password protected
rtsp://username:[email protected]:554/axis-media/media.amp
OpenCV se puede compilar con soporte FFMPEG. Desde ./configure --help :
--with-ffmpeg use ffmpeg libraries (see LICENSE) [automatic]
A continuación, puede usar cvCreateFileCapture_FFMPEG para crear un CvCapture con, por ejemplo, la URL de la secuencia MJPG de la cámara.
Lo uso para tomar cuadros de una cámara AXIS:
CvCapture *capture =
cvCreateFileCapture_FFMPEG("http://axis-cam/mjpg/video.mjpg?resolution=640x480&req_fps=10&.mjpg");
Simplemente lo hago así:
CvCapture *capture = cvCreateFileCapture("rtsp://camera-address");
También asegúrese de que este dll esté disponible en tiempo de ejecución; de lo contrario, cvCreateFileCapture devolverá NULL
opencv_ffmpeg200d.dll
La cámara también debe permitir el acceso no autenticado, generalmente configurado a través de su interfaz web. El formato MJPEG funcionaba a través de rtsp, pero MPEG4 no.
hth
Si
Use ffmpeglib para conectarse a la transmisión.
Estas funciones pueden ser útiles. Pero eche un vistazo en los documentos
av_open_input_stream(...);
av_find_stream_info(...);
avcodec_find_decoder(...);
avcodec_open(...);
avcodec_alloc_frame(...);
Necesitarías un pequeño algoritmo para obtener un cuadro completo, que está disponible aquí
http://www.dranger.com/ffmpeg/tutorial01.html
Una vez que obtenga un marco, puede copiar los datos de video (para cada plano si es necesario) en una IplImage que es un objeto de imagen OpenCV.
Puede crear una imagen Ipl usando algo como ...
IplImage *p_gray_image = cvCreateImage(size, IPL_DEPTH_8U, 1);
Una vez que tiene una imagen Ipl, puede realizar todo tipo de operaciones de imagen disponibles en la biblioteca OpenCV
#include <stdio.h>
#include "opencv.hpp"
int main(){
CvCapture *camera=cvCaptureFromFile("http://username:pass@cam_address/axis-cgi/mjpg/video.cgi?resolution=640x480&req_fps=30&.mjpg");
if (camera==NULL)
printf("camera is null/n");
else
printf("camera is not null");
cvNamedWindow("img");
while (cvWaitKey(10)!=atoi("q")){
double t1=(double)cvGetTickCount();
IplImage *img=cvQueryFrame(camera);
double t2=(double)cvGetTickCount();
printf("time: %gms fps: %.2g/n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));
cvShowImage("img",img);
}
cvReleaseCapture(&camera);
}