Доступ к IP-камере с помощью OpenCV

приведенный ниже код предназначен для доступа к IP-камере Axis с помощью OpenCV. При запуске программы сначала отображается " ошибка при открытии cap_ffmpeg_impl...- а потом он показывает камера не найдена.

#include <opencvcv.h>
#include <opencv2highguihighgui.hpp>
#include <opencv2imgprocimgproc.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;
}

где я ошибаюсь?

3 ответов


я столкнулся с аналогичной проблемой при попытке отобразить IP-камеру с помощью общедоступной IP-камеры. Opencv нужен какой-то типичный URL-адрес для открытия камеры.Попробуйте URL-адрес из кода ниже. Вот код, который сработал для меня.

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;
    }   

}

скопируйте этот код и попробовать.

#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;
    }   

}

следующие работы для оси M1004-W, подключенной к моему компьютеру через кабель ethernet:

  1. в браузере по вашему выбору (я использую Chrome) перейдите к IP-адресу камеры. При необходимости предоставьте учетные данные.
  2. вы должны смотреть на прямой эфир с камеры. Щелкните правой кнопкой мыши на видео и выберите "Проинспектировать элемент" (или его эквивалент в браузеры Chrome).
  3. вы должны увидеть переменную под названием src-это то , что вы можете используйте в OpenCV для прямого доступа к камере. Мой /mjpg/video.mjpg, и я уверен, что Ваш будет похож.

адрес, который вы даете OpenCV, должен выглядеть так:

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

вот как выглядит мой:

http://uname:login@192.168.0.0/mjpg/video.mjpg

я ввел свой адрес в ваш код и могу видеть видеопоток из окна OpenCV.


Я установил приложение "Mini WebCam" на свой iphone и использовал его в качестве ip-камеры с "http://192.168.1.103" в его адрес. Кроме того, я использовал этот фрагмент кода:

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;
}
....

это работает.(http://192.168.1.103/video.цги?.с mjpg)