Прямой способ получить скриншот камеры

Я работаю с Python OpenCV над проектом, который в качестве начального шага включает в себя захват изображения с веб-камеры; Я пытался автоматизировать этот процесс с помощью capture = cv2.VideoCapture и capture.read(), но активация видеорежима камеры и ее последующая самонастройка слишком медленны для того, чего я хочу добиться в итоге.

Есть ли более прямой метод автоматического захвата снимка экрана с помощью Python (и OpenCV)? Если нет, есть ли у вас альтернативное предложение? Спасибо


person Eggman    schedule 04.05.2017    source источник
comment
У меня была такая же проблема, но лучшего решения я не нашел.   -  person arsho    schedule 04.05.2017
comment
Если я правильно понял, то, что вы сейчас делаете, это инициализирует захват видео внутри вашей функции скриншота? (capture = cv2.VideoCapture затем capture.read())   -  person Elouarn Laine    schedule 04.05.2017
comment
Именно так, но я хотел знать, есть ли более прямой способ доступа к кадру камеры, но я думаю, что инициализация является необходимым шагом.   -  person Eggman    schedule 04.05.2017
comment
Инициализация @Eggman Camera требует времени и должна выполняться только один раз в начале вашей программы. Пожалуйста, смотрите мой ответ ниже для более подробной информации.   -  person Elouarn Laine    schedule 04.05.2017


Ответы (2)


Если вы хотите, чтобы функция скриншота вашей камеры была отзывчивой, вам нужно инициализировать захват камеры вне этой функции.

В следующем фрагменте кода функция screenshot запускается нажатием c:

import cv2

def screenshot():
    global cam
    cv2.imshow("screenshot", cam.read()[1]) # shows the screenshot directly
    #cv2.imwrite('screenshot.png',cam.read()[1]) # or saves it to disk

if __name__ == '__main__':

    cam = cv2.VideoCapture(0) # initializes video capture

    while True:
        ret, img = cam.read()
        cv2.imshow("cameraFeed", img) # a window is needed as a context for key capturing (here, I display the camera feed, but there could be anything in the window)
        ch = cv2.waitKey(5)
        if ch == 27:
            break
        if ch == ord('c'): # calls screenshot function when 'c' is pressed
            screenshot()

    cv2.destroyAllWindows()

Для уточнения: окно cameraFeed здесь только для целей демонстрации (где screenshot запускается вручную). Если screenshot вызывается в вашей программе автоматически, то эта часть вам не нужна.

Надеюсь, поможет!

person Elouarn Laine    schedule 04.05.2017
comment
global здесь не нужен, так как вы не меняете значение для cam - person Anime no Sekai; 11.02.2021

По сути, вам нужно сделать 3 вещи:

#init the cam
video_capture = cv2.VideoCapture(0)
#get a frame from cam
ret, frame = video_capture.read()
#write that to disk
cv2.imwrite('screenshot.png',frame)

конечно, вы должны подождать некоторое время, иначе вы могли бы сохранить странный черный экран (или просто первое, что получила камера :-))

person ΦXocę 웃 Пepeúpa ツ    schedule 04.05.2017