我正在尝试使用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,请提及方法。
答案 0 :(得分:0)
尝试“rtsp:// admin:admin@192.168.1.108:554 / VideoInput / 1 / mpeg4 / 1?.mjpg”opencv查看视频流类型的网址结尾。
答案 1 :(得分:0)
您可以直接访问提供相机jpg快照的URL。 有关如何使用onvif找到它的详细信息,请参阅此处:
http://me-ol-blog.blogspot.co.il/2017/07/getting-still-image-urluri-of-ipcam-or.html
答案 2 :(得分:0)
第一步是发现你的rtsp网址,并在vlc上测试它。你说你已经有了。
如果有人需要发现rtsp网址,我推荐使用软件onvif-device-tool(link)或gsoap-onvif(link),两者都适用于Linux,查看终端,rtsp网址将在那里。在发现rtsp网址后,我建议在vlc播放器(link)上测试它,您可以使用菜单选项“打开网络流”或从命令行进行测试:
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`