Python: как захватить изображение с веб-камеры при нажатии с помощью OpenCV

Я хочу захватить и сохранить несколько изображений с веб-камеры с помощью OpenCV. Это мой код в настоящее время:

import cv2

camera = cv2.VideoCapture(0)
for i in range(10):
    return_value, image = camera.read()
    cv2.imwrite('opencv'+str(i)+'.png', image)
del(camera)

Проблема в том, что я не знаю, когда снимаются изображения, поэтому многие из них в конечном итоге размыты. Мой вопрос: есть ли способ сделать изображение нажатым на клавиатуре?

Также есть лучший способ взять несколько изображений вместо диапазона?

Ответ 1

Вот простая программа, которая отображает канал камеры в cv2.namedWindow и сделает снимок, когда вы нажмете SPACE. Он также завершится, если вы нажмете ESC.

import cv2

cam = cv2.VideoCapture(0)

cv2.namedWindow("test")

img_counter = 0

while True:
    ret, frame = cam.read()
    cv2.imshow("test", frame)
    if not ret:
        break
    k = cv2.waitKey(1)

    if k%256 == 27:
        # ESC pressed
        print("Escape hit, closing...")
        break
    elif k%256 == 32:
        # SPACE pressed
        img_name = "opencv_frame_{}.png".format(img_counter)
        cv2.imwrite(img_name, frame)
        print("{} written!".format(img_name))
        img_counter += 1

cam.release()

cv2.destroyAllWindows()

Я думаю, что это должно ответить на ваш вопрос по большей части. Если есть какая-то строка, которую вы не понимаете, дайте мне знать, и я добавлю комментарии.

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

Обратите внимание, что ключевые события взяты из cv2.namedWindow поэтому он должен иметь фокус.

Ответ 2

я не слишком разбираюсь в open cv, но если вы хотите, чтобы код в цикле for вызывался при нажатии клавиши, вы можете использовать цикл while и raw_input и условие, чтобы предотвратить выполнение цикла навсегда

import cv2

camera = cv2.VideoCapture(0)
i = 0
while i < 10:
    raw_input('Press Enter to capture')
    return_value, image = camera.read()
    cv2.imwrite('opencv'+str(i)+'.png', image)
    i += 1
del(camera)

Ответ 3

Разбивка примера кода

import cv2

импортирует openCV для использования

camera = cv2.VideoCapture(0)

создает объект, называемый камерой, типа видеозахвата openCV, используя первую камеру в списке камер, подключенных к компьютеру.

for i in range(10):

сообщает программе, чтобы закодировать следующий код с отступом 10 раз

    return_value, image = camera.read()

считывайте значения из объекта камеры, используя его метод чтения. он отсылает 2 значения, сохраняя 2 значения данных в две временные переменные, называемые "return_value" и "image",

    cv2.imwrite('opencv'+str(i)+'.png', image)

используйте метод openCV imwrite (который записывает изображение на диск) и записывает изображение, используя данные во временной переменной данных

меньше отступов означает, что цикл закончился...

del(camera)

удаляет объект camrea, нам он больше не нужен.

вы можете запросить во многих отношениях, можно было бы заменить цикл for циклом while (выполняться вечно, а не в 10 раз), а затем ждать нажатия клавиши (например, от ответа danidee во время ввода)

или создать гораздо более злую службу, которая скрывается в фоновом режиме и захватывает изображение каждый раз, когда кто-то нажимает на клавиатуру.

Ответ 4

Вот простая программа для захвата изображения с помощью камеры ноутбука по умолчанию. Я надеюсь, что это будет очень простой способ для всех.

import cv2

# 1.creating a video object
video = cv2.VideoCapture(0) 
# 2. Variable
a = 0
# 3. While loop
while True:
    a = a + 1
    # 4.Create a frame object
    check, frame = video.read()
    # Converting to grayscale
    #gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    # 5.show the frame!
    cv2.imshow("Capturing",frame)
    # 6.for playing 
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
# 7. image saving
showPic = cv2.imwrite("filename.jpg",frame)
print(showPic)
# 8. shutdown the camera
video.release()
cv2.destroyAllWindows 

Вы можете увидеть мой код GitHub здесь

Ответ 5

Как добавить выходное изображение с оттенками серого и binatu изображения в этом исходном коде?