OpenCV: невозможно выполнить потоковую передачу с веб-камеры (встроенная и внешняя Logitech C270)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 OpenCV: невозможно выполнить потоковую передачу с веб-камеры (встроенная и внешняя Logitech C270)

Сообщение Anonymous »

Я пытаюсь проверить, могу ли я транслировать изображение с камеры в OpenCV. У меня к ноутбуку подключены две камеры:
  • Встроенная веб-камера.
  • Внешняя веб-камера Logitech C270.
Обе камеры работают нормально, когда я использую их в VLC или приложении Windows Camera. Однако у меня возникли проблемы с OpenCV:
  • Когда я использую cv2.VideoCapture(0), я получаю сообщение об ошибке:
    Ошибка: не удалось открыть веб-камеру.
  • Когда я использую cv2.VideoCapture(1), я не вижу никаких ошибок, но отображаемый кадр полностью черный. Я подозреваю, что индекс 1 должен быть правильным индексом для моей внешней камеры.
Дополнительно:
  • Когда я запускаю код с индексом 1, внешняя камера становится недоступной в других программах, что имеет смысл, поскольку OpenCV берет на себя управление устройством.
  • Я гарантировал, что Python 3.11 имеет разрешение на доступ к камере в настройках Windows, и индикатор использования камеры подтверждает это что камера используется.
  • Похоже, проблема не связана с VS Code. У меня такое же поведение при запуске скрипта прямо из терминала.
Не могу понять:
  • Почему я не могу получить доступ к встроенной веб-камере (индекс 0).
  • Почему моя внешняя камера (индекс 1) показывает черный экран в OpenCV.
Вот мой код:

Код: Выделить всё

import cv2

def main():
print("Press 'q' to quit the program.")
# Open a connection to the webcam (0 is the default camera)
cap = cv2.VideoCapture(0)

if not cap.isOpened():
print("Error: Could not open webcam.")
return

# Allow the camera to warm up
cv2.waitKey(1000)

while True:
# Capture frame-by-frame
ret, frame = cap.read()

if not ret:
print("Error: Could not read frame.")
break

# Display the resulting frame
cv2.imshow('Webcam Stream', frame)

# Break the loop on 'q' key press
if cv2.waitKey(1) == ord('q'):
break

# When everything is done, release the capture
cap.release()
cv2.destroyAllWindows()

if __name__ == "__main__":
main()
Я был бы признателен за любые советы о том, как отладить или решить эту проблему. Существуют ли дополнительные конфигурации, которые мне следует проверить? Есть ли лучший способ протестировать обе камеры?
Заранее спасибо!
РЕДАКТИРОВАТЬ:
Я попробовал использовать ffmpeg, чтобы получить больше информации о моей камере. Я установил библиотеку Python и запустил следующий скрипт:

Код: Выделить всё

from imageio_ffmpeg import get_ffmpeg_exe
import os

ffmpeg_path = get_ffmpeg_exe()

os.system(f'"{ffmpeg_path}" -list_devices true -f dshow -i dummy')
Я получаю следующий результат:

Код: Выделить всё

[dshow @ 00000211f34a91c0] DirectShow video devices (some may be both video and audio devices)
[dshow @ 00000211f34a91c0]  "Integrated Webcam"
[dshow @ 00000211f34a91c0]     Alternative name "@device_pnp_\\?\usb#vid_0c45&pid_6d13&mi_00#6&18c8350f&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 00000211f34a91c0]  "Logi C270 HD WebCam"
[dshow @ 00000211f34a91c0]     Alternative name "@device_pnp_\\?\usb#vid_046d&pid_0825&mi_00#7&1ef939b1&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 00000211f34a91c0]  "OBS Virtual Camera"
[dshow @ 00000211f34a91c0]     Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\{A3FCE0F5-3493-419F-958A-ABA1250EC20B}"
[dshow @ 00000211f34a91c0] DirectShow audio devices
[dshow @ 00000211f34a91c0]  "Mikrofon (3- Logi C270 HD WebCam)"
[dshow @ 00000211f34a91c0]     Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2839ECB9-3054-4631-9391-CE0C2E6CADD4}"
[dshow @ 00000211f34a91c0]  "Microphone Array (Realtek(R) Audio)"
[dshow @ 00000211f34a91c0]     Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{EC1466BD-0BFF-46FD-960E-B7EAAD2B6787}"
После этого я запускаю следующий скрипт, чтобы получить информацию о режимах камеры:

Код: Выделить всё

import subprocess
from imageio_ffmpeg import get_ffmpeg_exe

def list_camera_modes(camera_name):
ffmpeg_path = get_ffmpeg_exe()

command = f'"{ffmpeg_path}" -f dshow -list_options true -i video="{camera_name}"'
subprocess.run(command, shell=True, check=True)

if __name__ == "__main__":
camera_name = "Logi C270 HD WebCam"
list_camera_modes(camera_name)
И я получаю результат:

Код: Выделить всё

[dshow @ 0000023f579391c0] DirectShow video device options (from video devices)
[dshow @ 0000023f579391c0]  Pin "Capture"  (alternative pin name "0")
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=1280x960 fps=5 max s=1280x960 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=1280x960 fps=5 max s=1280x960 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=1280x720 fps=5 max s=1280x720 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=1280x720 fps=5 max s=1280x720 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=1024x768 fps=5 max s=1024x768 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=1024x768 fps=5 max s=1024x768 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=800x600 fps=5 max s=800x600 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=800x600 fps=5 max s=800x600 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=640x480 fps=5 max s=640x480 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=640x480 fps=5 max s=640x480 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=640x360 fps=5 max s=640x360 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=640x360 fps=5 max s=640x360 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=320x240 fps=5 max s=320x240 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=320x240 fps=5 max s=320x240 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=1280x960 fps=5 max s=1280x960 fps=30
[dshow @ 0000023f579391c0]   vcodec=mjpeg  min s=1280x960 fps=5 max s=1280x960 fps=30
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=1280x960 fps=5 max s=1280x960 fps=5
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=1280x960 fps=5 max s=1280x960 fps=5
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=1280x720 fps=5 max s=1280x720 fps=5
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=1280x720 fps=5 max s=1280x720 fps=5
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=1024x768 fps=5 max s=1024x768 fps=5
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=1024x768 fps=5 max s=1024x768 fps=5
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=800x600 fps=20 max s=800x600 fps=20
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=800x600 fps=20 max s=800x600 fps=20
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=640x480 fps=5 max s=640x480 fps=30
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=640x480 fps=5 max s=640x480 fps=30
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=320x240 fps=30 max s=320x240 fps=30
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=320x240 fps=30 max s=320x240 fps=30
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=1280x960 fps=5 max s=1280x960 fps=5
[dshow @ 0000023f579391c0]   pixel_format=yuyv422  min s=1280x960 fps=5 max s=1280x960 fps=5
Я считаю, что камера должна работать правильно. Я настроил свой скрипт cv2 так, чтобы он соответствовал поддерживаемым режимам моей камеры:

Код: Выделить всё

import cv2

cap = cv2.VideoCapture(1)

width, height = 1280, 960
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)

fps = 30
cap.set(cv2.CAP_PROP_FPS, fps)

cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))

if not cap.isOpened():
print("Kamera konnte nicht geöffnet werden")
else:
print(f"Kamera erfolgreich geöffnet mit {width}x{height} @ {fps} FPS")

while True:
ret, frame = cap.read()
if not ret:
print("Frame konnte nicht gelesen werden")
break

cv2.imshow("Kamera", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):  # 'q' zum Beenden
break

cap.release()
cv2.destroyAllWindows()
Результаты все те же.

Подробнее здесь: https://stackoverflow.com/questions/792 ... itech-c270
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»