C++ OpenCV视频捕获摘要认证

C++ OpenCV视频捕获摘要认证,c++,opencv,ip-camera,digest-authentication,opencv3.3,C++,Opencv,Ip Camera,Digest Authentication,Opencv3.3,我有一个正在进行的项目,通过opencv VideoCapture访问多个IP摄像头,为大多数摄像头工作 我有一个新的大华PTZ相机,使用摘要认证,OpenCV中的视频捕获无法打开它。通过WireShark,我可以看到摄像机返回的是一个401未经处理的图像 我在OpenCV文档中没有发现任何关于身份验证问题的内容 也许我需要使用其他不是OpenCV的东西来解决这个问题 这是一个最低工作代码(如果你有一个摄像头要测试) #包括 #包括 #包括 #包括 使用名称空间std; 使用名称空间cv; in

我有一个正在进行的项目,通过opencv VideoCapture访问多个IP摄像头,为大多数摄像头工作

我有一个新的大华PTZ相机,使用摘要认证,OpenCV中的视频捕获无法打开它。通过WireShark,我可以看到摄像机返回的是一个401未经处理的图像

我在OpenCV文档中没有发现任何关于身份验证问题的内容

也许我需要使用其他不是OpenCV的东西来解决这个问题

这是一个最低工作代码(如果你有一个摄像头要测试)

#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main(){
而(1){
视频捕捉帽(“http://login:password@111.111.111.111/cgi-bin/snapshot.cgi”);
如果(!cap.isOpened()){
沙发架;
imshow(“测试”,框架);
}
}
下面是摄像机的反应:


我通过使用摄像头的rtsp流而不是http映像解决了问题。谢谢!(如果您的ip摄像头存在此问题,请尝试rtsp流,文档中应该有一个命令)

我的大华相机的最终工作代码:

#include <iostream>
#include <imgproc.hpp>
#include <opencv.hpp>
#include <highgui.hpp>
using namespace std;
using namespace cv;
int main(){
    VideoCapture cap("rtsp://login:password@111.111.111.111/cam/realmonitor?channel=1?subtype=0");
    if(!cap.isOpened()){
        cout << "bug" << endl;
        return 1;
    }

    Mat frame;
    cap >> frame;
    imshow("test", frame);

}
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main(){
视频捕捉帽(“rtsp://login:password@111.111.111.111/cam/realmonitor?通道=1?子类型=0”);
如果(!cap.isOpened()){
沙发架;
imshow(“测试”,框架);
}

由于某些原因,opencv在使用rtsp时可以执行摘要身份验证。

哪种API是使用的
VideoCapture
?尝试了所有三种方法但均无效(CAP_IMAGES、CAP_DSHOW和CAP_FFMPEG)首先尝试通过
FFMPEG
Gstreamer
命令行访问相机。找到工作管道后,然后将该管道转换为
VideoCapture
输入,这很容易。但是必须使用
FFMPEG
Gstreamer
构建OpenCV,管道才能使用
VideoCap真的
。正是我想要的。太棒了!
#include <iostream>
#include <imgproc.hpp>
#include <opencv.hpp>
#include <highgui.hpp>
using namespace std;
using namespace cv;
int main(){
    VideoCapture cap("rtsp://login:password@111.111.111.111/cam/realmonitor?channel=1?subtype=0");
    if(!cap.isOpened()){
        cout << "bug" << endl;
        return 1;
    }

    Mat frame;
    cap >> frame;
    imshow("test", frame);

}