Чёрный вывод изображения с камеры. OpenCV Python

Рейтинг: 1Ответов: 2Опубликовано: 29.01.2023

Камера работает, во всех приложениях показывает, но в окне OpenCV я получаю чёрное изображение с какими-то артефактами. Скрипт самый стандартный:

import numpy as np
import cv2


cap = cv2.VideoCapture(1)

while True:
    ret, frame = cap.read()
    cv2.imshow("Video", frame)
    img_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    if cv2.waitKey(13) & 0xFF == ord('q'):
        # cv2.imwrite('capture.png', frame)
        break


cap.release()
cv2.destroyAllWindows()

Вывод: OpenCV cam output

Ответы

▲ 2

Встретился с такой же проблемой. И самое странное вот что. Если запустить код из файла (python my_code.py), то камера не работает (получаем черную картинку (кстати, она не совсем черная, некоторые пиксели в массиве кадра не равны нулю, но это и у вас видно на кадре). Если же запустить тот же самый код интерактивно, то есть напрямую из интерпретатора, то камера работает корректно! Открываем интерактивный режим: "py" (на винде - только на винде такая проблема и есть) и вставляем туда код, все работает!

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

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

import cv2


cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
while True:
    _, frame = cap.read()
    cv2.imshow('wnd2', frame)
    k = cv2.waitKey(10)
    if k == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

строки

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

использовать не обязательно, но они работают. То есть для этой картинки действительно можно подобрать разные разрешения (если на это способна камера)

▲ 0
  1. вы уверены, что камера доступна по чтению?

    cap = cv.VideoCapture(0) 
      if not cap.isOpened():
          print("Cannot open camera")
          exit()
    
  2. почему стоит 1, а не 0? у вас 2 веб-камеры?

  3. вы уверены. что прочитали кадр с камеры

    while True:
         # Capture frame-by-frame
         ret, frame = cap.read()
         # if frame is read correctly ret is True
         if not ret:
             print("Can't receive frame (stream end?). Exiting ...")
             break