Я пытался создать простую программу с 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 даже при том, что мне только подключили одну камеру, и я не отключил ее (я знаю, потому что свет не продвигается, если я не изменяю индекс). Существует ли способ заставить Python определять корректный индекс?
Попробуйте добавить строку 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()
отказ от ответственности: я не тестировал это, поэтому в нем могут быть ошибки или просто не работает, но может дать вам хотя бы представление об обходном пути.