OpenCV avec les caméras réseau
-
23-08-2019 - |
Question
J'utilise OpenCV 1.1pre1 sous Windows. J'ai une caméra réseau et je dois saisir les cadres de OpenCV. Cette caméra peut diffuser un flux standard MPEG-4 sur RTSP ou MJPEG sur http. J'ai vu beaucoup de discussions parler en utilisant ffmpeg avec OpenCV mais je ne peux pas le faire fonctionner.
Comment puis-je saisir des cadres à partir d'une caméra IP avec OpenCV?
Merci
Andrea
La solution
protocole RTSP ne fonctionne pas pour moi. MJPEG travaillé premier essai. Je suppose qu'il est intégré dans mon appareil photo (DCS 900 Dlink).
Syntaxe trouvée ici: http://answers.opencv.org/ question / 133 / how-do-i-accès-un-ip-caméra /
Je n'ai pas besoin de compiler OpenCV avec le soutien de ffmpg.
Autres conseils
J'enfermai code C ++ pour saisir des cadres. Il nécessite la version 2.0 ou supérieure OpenCV. Le code utilise cv :: structure de tapis qui est préféré ancienne structure 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;
}
}
Mise à jour Vous pouvez saisir des cadres de flux H.264 RTSP. Recherchez votre API d'appareil photo pour plus de détails pour obtenir la commande URL. Par exemple, pour une caméra réseau Axis l'adresse URL pourrait être:
// 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 peut être compilé avec le support FFMPEG. De ./ configure --help :
--with-ffmpeg use ffmpeg libraries (see LICENSE) [automatic]
Vous pouvez ensuite utiliser cvCreateFileCapture_FFMPEG pour créer un CvCapture avec par exemple l'URL du flux MJPG de l'appareil.
Je l'utiliser pour saisir les cadres d'une caméra AXIS:
CvCapture *capture =
cvCreateFileCapture_FFMPEG("http://axis-cam/mjpg/video.mjpg?resolution=640x480&req_fps=10&.mjpg");
Je viens de le faire comme ceci:
CvCapture *capture = cvCreateFileCapture("rtsp://camera-address");
Assurez-vous également que ce dll est disponible lors de l'exécution d'autre cvCreateFileCapture retournera NULL
opencv_ffmpeg200d.dll
La caméra doit permettre un accès non authentifié aussi, généralement fixé via son interface Web. MJPEG travaillé via RTSP mais MPEG4 n'a pas.
HTH
Si
Utilisation ffmpeglib pour se connecter au flux.
Ces fonctions peuvent être utiles. Mais jetez un oeil dans la documentation
av_open_input_stream(...);
av_find_stream_info(...);
avcodec_find_decoder(...);
avcodec_open(...);
avcodec_alloc_frame(...);
Vous auriez besoin d'un peu algo pour obtenir une image complète, qui est disponible ici
http://www.dranger.com/ffmpeg/tutorial01.html
Une fois que vous obtenez une image que vous pouvez copier les données vidéo (pour chaque plan si nécessaire) dans un IplImage qui est un objet d'image OpenCV.
Vous pouvez créer un IplImage en utilisant quelque chose comme ...
IplImage *p_gray_image = cvCreateImage(size, IPL_DEPTH_8U, 1);
Une fois que vous avez un IplImage, vous pouvez effectuer toutes sortes d'opérations d'image disponibles dans le répertoire lib OpenCV