1

我正在尝试使用 open cv 将 cp plus ip camera 连接到我的应用程序。我尝试了很多方法来捕捉框架。帮助我使用“rtsp”协议捕获帧。IP cam 的 URL 是“rtsp://admin:admin@192.168.1.108:554/VideoInput/1/mpeg4/1”。我用 VLC 播放器试过这个。它的工作。如果有办法通过 libvlc 捕获帧并传递到打开的 CV,请提及方法。

4

3 回答 3

0

尝试“rtsp://admin:admin@192.168.1.108:554/VideoInput/1/mpeg4/1?.mjpg”opencv 会查找视频流类型的 url 结尾。

于 2013-08-15T11:43:44.483 回答
0

您可以直接访问为您提供相机 jpg 快照的 URL。有关如何使用 onvif 找到它的详细信息,请参见此处:

http://me-ol-blog.blogspot.co.il/2017/07/getting-still-image-urluri-of-ipcam-or.html

于 2017-07-01T11:22:36.520 回答
0

第一步是发现你的 rtsp url,并在 vlc 上测试它。你说你已经有了。

如果有人需要发现 rtsp url,我推荐软件 onvif-device-tool ( link ) 或 gsoap-onvif ( link ),两者都适用于 Linux,看看你的终端,rtsp url 就会在那里。发现我建议在 vlc 播放器(链接)上测试的 rtsp url 后,您可以使用菜单选项“打开网络流”或从命令行进行测试:

vlc rtsp://your_url

如果您已经拥有 rtsp url 并在 vlc 上成功测试,则创建一个 cv::VideoCapture 并抓取帧。你可以这样做:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

int main() {
    cv::VideoCapture stream = cv::VideoCapture("rtsp://admin:admin@192.168.1.108:554/VideoInput/1/mpeg4/1");
    if (!stream.isOpened()) return -1; // if not success, exit program

    double width = stream.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video
    double height = stream.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video
    std::cout << "Frame size : " << width << " x " << height << std::endl;

    cv::namedWindow("Onvif",CV_WINDOW_AUTOSIZE); //create a window called "Onvif"
    cv::Mat frame;

    while (1) {
        // read a new frame from video
        if (!stream.read(frame)) { //if not success, break loop
            std::cout << "Cannot read a frame from video stream" << std::endl;
            cv::waitKey(30); continue;
        }
        cv::imshow("Onvif", frame); //show the frame in "Onvif" window

        if (cv::waitKey(15)==27) //wait for 'esc'
            break;
    }
}

编译:

 g++ main.cpp `pkg-config --cflags --libs opencv`
于 2017-12-31T17:16:52.973 回答