2017-09-21 8 views
0

J'ai un projet en cours d'accès à plusieurs caméras IP via opencv VideoCapture, qui fonctionne pour la plupart d'entre eux.Authentification OpenCV VideoCapture digest

J'ai une nouvelle caméra Dahua PTZ qui utilise l'authentification Digest, et VideoCapture dans OpenCV ne peut pas l'ouvrir. Grâce à WireShark, j'ai pu voir que la caméra retournait un 401 non désincarné.

Je n'ai rien trouvé dans la documentation d'OpenCV à propos des problèmes d'authentification.

Peut-être que j'ai besoin d'utiliser autre chose que OpenCV pour résoudre ce problème?

Voici un code de fonctionnement minimum (si vous avez une caméra à tester).

#include <iostream> 
#include <imgproc.hpp> 
#include <opencv.hpp> 
#include <highgui.hpp> 

using namespace std; 
using namespace cv; 
int main(){ 
    while(1){ 
     VideoCapture cap("http://login:[email protected]/cgi-bin/snapshot.cgi"); 
     if(!cap.isOpened()){ 
      cout << "bug" << endl; 
      continue; 
     } 
     Mat frame; 
     cap >> frame; 
     imshow("test", frame); 
    } 
} 

Et voici la réponse de la caméra:

HTTP Unaothorized Response

+1

Quelle API utilise 'VideoCapture'? – zindarod

+0

essayé tous trois en vain (CAP_IMAGES, CAP_DSHOW et CAP_FFMPEG) – Diedre

+0

Essayez d'abord d'accéder à la caméra via la ligne de commande 'FFMPEG' ou' Gstreamer'. Une fois que vous avez trouvé un pipeline de travail, traduisez ce pipeline en une entrée 'VideoCapture', ce qui est facile à faire. Mais vous devez avoir construit OpenCV avec 'FFMPEG' ou' Gstreamer' pour que le pipeline fonctionne avec 'VideoCapture'. – zindarod

Répondre

0

je résolu le problème en utilisant le flux RTSP de la caméra au lieu de l'image http. Je vous remercie! (Si vous avez ce problème dans votre caméra IP, essayez le flux rtsp, ils devraient avoir une commande dans la documentation).

Code de travail final dans mon appareil photo Dahua:

#include <iostream> 
#include <imgproc.hpp> 
#include <opencv.hpp> 
#include <highgui.hpp> 
using namespace std; 
using namespace cv; 
int main(){ 
    VideoCapture cap("rtsp://login:[email protected]/cam/realmonitor?channel=1?subtype=0"); 
    if(!cap.isOpened()){ 
     cout << "bug" << endl; 
     return 1; 
    } 

    Mat frame; 
    cap >> frame; 
    imshow("test", frame); 

} 

Pour une raison OpenCV peut effectuer l'authentification digest lors de l'utilisation RTSP.