我在Windows下使用openCV 1.1pre1。 我有一个网络摄像头,我需要从openCV抓取帧。该摄像机可以通过RTSP或mjpeg通过http传输标准mpeg4流。 我看过很多线程都在谈论将ffmpeg与openCV一起使用,但我不能让它工作。
如何使用openCV从IP摄像头抓取帧?
由于
安德烈
答案 0 :(得分:22)
我附上了用于抓取帧的C ++代码。它需要OpenCV 2.0或更高版本。该代码使用cv :: mat结构,它比旧的IplImage结构更受欢迎。
#include "cv.h"
#include "highgui.h"
#include <iostream>
int main(int, char**) {
cv::VideoCapture vcap;
cv::Mat image;
const std::string videoStreamAddress = "rtsp://cam_address:554/live.sdp";
/* it may be an address of an mjpeg stream,
e.g. "http://user:pass@cam_address:8081/cgi/mjpg/mjpg.cgi?.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;
}
//Create output window for displaying frames.
//It's important to create this window outside of the `for` loop
//Otherwise this window will be created automatically each time you call
//`imshow(...)`, which is very inefficient.
cv::namedWindow("Output Window");
for(;;) {
if(!vcap.read(image)) {
std::cout << "No frame" << std::endl;
cv::waitKey();
}
cv::imshow("Output Window", image);
if(cv::waitKey(1) >= 0) break;
}
}
更新您可以从H.264 RTSP流中获取帧。查找相机API以获取详细信息以获取URL命令。例如,对于Axis网络摄像机,URL地址可能是:
// H.264 stream RTSP address, where 10.10.10.10 is an IP address
// and 554 is the port number
rtsp://10.10.10.10:554/axis-media/media.amp
// if the camera is password protected
rtsp://username:password@10.10.10.10:554/axis-media/media.amp
答案 1 :(得分:10)
#include <stdio.h>
#include "opencv.hpp"
int main(){
CvCapture *camera=cvCaptureFromFile("http://username:pass@cam_address/axis-cgi/mjpg/video.cgi?resolution=640x480&req_fps=30&.mjpg");
if (camera==NULL)
printf("camera is null\n");
else
printf("camera is not null");
cvNamedWindow("img");
while (cvWaitKey(10)!=atoi("q")){
double t1=(double)cvGetTickCount();
IplImage *img=cvQueryFrame(camera);
double t2=(double)cvGetTickCount();
printf("time: %gms fps: %.2g\n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));
cvShowImage("img",img);
}
cvReleaseCapture(&camera);
}
答案 2 :(得分:5)
可以使用FFMPEG支持编译OpenCV。来自 ./ configure --help :
--with-ffmpeg use ffmpeg libraries (see LICENSE) [automatic]
然后,您可以使用 cvCreateFileCapture_FFMPEG 创建一个CvCapture,例如相机的MJPG流的URL。
我用它来从AXIS相机中抓取帧:
CvCapture *capture =
cvCreateFileCapture_FFMPEG("http://axis-cam/mjpg/video.mjpg?resolution=640x480&req_fps=10&.mjpg");
答案 3 :(得分:3)
我就是这样做的:
CvCapture *capture = cvCreateFileCapture("rtsp://camera-address");
还要确保此dll在运行时可用,否则cvCreateFileCapture将返回NULL
opencv_ffmpeg200d.dll
摄像机也需要允许未经身份验证的访问,通常通过其Web界面进行设置。 MJPEG格式通过rtsp工作,但MPEG4没有。
hth
的Si
答案 4 :(得分:3)
rtsp协议对我不起作用。 mjpeg第一次尝试。我认为它内置于我的相机中(Dlink DCS 900)。
此处找到的语法: http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera/
我不需要使用ffmpg支持编译OpenCV。
答案 5 :(得分:1)
使用ffmpeglib连接到流。
这些功能可能很有用。但请查看文档
av_open_input_stream(...);
av_find_stream_info(...);
avcodec_find_decoder(...);
avcodec_open(...);
avcodec_alloc_frame(...);
你需要一点算法来获得一个完整的框架, 这是可以的
http://www.dranger.com/ffmpeg/tutorial01.html
一旦你得到一个帧,你可以将视频数据(如果需要的话,每个平面)复制到一个 IplImage是一个OpenCV图像对象。
您可以使用类似......
之类的东西创建IplImageIplImage *p_gray_image = cvCreateImage(size, IPL_DEPTH_8U, 1);
一旦有了IplImage,就可以执行OpenCV lib中提供的各种图像操作