2010-04-08 10 views
53

का उपयोग कर रहा है जो मेरे वेबकैम से एक वीडियो फ़ीड प्राप्त है और स्क्रीन पर प्रदर्शित करने के OpenCV का उपयोग करता Python के साथ एक साधारण प्रोग्राम बनाने के लिए कोशिश कर रहे हैं एक वेब कैमरा फ़ीड प्रदर्शित।OpenCV और अजगर

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

import cv 

cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE) 
capture = cv.CaptureFromCAM(0) 

def repeat(): 

    frame = cv.QueryFrame(capture) 
    cv.ShowImage("w1", frame) 


while True: 
    repeat() 

एक असंबंधित नोट पर, मैंने देखा है कि मेरी वेब कैमरा कभी कभी cv.CaptureFromCAM में अपनी इंडेक्स नंबर बदलता है, और कभी कभी मैं 0, 1 या भले ही मैं केवल एक कैमरा कनेक्ट कर लिया है 2 और मैं हेवन में डाल करने की आवश्यकता है ' टी इसे अनप्लग किया गया (मुझे पता है क्योंकि जब तक मैं इंडेक्स नहीं बदलता तब तक प्रकाश नहीं आता है)। क्या सही सूचकांक निर्धारित करने के लिए पायथन प्राप्त करने का कोई तरीका है?

+0

में परीक्षण किया गया था मुझे कुछ महीने पहले यह समस्या थी ... मुझे समस्या का समाधान हल करने दें। –

उत्तर

41

अपने repeat() विधि के तल पर लाइन c = cv.WaitKey(10) जोड़ने का प्रयास करें।

इस उपयोगकर्ता एक कुंजी दर्ज करने के लिए 10 एमएस के लिए इंतजार कर रहा है। भले ही आप सब पर कुंजी का उपयोग नहीं कर रहे हैं, में इस डाल दिया। मुझे लगता है कि बस कुछ देरी होने की जरूरत है, तो time.sleep(10) भी काम कर सकते हैं।

कैमरा सूचकांक के संबंध में, आप कुछ इस तरह कर सकता है:

for i in range(3): 
    capture = cv.CaptureFromCAM(i) 
    if capture: break 

यह कम से कम 0-2 से सूचकांक के लिए, पहले "काम" कैप्चर डिवाइस के सूचकांक मिल जाएगा। यह संभव है कि आपके कंप्यूटर में एक से अधिक डिवाइस एक उचित कैप्चर डिवाइस के रूप में पहचाने जाते हैं। मुझे यह पुष्टि करने का एकमात्र तरीका है कि आपके पास सही है कि वह आपकी रोशनी को मैन्युअल रूप से देख रहा हो। शायद एक छवि प्राप्त करें और इसकी संपत्तियों की जांच करें?

import cv 

cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE) 
camera_index = 0 
capture = cv.CaptureFromCAM(camera_index) 

def repeat(): 
    global capture #declare as globals since we are assigning to them now 
    global camera_index 
    frame = cv.QueryFrame(capture) 
    cv.ShowImage("w1", frame) 
    c = cv.WaitKey(10) 
    if(c=="n"): #in "n" key is pressed while the popup window is in focus 
     camera_index += 1 #try the next camera index 
     capture = cv.CaptureFromCAM(camera_index) 
     if not capture: #if the next camera index didn't work, reset to 0. 
      camera_index = 0 
      capture = cv.CaptureFromCAM(camera_index) 

while True: 
    repeat() 

अस्वीकरण::

प्रक्रिया के लिए एक उपयोगकर्ता शीघ्र जोड़ने के लिए, यदि आप अपने दोहराने पाश में कैमरे स्विचन के लिए एक महत्वपूर्ण बाँध सकता है मैं परीक्षण नहीं किया यह तो यह बग हो सकते हैं या सिर्फ काम नहीं , लेकिन आप एक वैकल्पिक हल के कम से कम एक विचार दे सकता है।

+0

कि कोड की एक छोटी सी रेखा ने इलाज किया! बहुत बहुत धन्यवाद। हालांकि कैमरा इंडेक्स कोड काम नहीं करता है, जो भी डिवाइस इंडेक्स 0 पर देखता है वह अभी भी सच हो जाता है और लूप को तोड़ देता है। यही कारण है कि मेरे पास इतने सारे उदाहरण हैं कि मैं सिर्फ एक ब्लैक स्क्रीन दिखाता हूं। क्या यह निर्धारित करने का कोई तरीका है कि इंडेक्स 0 पर क्या है ताकि मैं इसे बंद कर सकूं? या वैकल्पिक रूप से वेबकैम को 0 में बदलें? – Mitch

+0

हम्म, मुझे यकीन नहीं है कि ऐसा करने का कोई आसान तरीका है या नहीं। यह सत्यापित करने के बजाय कि कैप्चर एक गैर-टाइप नहीं है, आप फ्रेम को पूछने के लिए और अधिक जटिल कोड लिख सकते हैं और जांच सकते हैं कि फ्रेम "सभी काला" हो सकता है, शायद उसमें कुछ पिक्सल को यादृच्छिक रूप से नमूना दे। मुझे लगता है कि केवल एक संकेत प्रदान करना बेहतर हो सकता है जो एक फ्रेम दिखाता है और उपयोगकर्ता से पूछता है कि क्या वे इस कैमरे को चाहते हैं या अगली कोशिश कर सकते हैं। –

+0

यदि आप कैमरे को बदलने के लिए उपयोगकर्ता इनपुट का उपयोग करने पर विचार करेंगे तो ऊपर दिए गए मेरे संपादन पर एक नज़र डालें। –

7

आप केवल एक कैमरा है, या आप परवाह नहीं है जो कैमरे सही एक है, तो का उपयोग "-1" सूचकांक के रूप में है। अपने उदाहरण capture = cv.CaptureFromCAM(-1) के लिए अर्थात्।

0

import cvimport cv2.cv as cv करने के लिए परिवर्तन भी पोस्ट here देखें।

68

एक अद्यतन कैसे OpenCV के हाल के संस्करणों में यह करने के लिए दिखाने के लिए:

import cv2 

cv2.namedWindow("preview") 
vc = cv2.VideoCapture(0) 

if vc.isOpened(): # try to get the first frame 
    rval, frame = vc.read() 
else: 
    rval = False 

while rval: 
    cv2.imshow("preview", frame) 
    rval, frame = vc.read() 
    key = cv2.waitKey(20) 
    if key == 27: # exit on ESC 
     break 

cv2.destroyWindow("preview") 
vc.release() 

यह मेरे लिए OpenCV-2.4.2 में काम करता है।

+0

अंत में .. बहुत धन्यवाद –

+4

धन्यवाद। एक सुझाव: थोड़ी देर के बाद, जोड़ें: cv2.destroyWindow ("पूर्वावलोकन") – Luke

+8

एक और सुझाव: थोड़ी देर के बाद, vc.release() जोड़ें। अन्यथा आप प्रक्रिया को मारने के बिना इसे फिर से नहीं चला सकते हैं क्योंकि हैंडल अभी भी खुला है। –

1

निम्नलिखित का प्रयास करें। यह आसान है, लेकिन मैं अभी तक बाहर निकलने के लिए एक सुंदर तरीका खोज निकाला नहीं किया है।

import cv2.cv as cv 
import time 

cv.NamedWindow("camera", 0) 

capture = cv.CaptureFromCAM(0) 

while True: 
    img = cv.QueryFrame(capture) 
    cv.ShowImage("camera", img) 
    if cv.WaitKey(10) == 27: 
     break 
cv.DestroyAllWindows() 
0

में के रूप में opencv-doc आप जो कोड पालन करके अपने कंप्यूटर से जुड़ा है एक कैमरे से वीडियो फ़ीड प्राप्त कर सकते हैं।

import numpy as np 
import cv2 
cap = cv2.VideoCapture(0) 
while(True): 
    # Capture frame-by-frame 
    ret, frame = cap.read() 
    # Our operations on the frame come here 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    # Display the resulting frame 
    cv2.imshow('frame',gray) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 
# When everything done, release the capture 
cap.release() 
cv2.destroyAllWindows() 

आप 2 कैमरे को एक्सेस करने के लिए 10 से cap = cv2.VideoCapture(0) सूचकांक बदल सकते हैं।
opencv-3.2.0