2009-04-03 16 views
23

मैं विंडोज के तहत ओपनसीवी 1.1pre1 का उपयोग कर रहा हूं। मेरे पास एक नेटवर्क कैमरा है और मुझे ओपनसीवी से फ्रेम पकड़ने की जरूरत है। वह कैमरा http पर RTSP या mjpeg पर मानक एमपीई 4 स्ट्रीम स्ट्रीम कर सकता है। मैंने ओपनसीवी के साथ ffmpeg का उपयोग करने के बारे में बात करने वाले कई धागे देखे हैं लेकिन मैं इसे काम नहीं कर सकता।नेटवर्क कैमरे के साथ ओपनसीवी

मैं ओपनसीवी के साथ आईपी कैमरे से फ्रेम कैसे पकड़ सकता हूं?

धन्यवाद

एंड्रिया

+0

यह भी जांचें: http://stackoverflow.com/q/6022423/1085483 –

उत्तर

3

आरटीएसपी प्रोटोकॉल मेरे लिए काम नहीं करता है। mjpeg पहले कोशिश की। मुझे लगता है कि यह मेरे कैमरे में बनाया गया है (डीसीएस डीसीएस 900)।

सिंटेक्स मिली: http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera/

मैं ffmpg समर्थन के साथ OpenCV संकलित करने के लिए जरूरत नहीं थी।

+0

मुझे समझ में नहीं आता कि mjpeg पहली कोशिश में कैसे काम करता है, आपने फ्रेम के साथ mjpeg आउटपुट करने के लिए क्या किया? – Marine1

1

उपयोग 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 में उपलब्ध छवि के संचालन के सभी प्रकार के प्रदर्शन कर सकता है

+0

मैंने कई धागे में देखा है कि ffmpeg पहले से ही शामिल है और ओपनसीवी के अंदर उपयोग किया जाता है, क्या यह सही है? शायद मुझे ffgmpeg समर्थन के साथ openCV को पुन: संकलित करने की आवश्यकता है? इस मामले में मैं विंडोज़ के तहत यह कैसे कर सकता हूं? धन्यवाद – Grifo

+0

मुझे इस बारे में पता नहीं है। हालांकि, ffmpeg एक ऐसा एप्लिकेशन है जहां ffmpeglib एक लाइब्रेरी है। यदि आप इनके लिए नए हैं तो कृपया dranger.com ट्यूटोरियल देखें। – Indy9000

5

OpenCV के साथ संकलित किया जा सकता एफएफएमपीईजी समर्थन। --help कॉन्फ़िगर से:

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

फिर आप cvCreateFileCapture_FFMPEG उपयोग कर सकते हैं जैसे के साथ एक CvCapture बनाने के लिए कैमरे के एमजेपीजी स्ट्रीम का यूआरएल।

मैं इस का उपयोग एक धुरी कैमरे से फ्रेम हड़पने के लिए:

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

क्या विंडोज के तहत ffmpeg समर्थन के साथ openCV को कॉन्फ़िगर करना संभव है? – Grifo

+1

स्पष्ट रूप से opencv 2.x हमेशा सभी प्लेटफॉर्म पर ffmpeg समर्थन है। – Jim

3

मैं सिर्फ इस तरह यह कार्य करें:

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

यह भी सुनिश्चित करें इस dll रनटाइम पर उपलब्ध है और कुछ cvCreateFileCapture NULL वापस आ जाएगी

opencv_ffmpeg200d.dll 

कैमरा भी अप्रमाणित उपयोग की अनुमति की जरूरत है, आम तौर पर के माध्यम से सेट अपने वेब इंटरफेस। एमजेपीईजी प्रारूप आरटीएसपी के माध्यम से काम किया लेकिन एमपीईजी 4 नहीं था।

hth

सी

+0

क्या आप ओपनसीवी 2.0 का उपयोग कर रहे हैं? – Grifo

+0

लाइब्रेरी संस्करण का कहना है कि वह ओपनसीवी 2.0 का उपयोग कर रहा है - यह 'opencv_ffmpeg200d.dll' – jamuraa

+0

में' 200' हिस्सा है, यह मेरी राय में सही उत्तर है। मैं विंडोज़ का उपयोग कर रहा हूं और मुझे अपने प्रोजेक्ट फ़ोल्डर में 'opencv_ffmpeg300.dll' कॉपी करना पड़ा। स्ट्रीम खोलने के लिए मैं 'वीडियो कैप्चर कैप ("आरटीएसपी: // एबीसी: [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

धन्यवाद, बहुत मदद मिली। – Maysam

+0

@lolong यह कैसे एक mjpg धारा के लिए कोड है, है ना? –

21

मैं फ्रेम हथियाने के लिए सी ++ कोड संलग्न। इसे ओपनसीवी संस्करण 2.0 या उच्चतम की आवश्यकता है। कोड सीवी :: चटाई संरचना का उपयोग करता है जिसे पुराने 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'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; 
    } 
} 

अद्यतन आप 264 RTSP से फ्रेम हड़पने कर सकते हैं धाराओं। यूआरएल कमांड प्राप्त करने के लिए विवरण के लिए अपना कैमरा एपीआई देखें। उदाहरण के लिए, एक्सिस नेटवर्क कैमरा के लिए यूआरएल पता हो सकता है:

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

क्या आप जानते हैं कि यह केवल एमजेपीईजी के साथ या एच .264 आरटीएसपी/यूडीपी स्ट्रीमिंग के साथ भी काम करता है? – Matthias

+0

@ माथियास यह एच .264 आरटीएसपी स्ट्रीमिंग के लिए भी काम करता है। मेरे पास ओपनसीवी संस्करण 2.4.4 है और H.264 के साथ कैमरा स्ट्रीमिंग से फ्रेम ले जा सकता है। – Alexey

+0

आपके तेज़ उत्तर के लिए धन्यवाद। – Matthias

संबंधित मुद्दे