2016-05-11 12 views
5

मैं वेबकैम wtih opencv और पायथन से छवियां प्राप्त करने का प्रयास करता हूं। कोड इतना बुनियादी है:बीगलबोन ब्लैक ओपनसीवी पायथन बहुत धीमा है

import cv2 
import time 
cap=cv2.VideoCapture(0) 
cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,640) 
cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT,480) 
cap.set(cv2.cv.CV_CAP_PROP_FPS, 20) 

a=30 
t=time.time() 
while (a>0): 
     now=time.time() 
     print now-t 
     t=now 
     ret,frame=cap.read() 
     #Some processes 
     print a,ret 
     print frame.shape 
     a=a-1 
     k=cv2.waitKey(20) 
     if k==27: 
       break 
cv2.destroyAllWindows() 

लेकिन यह धीरे-धीरे काम करता है। कार्यक्रम का उत्पादन:

VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
HIGHGUI ERROR: V4L: Property <unknown property string>(5) not supported by device 
8.82148742676e-06 
select timeout 
30 True 
(480, 640, 3) 
2.10035800934 
select timeout 
29 True 
(480, 640, 3) 
2.06729602814 
select timeout 
28 True 
(480, 640, 3) 
2.07144904137 
select timeout 

विन्यास:

  • Beaglebone काले RevC
  • डेबियन-wheezly
  • opencv 2.4
  • अजगर 2,7
+1

इस समस्या यह शायद मदद नहीं करेगा के लिए, लेकिन आप opencv उपयोग कर रहे हैं वास्तव में सीवी सामान करते हैं, तो आप शायद यह देखना होगा कि opencv आप उपयोग कर रहे नियोन एक्सटेंशन के खिलाफ संकलित किया गया है चाहते हैं। (Google ओपनसीवी बीगलबोन नियॉन को शायद उपयोगी विवरण मिलेगा, उदाहरण के लिए http://blog.lemoneerlabs.com/3rdParty/Darling_BBB_30fps_DRAFT.html) – Foon

+0

"opencv 2.4" - आपको अधिक विशिष्ट होने की आवश्यकता है, 2.4 की संख्या है कई वर्षों के दौरान ओपनसीवी की .x रिलीज। –

उत्तर

3

मैं एक ऐसी ही समस्या है जब मैं एक पर काम कर रहा था का सामना करना पड़ा इंटेल एडिसन मंच पर ओपनसीवी 2.4.9 का उपयोग कर प्रोजेक्ट। किसी भी प्रसंस्करण करने से पहले, फ्रेम पकड़ने के लिए यह लगभग 80ms ले रहा था। यह पता चला है कि लिनक्स के लिए ओपनसीवी का कैमरा कैप्चर लॉजिक कम से कम 2.4.9 रिलीज में लागू नहीं होता है। अंतर्निहित ड्राइवर केवल एक बफर का उपयोग करता है, इसलिए अनुप्रयोग परत में बहु-थ्रेडिंग का उपयोग करना संभव नहीं है जब तक कि आप अगले फ्रेम को पकड़ने का प्रयास न करें, V4L2 ड्राइवर में एकमात्र बफर लॉक हो।

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

इंटेल एडिसन मंच पर इसके बारे में मेरी पोस्ट यहां दी गई है: https://communities.intel.com/thread/58544

मैं मूल रूप से V4L2 का उपयोग करके फ्रेम grabs को संभालने के लिए अपनी खुद की कक्षा लिखने घायल हो गया। इस तरह आप बफर की गोलाकार सूची प्रदान कर सकते हैं और फ्रेम हथियाने और एप्लिकेशन तर्क को ठीक तरह से डीकॉप्ल करने की अनुमति दे सकते हैं। हालांकि सी ++ में सी ++ के लिए किया गया था। उपर्युक्त लिंक मानते हुए अपने वादों को बचाता है, जो कि एक आसान तरीका हो सकता है। मुझे यकीन नहीं है कि यह बीगलबोन पर काम करेगा, लेकिन हो सकता है कि वहां पिकैमेरा के समान कुछ हो। सौभाग्य।

संपादित करें: मैंने ओपनसीवी के 2.4.11 के लिए स्रोत कोड पर एक नज़र डाली। ऐसा लगता है कि वे अब 4 बफर का उपयोग करने के लिए डिफ़ॉल्ट हैं, लेकिन इसका लाभ उठाने के लिए आपको V4L2 का उपयोग करना होगा। यदि आप अपने त्रुटि संदेश HIGHGUI ERROR: V4L: Property... पर बारीकी से देखते हैं, तो आप देखते हैं कि यह वी 4 एल संदर्भित करता है, वी 4 एल 2 नहीं। इसका मतलब है कि आप जिस ओपनसीवी का उपयोग कर रहे हैं उसका निर्माण पुराने वी 4 एल चालक पर वापस आ रहा है। प्रदर्शन संबंधी मुद्दों के कारण एकवचन बफर के अलावा, आप एक प्राचीन ड्राइवर का उपयोग कर रहे हैं जिसमें शायद इसकी कई सीमाएं और प्रदर्शन समस्याएं हैं।

आपकी सर्वश्रेष्ठ शर्त यह सुनिश्चित करने के लिए ओपनसीवी बनाने के लिए होगी कि यह V4L2 का उपयोग करे। अगर मुझे सही याद आती है, तो ओपनसीवी कॉन्फ़िगरेशन प्रक्रिया जांचती है कि मशीन पर V4L2 ड्राइवर स्थापित हैं और इसे तदनुसार बनाता है, ताकि आप यह सुनिश्चित करना चाहें कि V4L2 और किसी भी संबंधित dev संकुल को उस मशीन पर स्थापित किया गया है जिसका उपयोग आप ओपनसीवी बनाने के लिए करते हैं।

+0

बफर हार्डवेयर मेमोरी में है जो मुझे लगता है (मेरे अनुभव से)। – user5698387

3

"गुप्त" प्राप्त करने के लिए ओपनसीवी के साथ वीडियो स्ट्रीम को संसाधित करते समय उच्च एफपीएस आई/ओ (यानी, कैमरा सेंसर से फ्रेम पढ़ने) को अलग थ्रेड पर ले जाना है।

जब cv2.VideoCapture समारोह के साथ read() विधि बुला, यह पूरी प्रक्रिया यह है कि यह अगले एक (Blocking Process) पर जाने के लिए के लिए प्रत्येक आई/ओ ऑपरेशन के लिए प्रतीक्षा करने के लिए पूरा हो गया है के रूप में बहुत धीमी गति से बनाता है।

इस एफपीएस वृद्धि/विलंबता को कम करने के लिए, हमारा लक्ष्य वेबकैम या यूएसबी डिवाइस से फ्रेम को पूरी तरह से अलग धागे में पढ़ने के लिए है, जो पूरी तरह से हमारी मुख्य पायथन लिपि से अलग है।

यह फ्रेम को I/O थ्रेड से लगातार पढ़ने की अनुमति देगा, जबकि हमारे रूट थ्रेड वर्तमान फ्रेम को संसाधित करते हैं। एक बार जब रूट थ्रेड अपने फ्रेम को संसाधित कर लेता है, तो इसे केवल I/O थ्रेड से वर्तमान फ्रेम को पकड़ने की आवश्यकता होती है। यह I/O संचालन को अवरुद्ध करने के इंतजार किए बिना पूरा किया जाता है।

आप थ्रेड को लागू करने के चरणों को जानने के लिए Increasing webcam FPS with Python and OpenCV पढ़ सकते हैं।


संपादित

हमारे टिप्पणी में विचार-विमर्श के आधार पर, मुझे लगता है कि इस प्रकार आप कोड को फिर से लिखने सकता है:

import cv2 

cv2.namedWindow("output") 
cap = cv2.VideoCapture(0) 

if cap.isOpened():    # Getting the first frame 
    ret, frame = cap.read() 
else: 
    ret = False 

while ret: 
    cv2.imshow("output", frame) 
    ret, frame = cap.read() 
    key = cv2.waitKey(20) 
    if key == 27:     # exit on Escape key 
     break 
cv2.destroyWindow("output") 
+0

मैंने वही काम किया लेकिन पाइथन और ओपनसीवी अभी भी बहुत धीमी है – acs

+0

अपने कैमरे के एफपीएस को 'cap.set (cv2.cv.CV_CAP_PROP_FPS, 30)' पर सेट करने का प्रयास करें और परिणाम देखें। –

+0

अभी भी वही। प्रश्न में संपादित – acs

1

इसे आजमाएं! मैं cap.set() खंड

import cv2 
import time 
cap=cv2.VideoCapture(0) 
cap.set(3,640) 
cap.set(4,480) 
cap.set(5, 20) 

a=30 
t=time.time() 
while (a>0): 
     now=time.time() 
     print now-t 
     t=now 
     ret,frame=cap.read() 
     #Some processes 
     print a,ret 
     print frame.shape 
     a=a-1 
     k=cv2.waitKey(20) 
     if k==27: 
       break 
cv2.destroyAllWindows() 

निर्गम (पीसी वेब कैमरा) अपने कोड मेरे लिए गलत था में कुछ कोड बदल दिया।

>>0.0 
>>30 True 
>>(480, 640, 3) 
>>0.246999979019 
>>29 True 
>>(480, 640, 3) 
>>0.0249998569489 
>>28 True 
>>(480, 640, 3) 
>>0.0280001163483 
>>27 True 
>>(480, 640, 3) 
>>0.0320000648499 
+0

मूल 'cap.set' फ़ंक्शन कॉल ठीक थे। स्थिरांक @acs ने उसी मानों का मूल्यांकन किया जो आपने मैन्युअल रूप से निर्दिष्ट किया है। यह प्रदर्शन समस्या का कारण नहीं है। – Aenimated1

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