Захватить фрейм NTSCtoUSB ключ, opencv2, оболочка Python
Контекст:
Я играл с оболочкой Python для opencv2. Я хотел поиграть с несколькими идеями и использовать широкоугольную камеру, похожую на камеры заднего вида в автомобилях. Я получил один из сломанного аварийного автомобиля (у него было 4 провода). Я сделал обоснованное предположение по цветовой кодировке проводов, подключил его так, чтобы я питал линию электропитания и заземления от usb типа A и питал NTSC композитный + композитный - от разъем RCA. Я купил конвертер NTSC в USB, как этот.
Он поставляется с драйверами и некоторым программным обеспечением VHStoDVD.
эта проблема:
Для пробного тестирования я использовал онлайн-тесты примеров:
import numpy as np
import cv2
cam_index=0
cap=cv2.VideoCapture(cam_index)
print cap.isOpened()
ret, frame=cap.read()
#print frame.shape[0]
#print frame.shape[1]
while (cap.isOpened()):
ret, frame=cap.read()
#gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#release and close
cap.release()
cv2.destroyAllWindows()
это вывод из оболочки:
True
Traceback (most recent call last):
File "C:/../cam_capture_.py", line 19, in <module>
cv2.imshow('frame', frame)
error: ..\..\..\..\opencv\modules\highgui\src\window.cpp:261: error: (-215) size.width>0 && size.height>0 in function cv::imshow
>>>
Ключевые наблюдения:
на панели управления USB-ключ отображается как "OEM-захват" в контроллерах Sound Video & Game. Так что это не просто веб-камера "подключи и работай" в разделе "Устройства обработки изображений".
Если я открываю программное обеспечение VHStoDVD, мне нужно настроить 2 аспекта:
- установить как композитный
- установите enconding как NTSC, тогда подача камеры с аналоговой камеры будет отображаться нормально в приложении VHStoDVD
Когда я открываю устройство видео канала в FLV (устройство захвата). Поток устройства - это просто черный экран, но ЕСЛИ я открываю программное обеспечение VHStoDVD, пока FLV выполняет потоковую передачу, я получаю видео с камеры для потоковой передачи на FLV, а черный экран отображается на канале VHStoDVD. Еще одно важное отличие заключается в том, что при подаче в FLV подача составляет около 0,5 с, а не в VHStoDVD.
При запуске "cam_capture.py" в соответствии с приведенным выше примером кода в некоторых местах во время выполнения я в конечном итоге получу код ошибки остановки 0x0000008e:
деталь:
stop: 0x0000008E (0xC0000005, 0xB8B5F417, 0X9DC979F4, 0X00000000 )
ks.sys - Address B8B5F417 base at B8B5900, Datestamp...
beg mem dump
phy mem dump complete
5.Если я пытаюсь напечатать frame.shape[0] или frame.shape[1] я получаю сообщение об ошибке типа, например, я не могу напечатать тип None
6. если попробуйте другой cam_index, результат всегда ложный
TLDR:
В "панели управления" устройство камеры находится под "звуковыми видео и игровыми контроллерами", а не под "устройствами отображения";
Cam_index== ноль;
Capture.isOpened()=True;
Размер кадра Нет;
Если VHStoDVD работает с настроенным композитным NTSC, камера работает, очевидно, вы не можете видеть изображение с экраном печати во вложении, но поверьте мне!;)
Существует ли какая-либо форма инициализации начала связи с ключом, которая могла бы это исправить, т.е. эмулировать настройки VHStoDVD (композитный +NTSC)? Я думал, что смогу сгладить начало связи между VHStoDVD и ключом, но я чувствую, что я иду выше и дальше, чтобы сделать что-то, что я думал, было ключевым поворотным решением.
Любые конструктивные идеи, предложения, исправления приветствуются!
Спасибо
ура
3 ответа
Итак, после более глубокого расследования первоначальное подозрение подтвердилось, т. Е. Потому что ключ NTSC не обрабатывается как устройство формирования изображения (он рассматривается как видеоконтроллер, так похож на эмуляцию карты ТВ-тюнера), это означает, что, хотя мы можем вызовите cv2.VideoCapture с cam_index=0, сам видео канал не передает, потому что мы должны определить группу параметров
- кодирование
- Размер рамки
- частота кадров и т. д.
Проблема заключается в том, что устройство не поддерживается как устройство обработки изображений, вызывающее cv2.VideoCapture.set (параметр, значение), по-видимому, ничего не меняет в исходной видеопотоке.
Я не нашел решения, но я нашел обходной путь. Там, кажется, довольно много вариантов в Интернете. Поиск по ключевым словам DV для веб-камеры или видеокамеры в качестве веб-камеры.
Я использовал DVdriver ( http://www.trackerpod.com/TCamWeb/download.htm) (я использовал пробную версию, потому что я дешевый!).
Почему это работает?
Насколько я могу сказать, DVdriver получает данные от устройства, которое установлено в качестве видеоконтроллера (аналогично записи из "Windows Movie Maker" или ffmpeg), а затем через "fairydust" выводит кадры с cam_index=0 (предполагается, что нет подключена другая камера) в качестве веб-камеры "устройства обработки изображений".
Резюме
TLDR использует DVdriver или аналогичный.
Я нашел обходной путь, но мне бы очень хотелось понять его из первых принципов и, возможно, сгенерировать аналогичную инициализацию ключа NTSC изнутри python, без каких-либо других программных зависимостей, но до тех пор, надеюсь, это поможет другим, кто также боролся или предполагал его была аппаратная проблема.
Теперь я оставлю тебя с Беккетом: когда-нибудь пытался. Всегда не удалось. Независимо от того. Попробуйте снова. Снова провал. Сбой лучше. (!)
Уже несколько месяцев, но может быть полезно. Я работал на компьютере с Windows и установил драйверы, которые поставлялись вместе с устройством, я попробовал тот же код, что и ваш вопрос, с Ezcap от Somagic и получил ту же ошибку. Поскольку "frame is None", я решил попробовать оператор if вокруг него - на случай, если это была ошибка инициализации. Размещение в петле:
if frame is None:
print 0
else:
print 1
Результат: 01110111111111111111111111111...
И если frame = cap.read(), над циклом закомментировано - получаю: 00111111111111111...
Так что для моего устройства захвата устройства, кажется, работает для всех кадров, кроме 5-го захвата. Я не уверен, почему это так, но сейчас это может быть полезным.
Отказ от ответственности: К сожалению, мой вход камеры в настоящее время находится в поле излучения, поэтому я не могу добраться до него пару недель, чтобы убедиться, что он работает точно. Однако в настоящее время изображения представляют собой черную рамку (что ожидается без правильного ввода).
Я столкнулся с той же проблемой. В качестве обходного пути я сначала попробовал решение, предложенное @user3380927, и оно действительно сработало. Но так как я не хотел полагаться на внешнее программное обеспечение, я начал настраивать параметры, используя opencv в Python.
Эти строки кода работали как талисман (вы должны вставить их перед первым чтением фрейма):
cam.set(cv2.CAP_FFMPEG,True)
cam.set(cv2.CAP_PROP_FPS,30)
Итак, полный код для основного чтения камеры выглядит следующим образом:
import cv2
cam = cv2.VideoCapture(1)
cam.set(cv2.CAP_FFMPEG,True)
cam.set(cv2.CAP_PROP_FPS,30)
while(True):
ret,frame = cam.read()
cv2.imshow('frame',frame)
if (cv2.waitKey(1) & 0xFF == ord('q')):
break
cam.release()
cv2.destroyAllWindows()
Затем вы можете применить операции обработки изображений как обычно. Просто для справки, это была моя конфигурация:
- Opencv 3.1.0
- Python 2.7.5
- Windows 8.1
- Устройство Elgato Video Capture (также показывалось как контроллеры Sound Video & Game)