OpenCV com câmeras de rede
-
23-08-2019 - |
Pergunta
Eu estou usando openCV 1.1pre1 no Windows. Eu tenho uma câmera de rede e eu preciso pegar quadros openCV. Essa câmera pode transmitir um fluxo mpeg4 padrão sobre RTSP ou MJPEG sobre HTTP. Tenho visto muitos tópicos falando sobre o uso ffmpeg com openCV mas não posso fazê-lo funcionar.
Como posso agarrar quadros de uma câmera IP com openCV?
Graças
Andrea
Solução
rtsp não funcionou para mim. mjpeg trabalhou primeira tentativa. Presumo que é construído em minha câmera (Dlink DCS 900).
Sintaxe encontrada aqui: http://answers.opencv.org/ pergunta / 133 / how-do-i-access-an-ip-camera /
Eu não precisa compilar OpenCV com suporte ffmpg.
Outras dicas
I fechado código C ++ para agarrar quadros. Ela exige OpenCV versão 2.0 ou superior. O código usa estrutura cv :: esteira que é preferida a estrutura IplImage idade.
#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;
}
}
Atualizar Você pode pegar quadros H.264 RTSP córregos. Olhe para cima sua câmera API para obter mais informações para obter o comando de URL. Por exemplo, para uma câmera de rede Axis o endereço URL pode 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:password@10.10.10.10:554/axis-media/media.amp
#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);
}
OpenCV pode ser compilado com suporte FFMPEG. De ./ configure --help :
--with-ffmpeg use ffmpeg libraries (see LICENSE) [automatic]
Você pode usar cvCreateFileCapture_FFMPEG para criar uma CvCapture com por exemplo, a URL do fluxo MJPG da câmara.
Eu uso isso para quadros de apoio de uma câmera AXIS:
CvCapture *capture =
cvCreateFileCapture_FFMPEG("http://axis-cam/mjpg/video.mjpg?resolution=640x480&req_fps=10&.mjpg");
Eu só faço isso como este:
CvCapture *capture = cvCreateFileCapture("rtsp://camera-address");
Certifique-se também esta dll está disponível em tempo de execução o mais cvCreateFileCapture retornará NULL
opencv_ffmpeg200d.dll
A câmera precisa permitir o acesso não autenticado também, normalmente definido por meio de sua interface web. formato MJPEG trabalhou via RTSP mas MPEG4 não.
hth
Si
Use ffmpeglib para ligar à corrente.
Estas funções podem ser úteis. Mas dê uma olhada na documentação
av_open_input_stream(...);
av_find_stream_info(...);
avcodec_find_decoder(...);
avcodec_open(...);
avcodec_alloc_frame(...);
Você precisaria de um pouco de algo para obter um quadro completo, que está disponível aqui
http://www.dranger.com/ffmpeg/tutorial01.html
Depois de conseguir um quadro você pode copiar os dados de vídeo (para cada avião, se necessário) em um IplImage que é um objecto imagem OpenCV.
Você pode criar um IplImage usando algo como ...
IplImage *p_gray_image = cvCreateImage(size, IPL_DEPTH_8U, 1);
Uma vez que você tem uma IplImage, você poderia realizar todos os tipos de operações de imagem disponíveis no OpenCV lib