![](/img/trans.png)
[英]Superimposing image over webcam feed using OpenCV 2.4.7.0 in Python 2.7
[英]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.