簡體   English   中英

使用 OpenCV 和 Python 顯示網絡攝像頭源

[英]Displaying a webcam feed using OpenCV and Python

我一直在嘗試使用 Python 創建一個簡單的程序,它使用OpenCV從我的網絡攝像頭獲取視頻源並將其顯示在屏幕上。

我知道我在那里的部分原因是創建了 window 並且我的網絡攝像頭上的燈閃爍,但它似乎在 window 中沒有顯示任何內容。 希望有人可以解釋我做錯了什么。

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,即使我只連接了一個攝像頭並且我沒有拔下它(我知道,因為除非我更改索引,否則燈不會亮起)。 有沒有辦法讓 Python 確定正確的索引?

更新以顯示如何在最新版本的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。

嘗試在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()

免責聲明:我沒有對此進行過測試,因此它可能存在錯誤或只是不起作用,但可能至少會讓您了解一種解決方法。

如果您只有一台攝像機,或者您不關心哪台攝像機是正確的攝像機,則使用“-1”作為索引。 即你的例子capture = cv.CaptureFromCAM(-1)

import cv更改import cv2.cv as cv請參見此處的帖子。

請嘗試以下方法。 這很簡單,但我還沒有想出一個優雅的退出方式。

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

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

您可以將cap = cv2.VideoCapture(0)索引從0更改為1以訪問第二個攝像頭。
opencv-3.2.0測試過

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM