2012-03-20 5 views
9

पर ओपनसीवी के साथ एकाधिक वेबकैम (यूवीसीवीडियो) को कैप्चर करना मैं उबंटू 11.10 पर ओपनसीवी 2.1 का उपयोग करके 3 लॉजिटेक वेबकैम प्रो 900 डिवाइसों से छवियों को स्ट्रीम करने की कोशिश कर रहा हूं। यूवीसीवीडियो ड्राइवर इनके लिए लोड हो जाता है।लिनक्स

दो उपकरणों कैप्चरिंग तीन के साथ ठीक काम करता है मैं तीसरे के लिए अंतरिक्ष त्रुटि से बाहर में चलाने हालांकि,:

libv4l2: error turning on stream: No space left on device 

मैं इस मुद्दे में चल रहे हो रहे हैं: http://renoirsrants.blogspot.com.au/2011/07/multiple-webcams-on-zoneminder.html और मैं ऐसा करने का प्रयास किया है quirks = 128 (या किसी भी अन्य शक्ति के दो मूल्य) चाल लेकिन कोई फायदा नहीं हुआ। मैंने दो यूएसबी 2.0 हबों के साथ एक और मशीन पर भी कोशिश की और दो कैमरों को एक और तीसरे कैमरे को दूसरे से जोड़ दिया, जिसके परिणामस्वरूप एक ही समस्या हुई। मैं मोटे तौर पर (ताकि परिणाम वास्तव में एक एसटीएल वेक्टर में डाल दिया है एन कैमरे का उपयोग) आरंभ कर रहा हूँ इस प्रकार है:

cv::VideoCapture cap0(0); //(0,1,2..) 

और के रूप में

cap0.retrieve(frame0); 

यह ठीक काम करता है एक पाश में सभी कैमरों पर कब्जा करने का प्रयास एन = 2 कैमरों के लिए। जब मैं एन = 3 सेट करता हूं तो तीसरी विंडो खुलती है लेकिन कोई छवि दिखाई नहीं देती है और कंसोल को V4L2 त्रुटियों से भरा स्पैम किया जाता है। इसी प्रकार, जब मैं एन = 2 सेट करता हूं, और पनीर (सरल वेबकैम कैप्चर एप्लिकेशन) कहने में तीसरा कैमरा खोलने का प्रयास करता हूं, तो यह काम नहीं करता है।

अब बड़ा आता है लेकिन: इसके तीन उदाहरण शुरू करके guvcview को आजमाने के बाद, मैं एक बार में तीन कैमरों को देखने में सक्षम था (फ्रेम दर या संबंधित के मामले में कोई समस्या नहीं है), इसलिए ऐसा लगता है कि ऐसा नहीं लगता है हार्डवेयर मुद्दा मुझे लगता है कि कुछ संपत्ति है जिसे मुझे सेट करना चाहिए, लेकिन मुझे यकीन नहीं है कि यह क्या है। मैंने एमजेपीईजी (जो इन कैमरों का समर्थन करने लगते हैं) में देखा है, लेकिन अगर मैं ओपनसीवी से शुरू करता हूं तो वे इस प्रॉपर्टी को सेट करने में सफल नहीं हुए हैं, या वे किस मोड (yuyv?) में पता लगा रहे हैं।

विचार?

उत्तर

7

मुझे तीन लॉजिटेक क्विककैम प्रो 9000 कैमरों (उबंटू का उपयोग करके) का उपयोग करके यह सही समस्या थी। मैं दो से पढ़ सकता था, लेकिन तीन नहीं। मेरे मामले में, मैं ओपनसीवी का उपयोग नहीं कर रहा था, लेकिन स्मृति-मैप किए गए आईओ का उपयोग करके सीधे वी 4 एल 2 के माध्यम से कैमरे तक पहुंच रहा था। सीधे शब्दों में कहें, तीन बफर आवंटित करने के लिए पर्याप्त यूएसबी बैंडविड्थ नहीं थी।

हालांकि, मैं असम्पीडित फ्रेम में पढ़ रहा था। जैसे ही मैंने प्रारूप को एमजेपीईजी में स्विच किया, डेटा काफी छोटा था, और मैं तीन कैमरों से पढ़ सकता था। मैंने एमजेपीईजी धारा को डीकोड करने के लिए libjpeg का उपयोग किया।

मैंने ओपनसीवी का उपयोग करके छवि प्रारूप को बदलने का तरीका नहीं देखा है, लेकिन मुझे पता है कि यह सभी डेटा फिट करने के लिए एमजेपीईजी होना आवश्यक है।

एमजेपीईजी में स्विच करने से पहले, मैंने एक समय में प्रत्येक कैमरे को एक्सेस करने का प्रयास करने में काफी समय बिताया, अगली बार स्विच करने से पहले एक फ्रेम को स्ट्रीम करना। सिफारिश नहीं की गई!

+0

ओपनसीवी के लिए, एक v4l बिल्ड एमजेपीईजी का समर्थन करता है, जबकि libv4l बिल्ड का समर्थन करता है केवल असंपीड़ित प्रारूप, मेरा जवाब यहां देखें। –

0

मैंने पाया कि सबसे उपयोगी चीजों में से एक यह था कि यदि आप अपने कैप्चर प्रारंभिकताओं के बीच एक स्लीप (एमएस) कॉल करते हैं। इसने मुझे बिना किसी समस्या के दो वेबकैम कैप्चर पुनर्प्राप्त करने की अनुमति दी।

5

वीडियो कैप्चर डिवाइस के ड्राइवर द्वारा यूएसबी बैंडविड्थ विवाद की संभावना है। जांचें कि पिक्सेल प्रारूप YUYV है, जो असंपीड़ित होता है। इसके विपरीत, यदि पिक्सेल प्रारूप एमजेपीजी (संपीड़ित) है, तो एक ही यूएसबी चैनल पर कई डिवाइस होना संभव है।

v4l2-ctl -d /dev/video0 --list-formats 

उत्पादन नीचे की तरह कुछ होगा: ऐसा है कि ड्राइवरों लोड अलग हैं

  1. विभिन्न निर्माताओं से उपयोग कैप्चर डिवाइस:

    ioctl: VIDIOC_ENUM_FMT 
        Index  : 0 
        Type  : Video Capture 
        Pixel Format: 'YUYV' 
        Name  : 16bpp YUY2, 4:2:2, packed 
    

    निम्नलिखित संभव समाधान हैं। आम तौर पर एक ही चालक को कई उपकरणों को संभालने के लिए बैंडविड्थ को प्रभावी ढंग से संभालने की आवश्यकता होती है।

  2. 2 यूएसबी वीडियो कैप्चर डिवाइस को संलग्न करने के लिए उपलब्ध होने पर एक पीसीआई यूएसबी एक्सटेंशन कार्ड का उपयोग करें। यह कामकाज मेरे लिए उत्कृष्टता से काम करता था जब मैंने AVerMedia DVD EZMaker 7 को जोड़ने का प्रयास किया जो ड्राइवर cx231xx को लोड करता था।
+0

क्या EZMaker 7 विंडोज़ पर ओपनसीवी वीडियो कैप्चर ऑब्जेक्ट्स के साथ काम करता है? – Micka

6

मुझे यह समस्या भी थी और एक समाधान है जो मुझे 640x480 पर mjpeg संपीड़न के साथ 2 कैमरे को कैप्चर करने देता है। मैं क्रिएटिव "लाइव कैम सिंक एचडी वीएफ0770" का उपयोग कर रहा हूं जो गलत तरीके से इसकी बैंडविड्थ आवश्यकताओं की रिपोर्ट करता है। Quirks = 128 फिक्स 320x240 असम्पीडित वीडियो के लिए काम करता है। लेकिन संपीड़ित (mjpg) प्रारूप के लिए quirks = 128 काम नहीं करता है (यह संकुचित प्रारूपों के लिए कुछ भी नहीं करता है)।

डाउनलोड कर्नेल के सूत्रों

mkdir -p ~/Software/kernel-git 
cd ~/Software/kernel-git 
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
git checkout v3.2 
# NOTE: `uname -r` shows me my current kernel is 3.2.0-60-generic 
# For a different kernel use a different tag 

प्रतिलिपि UVC dir:

mkdir -p ~/Software/uvcvideo_driver 
cd ~/Software/uvcvideo_driver 
#cp -a ~/Software/kernel-git/linux/drivers/media/usb/uvc . 
cp ~/Software/kernel-git/linux/drivers/media/video/uvc . 

Makefile

cd ~/Software/uvcvideo_driver/uvc 
vi Makefile 

     obj-m += aauvcvideo.o 
     aauvcvideo-objs := uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ctrl.o \ 
       uvc_status.o uvc_isight.o 
     all: 
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

     clean: 
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

संशोधित

मैं UVC चालक संशोधित इस प्रकार इसे ठीक करने के फो संकुचित होने पर 0x400 के लिए आरसी बैंडविड्थ।

cd ~/Software/uvcvideo_driver/uvc 
vw uvc_video.c 
Find the uvc_fixup_video_ctrl() function. At the end of the function add: 
     if (format->flags & UVC_FMT_FLAG_COMPRESSED) { 
     ctrl->dwMaxPayloadTransferSize = 0x400; 
     } 

निर्माण aauvcvideo मॉड्यूल:

make 

वर्ष मॉड्यूल को निकालने और नया एक सम्मिलित करें: 2 अलग खिड़कियों में संपीड़न के साथ दो बार

sudo rmmod uvcvideo 
sudo insmod ./aauvcvideo.ko quirks=128 

रन gucview परीक्षण करने के लिए

guvcview --device=/dev/video1 --format=mjpg --size=640x480 
guvcview --device=/dev/video2 --format=mjpg --size=640x480 

गुओ भाग्यशाली! -Acorn

+1

एक कैमरा समस्या हल करने के लिए एक कर्नेल हैक एक अपवर्तनीय हकदार है। :) मैं [पढ़ा] (http://www.ideasonboard.org/uvc/#footnote-13) कि FIX_BANDWIDTH क्विर्क केवल आपके असम्पीडित प्रारूपों को प्रभावित करता है, जो आपके उत्तर से मेल खाता है। दिलचस्प बात यह है कि क्विर्क [मेरे लिए काम किया] (http://stackoverflow.com/a/34778270/1628638) भले ही 'v4l2-ctl -d 0 -V' ने पिक्सेल प्रारूप 'एमजेपीजी' का दावा किया, जबकि मैंने ओपनसीवी-आधारित कोड का उपयोग किया एकाधिक कैमरों से कब्जा। –

+0

पता लगाया कि क्विर्क ने मेरे लिए क्यों काम किया, मेरा जवाब यहां देखें। संक्षेप में, ओपनसीवी असम्पीडित कैप्चर कर रहा था, इसके बावजूद 'v4l2-ctl -d 0 -V' ने दावा किया था। –

+0

इसके लिए धन्यवाद। जानकारी के कुछ और हिस्सों को जोड़ने के लिए, यहाँ ठीक है मैं कैसे एक डेबियन-आधारित डिवाइस पर ऐसा किया: # apt-get स्रोत लिनक्स छवि # टार # सीडी लिनक्स छवि # cp/lib/मॉड्यूल XF/<उचित dir> /build/Module.symvers। # # तैयार # स्क्रिप्ट बनाने # [संपादित के रूप में ड्राइवरों/मीडिया/usb में ऊपर/UVC] # subdirs = ड्राइवरों/मीडिया/USB/UVC/मॉड्यूल बनाने –

1

यह मेरे

sudo rmmod uvcvideo

sudo modprobe uvcvideo quirks के लिए आकर्षण के रूप में काम करता है = 128

यह हर रिबूट रीसेट कर दिया जाएगा। यदि यह काम करता है, तो निम्न फ़ाइल बनाएं: sudo vi /etc/modprobe.d/uvcvideo।conf लाइन युक्त विकल्पों uvcvideo quirks = 128

जांच के लिए इस लिंक http://renoirsrants.blogspot.in/2011/07/multiple-webcams-on-zoneminder.html

3

OpenCV उपयोग करने के लिए या तो v4l या libv4l, और केवल v4l संस्करण बनाया जा सकता है संकुचित स्वरूपों का समर्थन करता है, जबकि libv4l संस्करण OpenCV 2.4.11 के लिए केवल एक असम्पीडित प्रारूप का समर्थन करता है। (V4l के लिए autosetup_capture_mode_v4l2() और libv4l के लिए line 692 के बाद कोड देखें।) ओपनसीवी 3.0.0 2.4.11 से अधिक में सुधार नहीं करता है; यह अभी भी libv4l के लिए केवल असम्पीडित प्रारूपों का समर्थन करता है।

चूंकि आपकी त्रुटि libv4l2 का उल्लेख करती है, तो आपको लगता है कि libv4l संस्करण और ओपनसीवी आपके मामले में असंपीड़ित है। OpenCV के v4l संस्करण बनाने के लिए, अपने cmake आदेश बैंडविड्थ और यूएसबी पर शामिल करना चाहिए

-D WITH_LIBV4L=OFF 

(WITH_LIBV4L मेरे लिए डिफ़ॉल्ट रूप से सक्षम किया गया था।)

एक नोट। यूएसबी 2.0 (जो लगभग सभी वेबकैम उपयोग करते हैं) में 480 एमबी/एस की बैंडविड्थ है। 640x480 30 एफपीएस और 24 बिट्स/पिक्सेल असम्पीडित लगभग 221 एमबी/एस है, इसलिए कोई भी यूएसबी 2.0 बैंडविड्थ को असंपीड़ित वेबकैम के साथ जल्दी से उपयोग कर सकता है। प्रत्येक यूएसबी होस्ट नियंत्रक के लिए 480 एमबीटी/एस प्राप्त होता है, इसे answer को सूचीबद्ध करने के तरीके पर देखें। (यूएसबी केन्द्रों आम तौर पर एक ही होस्ट नियंत्रक से जुड़े हैं एक मदरबोर्ड पर मेजबान नियंत्रकों, और कई यूएसबी पोर्ट नहीं जोड़ते हैं। सभी उपकरणों और केन्द्र एक होस्ट नियंत्रक साझा करने के लिए बैंडविड्थ जुड़ा हुआ है।)

वेबकैम के लिए है कि और अधिक सुरक्षित रखते हैं यूएसबी बैंडविड्थ की आवश्यकता होने की तुलना में, उदाहरण के लिए, footnote [13] वाले UVC driver page पर, FIX_BANDWIDTH quirk मदद कर सकता है। लेकिन quirk केवल असम्पीडित प्रारूपों के लिए काम करता है (जब तक आप यहां Acorn के उत्तर में कर्नेल हैक नहीं करते)। मेरे मामले में (उबंटू 14.04, 320x240 पर कई माइक्रोसॉफ्ट लाइफकैम सिनेमाज), क्विर्क ने काम किया जब मैंने ओपनसीवी के libv4l संस्करण (एएसएमडिया यूएसबी होस्ट कंट्रोलर पर चार लाइफ कैम्स अच्छी तरह से काम किया) लेकिन वी 4 एल संस्करण के लिए - जिसे मैंने उपयोग करने की पुष्टि की एमजेपीईजी - मुझे VIDIOC_STREAMON: No space left on device त्रुटि मिली जैसे ही मैंने दूसरे लाइफकैम से कब्जा करने की कोशिश की! (उसी मशीन के लिए, इंटेल और वीआईए होस्ट नियंत्रकों ने बेहतर प्रदर्शन किया और प्रत्येक ने v4l के लिए दो लाइफकैम के साथ काम किया; लाइफकैम यूएसबी 2.0 बैंडविड्थ का 48% रिजर्व करता है।)

+0

के बाद से libv4l के प्रयोजन का हिस्सा लगता है बनाने के oldconfig बनाने "किसी भी (ज्ञात) पिक्सेलफॉर्मेट से बीजीआर 24 में परिवर्तित करने के लिए," libv4l सिद्धांत रूप से वेबकैम से संकुचित प्रारूप प्राप्त कर सकता है और फिर बीजीआर 24 को ओपनसीवी पास कर सकता है। मैंने जांच की है और libv4l * वेब * (v4l-utils 1.10.0 के लिए) से संपीड़ित प्रारूप प्राप्त नहीं करता है, ऊपर दिए गए मेरे अवलोकन से मेल खाता है कि quirk libv4l के लिए काम करता है। –