سؤال

أنا أستخدم OpenCV 1.1PRE1 تحت Windows. لدي كاميرا شبكة وأحتاجها للاستيلاء على إطارات من OpenCV. يمكن أن تقوم الكاميرا بتدفق دفق MPEG4 قياسي عبر RTSP أو MJPEG عبر HTTP. لقد رأيت العديد من الخيوط التي تتحدث عن استخدام FFMPEG مع OpenCV لكنني لا أستطيع أن أجعلها تعمل.

كيف يمكنني الاستيلاء على إطارات من كاميرا IP مع OpenCV؟

شكرا

أندريا

هل كانت مفيدة؟

المحلول

بروتوكول RTSP لم يعمل بالنسبة لي. عملت MJPEG أولا المحاولة. أفترض أنه مدمج في الكاميرا (DLINK DCS 900).

بناء الجملة هنا:http://answers.opencv.org/question/133/how-do-i-access-an-camera/

لم أكن بحاجة إلى ترجمة OpenCV مع دعم FFMPG.

نصائح أخرى

أرفق رمز 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;
    }   
}

تحديث يمكنك الاستيلاء على إطارات من تدفقات RTSP H.264. ابحث عن API للكاميرا للحصول على تفاصيل للحصول على أمر URL. على سبيل المثال، بالنسبة لكاميرا شبكة محور قد يكون عنوان 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
#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);
}

يمكن تجميع OpenCV مع دعم FFMPEG. من ./configure - Help.:

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

يمكنك بعد ذلك استخدام cvcreatefilecapture_ffmpeg. لإنشاء CVCAPTURE مع مثل عنوان URL لتيار MJPG الكاميرا.

يمكنني استخدام هذا لإلقاء الإطارات من كاميرا محور:

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

أنا فقط أفعل ذلك مثل هذا:

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

تأكد أيضا من أن هذا DLL متاح في وقت التشغيل آخر CvcreateFileCapture سيعود فارغة

opencv_ffmpeg200d.dll

تحتاج الكاميرا إلى السماح بالوصول غير المصادق عليه أيضا، عادة ما يتم تعيينها عبر واجهة الويب الخاصة بها. عمل تنسيق MJPEG عبر RTSP ولكن MPEG4 لم يفعل ذلك.

هذر

سيئ

استخدم ffmpeglib للاتصال بالدفق.

قد تكون هذه الوظائف مفيدة. ولكن إلقاء نظرة على المستندات

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

ستحتاج إلى القليل من Algo للحصول على إطار كامل، وهو متاح هنا

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

بمجرد الحصول على إطار يمكنك نسخ بيانات الفيديو (لكل طائرة إذا لزم الأمر) في iplimage وهو كائن صورة OpenCV.

يمكنك إنشاء iplimage باستخدام شيء مثل ...

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

بمجرد أن يكون لديك iplimage، يمكنك إجراء جميع أنواع عمليات الصور المتوفرة في OpenCV LIB

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top