OpenCV с сетевыми камерами
Я использую openCV 1.1pre1 под Windows.
У меня есть сетевая камера, и мне нужно захватить кадры из openCV. Эта камера может передавать стандартный поток mpeg4 поверх RTSP или mjpeg через http.
Я видел много потоков, говорящих об использовании ffmpeg с openCV, но я не могу заставить его работать.
Как я могу захватить фреймы с IP-камеры с помощью openCV?
Спасибо
Andrea
Ответы
Ответ 1
Протокол rtsp не работал у меня.
mjpeg сработала сперва. Я предполагаю, что он встроен в мою камеру (Dlink DCS 900).
Синтаксис найден здесь:
http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera/
Мне не нужно было компилировать OpenCV с поддержкой ffmpg.
Ответ 2
Я приложил код С++ для захвата фреймов. Это требует 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:[email protected]_address:8081/cgi/mjpg/mjpg.cgi?.mjpg" */
//open the video stream and make sure it opened
if(!vcap.open(videoStreamAddress)) {
std::cout << "Error opening video stream or file" << std::endl;
return -1;
}
//Create output window for displaying frames.
//It 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;
}
}
Обновление. Вы можете захватывать кадры из потоков RTSP H.264. Чтобы получить команду URL, загляните в свой API-интерфейс камеры. Например, для сетевой камеры 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:[email protected]:554/axis-media/media.amp
Ответ 3
#include <stdio.h>
#include "opencv.hpp"
int main(){
CvCapture *camera=cvCaptureFromFile("http://username:[email protected]_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);
}
Ответ 4
OpenCV может быть скомпилирован с поддержкой FFMPEG. От. /configure --help:
--with-ffmpeg use ffmpeg libraries (see LICENSE) [automatic]
Затем вы можете использовать cvCreateFileCapture_FFMPEG для создания CvCapture, например. URL-адрес потока MJPG камеры.
Я использую это для захвата кадров с камеры AXIS:
CvCapture *capture =
cvCreateFileCapture_FFMPEG("http://axis-cam/mjpg/video.mjpg?resolution=640x480&req_fps=10&.mjpg");
Ответ 5
Я просто делаю это так:
CvCapture *capture = cvCreateFileCapture("rtsp://camera-address");
Также убедитесь, что эта DLL доступна во время выполнения else cvCreateFileCapture вернет NULL
opencv_ffmpeg200d.dll
Камера должна также разрешать доступ к неавторизованному доступу, обычно устанавливаемому через его веб-интерфейс. Формат MJPEG работал через rtsp, но MPEG4 этого не делал.
hth
Si
Ответ 6
Используйте 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.
Вы можете создать IplImage, используя что-то вроде...
IplImage *p_gray_image = cvCreateImage(size, IPL_DEPTH_8U, 1);
Как только у вас есть IplImage, вы можете выполнять всевозможные операции с изображениями, доступные в библиотеке OpenCV lib