使用OpenCV访问IP Camera

时间:2014-01-24 04:56:43

标签: c++ opencv video-streaming ip-camera

下面给出的代码用于使用OpenCV访问Axis IP摄像机。在运行程序时,它首先显示“打开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;
}

我哪里错了?

3 个答案:

答案 0 :(得分:7)

尝试使用公共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;
    }   

}

答案 1 :(得分:2)

以下适用于通过以太网电缆连接到计算机的Axis M1004-W:

  1. 在您选择的浏览器中(我正在使用Chrome),导航到相机的IP地址。根据需要提供凭证。
  2. 您应该从相机中查看直播。右键单击视频流,然后选择“检查元素”(或非Chrome浏览器中的等效元素)。
  3. 您应该看到一个名为src的变量 - 这是您可以在OpenCV中直接访问摄像头的内容。我是/mjpg/video.mjpg,我打赌你的情况会相似。
  4. 您提供给OpenCV的地址应如下所示:

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

    这就是我的样子:

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

    我在您的代码中输入了我的地址,可以看到来自OpenCV窗口的视频流。

答案 2 :(得分:0)

我安装了&#34; Mini WebCam&#34;在我的iphone上使用app并将其用作带有&#34; http://192.168.1.103&#34;作为它的地址。另外我使用了这段代码:

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