Отображение использования канала веб-камеры OpenCV и Python

Я пытался создать простую программу с 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 определять корректный индекс?

55
задан Peter Mortensen 27 January 2015 в 10:22
поделиться

1 ответ

Попробуйте добавить строку 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()

отказ от ответственности: я не тестировал это, поэтому в нем могут быть ошибки или просто не работает, но может дать вам хотя бы представление об обходном пути.

41
ответ дан 7 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: