2012-07-03 18 views
6

मैं वास्तविक समय में आईपी कैमरे से छवियों को कैप्चर करने की कोशिश कर रहा हूं। स्ट्रीम वीएलसी में पूरी तरह से अच्छी तरह से काम करती है, लेकिन ओपनसीवी के cvQueryFrame() आने वाली छवियों को पहचानने के बिंदु पर गड़बड़ और भ्रष्ट लगती है।ओपनसीवी/एफएफएमपीईजी छवि कैप्चरिंग समस्या

फिर से, फ़ाइल से कैप्चरिंग ठीक काम करती है, लेकिन लाइव स्ट्रीम नहीं। यदि यह कोई फर्क पड़ता है, तो मैं एक आरटीएसपी कनेक्शन यूआरएल का उपयोग कर रहा हूं; मैंने इसे दो अलग-अलग कैमरा मॉडल (विभिन्न ब्रांड) के साथ भी आजमाया है, और समस्या बनी हुई है।

इसके अलावा, (मुझे लगता है) कोडेक निम्न प्रकार की कई त्रुटियों को आउटपुट कर रहा है: Error at MB: 1746 और concealing 6000 DC, 6000 AC, 6000 MV errors

मैं क्या कर सकता हूं?

अद्यतन: ठीक है, ऐसा लगता है कि OpenCV/FFMPEG RTSP/h264 धाराओं के साथ एक मुद्दा है: अनुक्रम में पहली त्रुटि हमेशा cannot parallelize deblocking type 1, decoding such frames in sequential order

अद्यतन 2 है। मैंने Qt Phonon लाइब्रेरी की कोशिश की है, जो काम नहीं करता है, और मैंने लाइव 555 लाइब्रेरी को एक त्वरित अवलोकन दिया है। यह आखिरी काम करता है, इस अर्थ में कि हर कोई कहता है कि यह करता है, और वास्तव में एप्लिकेशन उदाहरण (ओपनआरटीएसपी) वास्तव में मेरी स्ट्रीम को अच्छी तरह से चलाता है। हालांकि, काफी ईमानदार होने के लिए, लाइव 555 कोड के साथ पकड़ने के लिए एक लंबा संबंध लगता है जिसे मैं अभी शायद ही बर्दाश्त कर सकता हूं। किसी भी अन्य विकल्प को छोड़कर, मुझे लगता है कि मुझे उस मार्ग पर जाना होगा।

क्या कोई अन्य समाधान है जो दिमाग में आता है?

अद्यतन 3: मैं काम करने के लिए Live555 कोड से परीक्षण RTSP ग्राहक मिल गया है, तो मुझे पता है कि एक धारा से h264 फ्रेम जानकारी निकालने के लिए, लेकिन अब मैं वास्तविक प्रदर्शन योग्य फ्रेम, में है कि फ्रेम जानकारी को पुनः एकत्रित करने की जरूरत है जो कुछ सरल की तरह प्रतीत नहीं होता है! लाइव 555 से परिचित कोई भी जानता है कि यह कैसे करें? धन्यवाद।

+0

ओपनसीवी का आप किस संस्करण का उपयोग कर रहे हैं? इसमें लिनक्स या खिड़कियों पर? – Mohammad

+0

ओपनसीवी 2.3.1 विन 7 पर। –

+0

'cvQueryFrame() 'एक पूर्ण छवि वापस कर सकता है। इसके साथ कुछ करने से पहले इसका परीक्षण करना सुनिश्चित करें। – karlphillip

उत्तर

2

(मुक्त स्रोत/नेटवर्क टैब में स्ट्रीमिंग/बचत की टिक टिक द्वारा) ऐसा लगता है कि आप एक अतिरिक्त सॉफ्टवेयर परत की जरूरत है की कोशिश कर सकते स्ट्रीम पैकेट को कैप्चर करने और स्थानीय रूप से फ़्रेम का पुनर्निर्माण करने के लिए, और फिर उन्हें OpenCV पर फ़ीड करें। आप आसानी से libVLC के साथ इसे प्राप्त कर सकते हैं। यह कोडेक समस्याओं से भी बच जाएगा क्योंकि आप libVLC के साथ लगभग सभी कोडेक्स को पार्स कर सकते हैं और फिर कच्चे फ्रेम को OpenCV पर फ़ीड कर सकते हैं।

+0

यही वह है। libVLC ठीक काम किया। बहुत धन्यवाद! –

+2

मैं एक समान मुद्दे पर काम कर रहा हूं। क्या आप libVLC से openCV तक कच्चे फ्रेम को खिलाने के लिए कोड पोस्ट कर सकते हैं? – Sergiy

1

यहां एक कोड स्निपेट है, जिसे मैं वेबकैम से फ्रेम कैप्चर करता था। यह मेरे लिए काम किया, उम्मीद है कि यह रूप में अच्छी तरह से काम करता है आप के लिए ...

int main(int argc, char* argv[]) 
{ 
    CvCapture *capture = NULL; 
    IplImage* frame=NULL; 
    int key =0; 
    capture = cvCaptureFromCAM(0); 

    if (!capture) { 
     printf("Cannot initailize webcam"); 
     return 1; 
    } 

    cvNamedWindow("result",CV_WINDOW_AUTOSIZE); 

    while(key != 'q') 
    { 
     frame=cvQueryFrame(capture); 

     if(!frame) break; 

     cvShowImage("result",frame); 
     key=cvWaitKey(10); 
     frame=NULL; 
    } 
    cvDestroyWindow("result"); 
    cvReleaseCapture(&capture); 
    return 0; 
} 
+0

इस प्रकार, समस्या OpenCV में नहीं है, लेकिन अंतर्निहित FFMpeg लाइब्रेरीज़ इसका उपयोग करती है। यह काम नहीं करता। –

0

OpenCV 2.3.1 के लिए मैं इस कोड को लिखा है और यह सामान्य रूप से काम करता है, वह यह है कि, मैं कैमरा फ़ीड से छवियों को मिलता है।

VideoCapture cap(0); 
if(!cap.isOpened()) 
{ 
    cout<<"Camera is not connected"<<endl; 
    getchar(); 
} 
namedWindow("Camera Feed",1); 
for(;;) 
{ 
    Mat frame; 
    cap >> frame; 
    imshow("Camera Feed", frame); 
    if(!frame.empty()) 
     detectAndDisplay(frame); 
    else 
     cout<<"No frame as input"<<endl; 
    int c=waitKey(10); 
    if(c==27) 
     break; 
} 
return 0; 

आप देख सकते हैं, यह इनपुट लेता है और यह लगातार प्रदर्शित करता है और बाहर निकलता है, तो आप अपने कीबोर्ड पर ESC दबाएँ। Here's सीवी 2.1 के लिए प्रलेखन जिसमें सीवी 2.3 के रूप में कमांड का एक ही सेट है। आदेश 2.4 से बदलते हैं मुझे लगता है, हालांकि मैं इसके बारे में भी निश्चित नहीं हूं। उम्मीद है कि यह मदद करता है। :)

+0

ठीक है, मैं इस मामले में भी कैमरों से तस्वीरें प्राप्त करने में कामयाब रहा हूं, हालांकि इस मामले में छवियां दूषित हैं। यह OpenCV में वीडियो कैप्चर करने का C++ संस्करण है, लेकिन परिणाम वही है क्योंकि यह वही FFMpeg कार्यक्षमता को लपेटता है। –

+0

@ क्रिस्टियन डी'एमाटो यह सब मेरे पास है। छवि भ्रष्ट हैं? ऐसा नहीं होता है। –

+0

धन्यवाद प्रखर; हाँ छवियों विकृत और गलत दिखते हैं। –

3

मुझे नहीं पता कि यह मदद करता है (क्योंकि मैं अनुभवी सी ++ देव नहीं हूं), लेकिन मैंने हाल ही में IP Camera से स्ट्रीम प्राप्त करने में कामयाब रहा है। यहाँ एक त्वरित परीक्षण है:

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 
#include <stdio.h> 

using namespace cv; 
using namespace std; 

int main(int, char**) 
{ 
    VideoCapture ipCam; 
    Mat frame; 
    const string LOCATION = "rtsp://192.168.0.200:554/rtsph264vga"; 

    if(!ipCam.open(LOCATION)) { 
     cout << "Error opening video stream or file" << endl; 
     return -1; 
    } 

    for(;;) { 
     if(!ipCam.read(frame)) { 
      cout << "No frame" << endl; 
      waitKey(); 
     } 
     imshow("cam", frame); 
     if(waitKey(1) >= 0) break; 
    } 

    return 0; 
} 

ग में जाने से पहले ++ मैं सेटअप H264 वीजीए को निर्यात करने के लिए (के रूप में यह कैमरा के साथ मैं काम कर रहा हूँ पर डिफ़ॉल्ट रूप से सक्षम नहीं किया गया था) कैमरा है और यह सुनिश्चित किया कि मैं वीएलसी में स्ट्रीम चल रही है। मैं fffmpeg सक्षम के साथ OpenCV 2.4.1 का उपयोग कर रहा हूं। जहां तक ​​मैं समझता हूं कि OpenCV के साथ ffmpeg एकीकरण ओपनसीवी 2.0 ऊपर से उपलब्ध है।

मैंने कुछ मुद्दों में भाग लिया जब मुझे सीवी कोड को अन्य सी ++ कोड के साथ मर्ज करना था क्योंकि मेरे पास 64 बिट आर्क के लिए ओपनसीवी और एफएमपीईपी + निर्भरताएं थीं। और दूसरा कोड कई 32 बिट पुस्तकालयों पर निर्भर था। VideoCapture क्लास हाईगुई लिब का हिस्सा है और मुख्य रूप से जिसकी आपको चिंता करने की आवश्यकता है। अगर यह ffmpeg समर्थन के साथ संकलित नहीं है तो आपको एक त्रुटि या चेतावनी मिलेगी क्योंकि VideoCapture सामग्री को ट्रांसकोड करने में सक्षम नहीं होगा।

सुनिश्चित नहीं हैं कि यह सबसे अच्छा विकल्प है, लेकिन आप धारा/वीएलसी से धारा ट्रांसकोड

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