2009-04-03 11 views
23

Tôi đang sử dụng openCV 1.1pre1 trong Windows. Tôi có một camera mạng và tôi cần lấy khung từ openCV. Máy ảnh đó có thể truyền luồng mpeg4 chuẩn qua RTSP hoặc mjpeg qua http. Tôi đã thấy nhiều chủ đề nói về việc sử dụng ffmpeg với openCV nhưng tôi không thể làm cho nó hoạt động.OpenCV với Máy ảnh mạng

Tôi có thể lấy khung hình từ máy ảnh IP bằng openCV bằng cách nào?

Cảm ơn

Andrea

+0

Đồng thời kiểm tra câu trả lời này: http://stackoverflow.com/q/6022423/1085483 –

Trả lời

3

giao thức rtsp không hoạt động đối với tôi. mjpeg đã làm việc trước tiên. Tôi cho rằng nó được tích hợp trong máy ảnh của tôi (Dlink DCS 900).

Cú pháp tìm thấy ở đây: http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera/

Tôi không cần phải biên dịch OpenCV với sự hỗ trợ ffmpg.

+0

Tôi không hiểu làm thế nào mjpeg làm việc lúc đầu thử, bạn đã làm gì với các khung hình để có đầu ra mjpeg? – Marine1

1

Sử dụng ffmpeglib để kết nối với suối.

Các chức năng này có thể hữu ích. Nhưng hãy xem trong các tài liệu

av_open_input_stream(...); 
av_find_stream_info(...); 
avcodec_find_decoder(...); 
avcodec_open(...); 
avcodec_alloc_frame(...); 

Bạn sẽ cần một chút algo để có được một khung hoàn chỉnh, trong đó có sẵn ở đây

http://www.dranger.com/ffmpeg/tutorial01.html 

Khi bạn nhận được một khung bạn có thể sao chép các dữ liệu hình ảnh (cho mỗi mặt phẳng nếu cần thiết) thành một hình ảnh IplImage là đối tượng hình ảnh OpenCV.

Bạn có thể tạo một IplImage sử dụng cái gì đó như ...

IplImage *p_gray_image = cvCreateImage(size, IPL_DEPTH_8U, 1); 

Một khi bạn có một IplImage, bạn có thể thực hiện tất cả các loại hoạt động hình ảnh có sẵn trong lib OpenCV

+0

Tôi đã thấy trong nhiều chủ đề mà ffmpeg đã được đưa vào và sử dụng bên trong openCV, đúng không? Có lẽ tôi cần biên dịch lại openCV với hỗ trợ ffgmpeg? Trong trường hợp này làm thế nào tôi có thể làm điều này dưới cửa sổ? Cảm ơn – Grifo

+0

Tôi không biết điều này. Tuy nhiên, ffmpeg là một ứng dụng mà như ffmpeglib là một thư viện. Nếu bạn chưa quen với những điều này, hãy xem hướng dẫn dranger.com. – Indy9000

5

OpenCV có thể được biên dịch với Hỗ trợ FFMPEG. Từ ./configure --help:

--with-ffmpeg  use ffmpeg libraries (see LICENSE) [automatic] 

Sau đó bạn có thể sử dụng cvCreateFileCapture_FFMPEG để tạo ra một CvCapture với ví dụ URL của luồng MJPG của máy ảnh.

Tôi sử dụng này để lấy khung hình từ một camera AXIS:

CvCapture *capture = 
    cvCreateFileCapture_FFMPEG("http://axis-cam/mjpg/video.mjpg?resolution=640x480&req_fps=10&.mjpg"); 
+3

Có thể cấu hình openCV với hỗ trợ ffmpeg trong Windows không? – Grifo

+1

dường như opencv 2.x luôn có hỗ trợ ffmpeg trên tất cả các nền tảng. – Jim

3

Tôi chỉ làm điều đó như thế này:

CvCapture *capture = cvCreateFileCapture("rtsp://camera-address"); 

Ngoài ra hãy chắc chắn dll này hiện có sẵn tại thời gian chạy khác cvCreateFileCapture sẽ trở lại NULL

opencv_ffmpeg200d.dll 

Máy ảnh cũng cần cho phép truy cập chưa được xác thực, thường được đặt qua giao diện web. Định dạng MJPEG hoạt động qua rtsp nhưng MPEG4 thì không.

hth

Si

+0

Bạn đang sử dụng OpenCV 2.0? – Grifo

+0

Phiên bản thư viện nói rằng anh ta đang sử dụng openCV 2.0 - đó là phần '200' trong' opencv_ffmpeg200d.dll' – jamuraa

+0

Đây là ý kiến ​​của tôi về câu trả lời đúng. Tôi đang sử dụng các cửa sổ và tôi đã phải sao chép 'opencv_ffmpeg300.dll' vào thư mục dự án của tôi. Để mở luồng, tôi đang sử dụng 'VideoCapture cap (" rtsp: // abc: [email protected]/live0.264 ");' – Anonymous

10
#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); 
} 
+0

cảm ơn bạn, đã giúp rất nhiều. – Maysam

+0

@lolong đây là mã cho luồng mjpg, phải không? –

21

tôi kèm theo mã C++ cho grabbing khung. Nó yêu cầu OpenCV phiên bản 2.0 hoặc cao hơn. Mã này sử dụng cấu trúc cv :: mat được ưu tiên cho cấu trúc IplImage cũ.

#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'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; 
    } 
} 

Cập nhật Bạn có thể lấy khung từ luồng H.264 RTSP. Tra cứu API máy ảnh của bạn để biết chi tiết để nhận lệnh URL. Ví dụ: đối với máy ảnh mạng trục, địa chỉ URL có thể là:

// 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 
+0

Bạn có biết điều này chỉ hoạt động với MJPEG hoặc cũng với tính năng phát trực tuyến H.264 RTSP/UDP không? – Matthias

+0

@Matthias Nó cũng hoạt động để phát trực tuyến H.264 RTSP. Tôi có phiên bản OpenCV 2.4.4 và có thể lấy khung hình từ một máy ảnh trực tuyến với H.264. – Alexey

+0

Cảm ơn câu trả lời nhanh của bạn. – Matthias