cv::VideoCapture 适用于网络摄像头,但不适用于 IP 摄像头?

Posted

技术标签:

【中文标题】cv::VideoCapture 适用于网络摄像头,但不适用于 IP 摄像头?【英文标题】:cv::VideoCapture works for webcams but not IP cameras? 【发布时间】:2013-05-08 21:00:02 【问题描述】:

它必须发生,我被困在项目的最后阶段,当我想在我的网络摄像头和 IP 摄像头上使用我的代码时,它就像一个魅力。该 URL 在我的浏览器中完美运行,但 OpenCV 没有任何结果... 这是我的代码:

#include <opencv/highgui.h>

using namespace cv;

int main(int argc, char *argv[])

    Mat frame;
    namedWindow("video", 1);
    VideoCapture cap("http://192.168.1.99:99/videostream.cgi?resolution=32&rate=0&user=admin&pwd=password&.mjpg");
    while ( cap.isOpened() )
    
        cap >> frame;
        if(frame.empty()) break;

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

    return 0;

以及编译器设置:

//Added to the .pro file of QtCreator
INCLUDEPATH += C:\\OpenCV243\\release\\include
LIBS += -LC:\\OpenCV243\\release\\lib \
    -lopencv_core243.dll \
    -lopencv_highgui243.dll

我已经测试过使用相同的代码打开一个 .avi 文件并且它可以工作...但是像 http://66.184.211.231/mjpg/video.mjpg 这样的公共 IP 摄像头 URL 不能!那是怎么回事?

被编辑删除:我认为 FFMPEG 是一个问题,但 v2.4.3。尽管我没有安装任何 FFMPEG 库,但有内置的 FFMPEG 支持和 .avi 文件工作(需要解释一下吗?)

提前致谢,

问候, 神秘先生

【问题讨论】:

VideoCapture 类可以访问实际的视频捕获设备(网络摄像头)或打开视频文件。恐怕这不适用于通过网络访问的恒定视频流。 我很确定这是可能的,因为很多人都设法做到了(其中包括答案的作者there)......但不是我:/ ffmpeg 在这里被调用,它在 linux 上比在 win 上运行得更好(例如,在 vmbox ubuntu 客户端上完美运行,但在 host/xp 系统上却不行) 什么意思?使用 windows 对我来说是一个限制。 【参考方案1】:

通过从源代码的 build\x86\mingw\bin 文件夹中复制 opencv_ffmpeg.dll 并将其粘贴到已构建的 DLL 旁边(可通过 PATH 访问的 bin 文件夹)解决它:我不知道为什么,但 opencv_ffmpeg_64.dll 有而是生产出来的。

【讨论】:

Mystere:你能告诉我你把它粘贴到哪里了吗? '(可通过路径访问的 bin 文件夹)' 我不明白你想说什么。 这是构建库的文件夹,其路径也应列在“PATH 环境变量”(或编译器选项)中。 @MisterMystère 在 windows 上我应该在哪里粘贴它? 在构建 OpenCV 的文件夹中,可以通过 PATH 环境变量访问的文件夹。【参考方案2】:

由于您可以连接和抓取网络摄像机的帧,我认为您的库设置正确,您应该能够连接到 IP 摄像机。我认为问题出在所提供的相机 URL 地址上。

尝试登录相机并禁用其密码保护。从 URL 中删除登录名和密码字段,使其类似于 "http://192.168.1.99:99/videostream.cgi?resolution=32&amp;.mjpg"。此外,您可以登录相机并检查其分辨率。我注意到你有resolution=32,但我认为它应该类似于resolution=704x480

希望这会有所帮助。

【讨论】:

感谢您的回答。不幸的是,我尝试了(即使没有 res),但它不起作用。我想坚持这样一个事实,即这个 URL 已经在我的浏览器中尝试过,没有任何问题(特别是 32 用于 Foscam 协议)所以我怀疑它来自它,除非 OpenCV 需要特定的 URL。我已经在上面编辑了我的问题,也许它......有帮助吗?编辑:当我说网络摄像头时,它是集成网络摄像头。我刚刚成功打开了编号为 0 的默认摄像头。 cap.isOpened() 返回 1 还是 0? 是的,如果它在浏览器中工作,它应该在 OpenCV 中工作。除了我在连接到受密码保护的相机时遇到问题。这就是为什么我建议禁用相机的密码保护,只是为了测试。 我想删除密码,但它不允许我,我必须至少指定一个用户,所以这是同一个“问题”。奇怪的是,没有任何凭据,浏览器就不会打扰并正确显示它,但这确实意味着这不是问题所在。 cap.isOpened() 显然返回 0,因为 while() 立即中断。 Pfiou,我通过查看我之前注意到的内容解决了这个问题:附加到我的 FFMPEG DLL 的 _64。见下文,我只需要复制 32 位版本。不知道为什么一开始会这样做。无论如何,感谢您的帮助,我非常感谢您的反应!

以上是关于cv::VideoCapture 适用于网络摄像头,但不适用于 IP 摄像头?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OSX 上的单独进程中读取网络摄像头?

OpenCV cv2.VideoCapture() 停止读取 RTSP IP 摄像机

python cv2.Videocapture() 不起作用,cap.isOpened() 返回 false

v4l2 UVC 设置摄像头获取摄像头性能

OpenCV(Python中的cv2)VideoCapture在删除后不释放相机

如果由于 RTSP 摄像头问题导致执行停止,如何终止 cv2.VideoCapture(rtsp_url) 调用?