2010-04-08 14 views
53

I starali się stworzyć prosty program, który korzysta z Python OpenCV dostać kanał wideo z kamery internetowej i wyświetla go na ekranie.Wyświetlanie kanału kamery za pomocą OpenCV i Python

wiem, że jestem częściowo tam, ponieważ jest tworzony przez okno i światłem na mojej kamery na kino, ale po prostu nie wydaje się, aby zobaczyć coś w oknie. Mam nadzieję, że ktoś może wyjaśnić, co robię źle.

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() 

Na niepowiązanych notatki, zauważyłem, że moja kamera czasami zmienia swój numer indeksu w cv.CaptureFromCAM, a czasem muszę umieścić w 0, 1 lub 2, chociaż ja jedna kamera podłączona tylko i I haven” t wyłączyło wtyczkę (wiem, ponieważ lampka nie zapala się, chyba że zmienię indeks). Czy istnieje sposób, aby Python mógł ustalić poprawny indeks?

+0

Miałem ten problem kilka miesięcy temu ... pozwól mi wyśledzić moje rozwiązanie problemu. –

Odpowiedz

41

spróbuj dodać linię c = cv.WaitKey(10) na dole metody repeat().

To czeka 10 ms, aby użytkownik mógł wprowadzić klucz. Nawet jeśli w ogóle nie używasz klucza, wstaw to. Myślę, że wystarczyło trochę opóźnienia, więc może również zadziałać time.sleep(10).

W odniesieniu do wskaźnika kamery, można zrobić coś takiego:

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

ten znajdzie indeks pierwszego „roboczy” urządzenia przechwytującego, przynajmniej dla indeksów od 0-2. Możliwe, że w Twoim komputerze rozpoznano wiele urządzeń jako właściwe urządzenie do przechwytywania. Jedynym sposobem, jaki znam, aby potwierdzić, że masz właściwy, jest ręczne patrzenie na twoje światło. Może uzyskać obraz i sprawdzić jego właściwości?

Aby dodać wiersz do obsługi procesu, można powiązać przycisk do przełączania kamer w powtarzania pętli:

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() 

Disclaimer: Nie testowałem tego, więc może zawierać błędy lub po prostu nie działają , ale może dać ci przynajmniej pomysł obejścia tego problemu.

+0

że jedna mała linia kodu zadziałała! Dzięki wielkie. jednak kod indeksu kamery nie działał, niezależnie od tego, jakie urządzenie widzi w indeksie 0 nadal zwraca wartość true i zrywa pętlę for. to musi być powód, dla którego tak wiele przykładów pokazuję tylko czarny ekran. czy jest jakiś sposób, aby ustalić, co jest w indeksie 0, więc mogę go wyłączyć? lub alternatywnie zmienić kamerę na 0? – Mitch

+0

hmm, nie jestem pewien, czy jest prosty sposób na zrobienie tego. zamiast po prostu sprawdzać, czy przechwytywanie nie jest typem Nonetype, możesz napisać bardziej skomplikowany kod, aby wysłać zapytanie do ramki i sprawdzić, czy ramka jest "cała czarna", być może losowo próbkując w niej kilka pikseli. Myślę, że lepiej jest po prostu podać monit, który pokazuje ramkę i pyta użytkownika, czy chce tego aparatu lub spróbować następnego. –

+0

Zapoznaj się z powyższą zmianą, jeśli rozważasz użycie danych wprowadzanych przez użytkownika w celu zmiany aparatów. –

7

Jeśli masz tylko jedną kamerę, lub nie obchodzi, która kamera jest prawidłowa, a następnie użyć „-1” w indeksie. Tj. Na przykład capture = cv.CaptureFromCAM(-1).

0

zmiana import cv do import cv2.cv as cv Zobacz także stanowisko here.

68

Aktualizacja, aby pokazać, jak to zrobić w ostatnich wersjach 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() 

Działa w OpenCV-2.4.2 dla mnie.

+0

Wreszcie .. wielkie dzięki. –

+4

Dzięki. Jedna sugestia: po pętli while dodaj: cv2.destroyWindow ("preview") – Luke

+8

Kolejna sugestia: po pętli while dodaj vc.release(). W przeciwnym razie nie można go uruchomić ponownie bez zabicia procesu, ponieważ uchwyt jest nadal otwarty. –

1

Spróbuj wykonać następujące czynności. To proste, ale nie wymyśliłem jeszcze pełnego wdzięku sposobu na wyjście.

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

Jak w opencv-doc można uzyskać strumienia wideo z kamery, który jest podłączony do komputera, wykonując kod.

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() 

można zmienić cap = cv2.VideoCapture(0) indeks z 0 do 1 dostęp do 2nd aparatu.
Testowany w opencv-3.2.0

Powiązane problemy