web-dev-qa-db-fra.com

Accès à la caméra IP avec OpenCV

Le code ci-dessous est destiné à accéder à une caméra IP Axis à l'aide d'OpenCV. Lors de l'exécution du programme, il affiche d'abord "Erreur lors de l'ouverture de cap_ffmpeg_impl ...", puis affiche Caméra introuvable.

#include <opencv\cv.h>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

int main()
{
    Mat frame;
    namedWindow("video", 1);
    VideoCapture cap("http://IPADDRESS/video.mjpg");
    if(!cap.isOpened())
    {
        cout<<"Camera not found"<<endl;
        getchar();
        return -1;
    }
    while ( cap.isOpened() )
    {
        cap >> frame;
        if(frame.empty()) break;

        imshow("video", frame);
        if(waitKey(30) >= 0) break;
    }   
    return 0;
}

Où vais-je mal?

8

J'ai rencontré un problème similaire lorsque j'essayais d'afficher une caméra IP à l'aide d'une caméra IP publique. Opencv a besoin d'un type typique d'URL pour ouvrir la caméra.Essayez l'URL du code ci-dessous. Voici le code qui a fonctionné pour moi.

int main(int, char**) {
    cv::VideoCapture vcap;
    cv::Mat image;

    // This works on a D-Link CDS-932L
    const std::string videoStreamAddress = "http://ID:PASSWORD@IPADDRESS:PORTNO/mjpeg.cgi?user=ID&password=ID:PASSWORD&channel=0&.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;
    }

    for(;;) {
        if(!vcap.read(image)) {
            std::cout << "No frame" << std::endl;
            cv::waitKey();
        }
        cv::imshow("Output Window", image);

        if(cv::waitKey(1) >= 0) break;
    }   

}

Copiez ce code tel quel et essayez.

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int, char**) {
    cv::VideoCapture vcap;
    cv::Mat image;

    // This works on a D-Link CDS-932L

    const std::string videoStreamAddress = "http://USER:PWD@IPADDRESS:8088/mjpeg.cgi?user=USERNAME&password=PWD&channel=0&.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;
    }

    for(;;) {
        if(!vcap.read(image)) {
            std::cout << "No frame" << std::endl;
            cv::waitKey();
        }
        cv::imshow("Output Window", image);

        if(cv::waitKey(1) >= 0) break;
    }   

}
7
Mayur

Ce qui suit fonctionne pour un Axis M1004-W connecté à mon ordinateur via un câble Ethernet:

  1. Dans le navigateur de votre choix (j'utilise Chrome), accédez à l'adresse IP de la caméra. Fournissez les informations d'identification si nécessaire.
  2. Vous devriez regarder un flux en direct depuis votre caméra. Cliquez avec le bouton droit sur le flux vidéo et sélectionnez "Inspecter l'élément" (ou son équivalent dans les navigateurs non-Chrome).
  3. Vous devriez voir une variable appelée src - c’est ce que vous pouvez utiliser dans OpenCV pour accéder directement à la caméra. Le mien est /mjpg/video.mjpg, et je parie que le vôtre sera similaire.

L'adresse que vous donnez à OpenCV devrait ressembler à ceci:

http://<USERNAME>:<PASSWORD>@<IP_ADDRESS>/<the value of src>

Voici à quoi ressemble le mien:

http://uname:[email protected]/mjpg/video.mjpg

J'ai entré mon adresse dans votre code et je peux voir le flux vidéo depuis une fenêtre OpenCV.

2
Connor

J'ai installé l'application "Mini WebCam" sur mon iphone et je l'ai utilisée comme caméra ip avec " http://192.168.1.103 " comme adresse. En plus j'ai utilisé ce morceau de code:

VideoCapture capture;
Mat image;
if (!capture.open("http://192.168.1.103/video.cgi?.mjpg")) {
    cout << "Error opening video stream or file" << endl;
    return -1;
}
....

ça marche. ( http://192.168.1.103/video.cgi?.mjpg )

0
Mohammad Rahimi