Доступ к IP-камере с использованием OpenCV

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

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

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


person praxmon    schedule 24.01.2014    source источник
comment
Убедитесь, что все кодеки каким-то образом установлены в вашей системе. Или вы успешно открыли его со своего локального компьютера (протестируйте его, указав локальный путь вместо URL-адреса)? Вы можете попробовать загрузить и установить ffmpeg вручную (ffmpeg.zeranoe.com/builds)   -  person Jayesh Bhoi    schedule 24.01.2014
comment
Ох, ну ладно. FFMPEG должен быть установлен перед его использованием?   -  person praxmon    schedule 24.01.2014
comment
Вам нужно изменить свой URL-адрес, который вы предоставляете VideoCapture cap("http://IPADDRESS/video.mjpg");   -  person A B    schedule 24.01.2014
comment
См. ответ.   -  person A B    schedule 24.01.2014
comment
Вы можете правильно транслировать камеру из браузера?   -  person Mayur    schedule 24.01.2014
comment
@Mayur да, сайт, который вы мне дали, дал мне ссылку на прямую трансляцию, и я использую эту ссылку. И это не работает.   -  person praxmon    schedule 24.01.2014
comment
Вы пробовали использовать iSpy, как я упоминал ниже. Получите ссылку, которую выбирает iSpy, и попробуйте. Это сработало для меня.   -  person Mayur    schedule 24.01.2014
comment
@Mayur Перепробовал все ссылки, та же проблема:/   -  person praxmon    schedule 24.01.2014
comment
Установил кодек ffmpeg   -  person Mayur    schedule 24.01.2014
comment
Я только что попробовал ваш код. Я столкнулся с той же ошибкой, с которой вы столкнулись. Вы пробовали код, который я предоставил в качестве ответа. Пожалуйста, попробуйте и посмотрите, работает ли он.   -  person Mayur    schedule 24.01.2014
comment
Я скопировал ваш код, а затем отредактировал его и указал правильный IP-адрес, затем установил кодек ffmpeg и все равно безрезультатно.   -  person praxmon    schedule 24.01.2014
comment
Какую правку вы делали?   -  person Mayur    schedule 24.01.2014
comment
Я только что дважды проверил ваш код. Это правильно. Это работало с моей IP-камерой. Теперь только две возможности: 1> либо проблема с кодеком, либо 2> URL. Можете ли вы поделиться URL?   -  person Mayur    schedule 24.01.2014
comment
@Mayur Я попробовал приведенную ниже ссылку для установки ffmpeg. И я попробовал обновленный ответ, я думаю, что с моей установкой ffmpeg что-то не так. Блин, так близко:/ wikihow.com/Install-FFmpeg-on-Windows   -  person praxmon    schedule 24.01.2014
comment
URL-адрес: root:[email protected]:8088/mjpeg.cgi?user=root&password=root&channel=0&.mjpg; Просто добавьте http:// перед ним   -  person praxmon    schedule 24.01.2014
comment
предоставленный вами IP-адрес является общедоступным IP-адресом вашей камеры? Если да, то я могу проверить на своей стороне ваш код с вашего разрешения. Позже, пожалуйста, удалите комментарий, в котором указан ваш IP.   -  person Mayur    schedule 24.01.2014
comment
давайте продолжим это обсуждение в чате   -  person praxmon    schedule 24.01.2014
comment
У меня тоже такая же проблема, но я так и не решил ее, я пробовал много URL-адресов для камеры, но это никогда не работало, вы изменили OpenCV, чтобы открыть ссылку mjpeg? Я думаю, что проблема здесь   -  person Tu DUONG    schedule 05.03.2014
comment
Нет, так и не удалось решить эту. Извиняюсь.   -  person praxmon    schedule 06.03.2014
comment
Я знаю, что это уже устарело, но до сих пор не решено? У меня такая же проблема.   -  person Connor    schedule 06.06.2014


Ответы (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;
    }   

}
person Mayur    schedule 24.01.2014
comment
Как узнать номер порта IP-камеры? - person praxmon; 24.01.2014
comment
Вы можете получить номер порта из веб-интерфейса вашей IP-камеры. - person Mayur; 24.01.2014
comment
Кроме того, потоковая ссылка для оси 1103: IPADDRESS/axis-cgi/mjpg/video.cgi Итак, какую ссылку я должен предоставить? Ссылка с логином и паролем? - person praxmon; 24.01.2014
comment
Один ярлык, который может вам помочь, выглядит следующим образом. Если вы знаете о программном обеспечении iSpy, оно предоставляет все возможные ссылки, которые можно использовать для отображения камеры. Также вас спрашивают, должен ли iSpy выбрать URL-адрес, который наиболее подходит для отображения видео, позвольте iSpy выбрать ссылку, попробуйте использовать ту же ссылку в вашей программе, это может сработать. - person Mayur; 24.01.2014
comment
Если проблема решена с предоставленным ответом, пожалуйста, отметьте его, чтобы другие могли использовать то же самое. - person Mayur; 24.01.2014
comment
Перейдите по этой ссылке и найдите список URL-адресов камеры оси, это может помощь. - person Mayur; 24.01.2014
comment
Я добавил этот код в VideoCapture и открыл API, но это не работает. - person shridutt kothari; 05.01.2015

Следующее работает для Axis 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:[email protected]/mjpg/video.mjpg

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

person Connor    schedule 11.06.2014

Я установил приложение «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.cgi?.mjpg)

person Mohammad Rahimi    schedule 04.07.2016