Ошибка IplImage «Нет» в CaptureFromFile () — Python 2.7.1 и OpenCV 2.2 WinXP

Я без проблем запускаю Python2.7.1 и OpenCV 2.2 на своем ноутбуке с WinXP и написал программу отслеживания, которая работает без сбоев. Но по какой-то странной причине я не могу запустить ту же программу на любом другом компьютере, где я пытался установить OpenCV и Python (используя те же двоичные файлы или соответствующие 64-битные двоичные файлы). На этих компьютерах OpenCV, кажется, правильно установлен (хотя я тестировал только CaptureFromCamera() в веб-камере ноутбука), но CaptureFromFile() возвращает «Нет» и выдает «ошибка: массив должен быть CvMat или IplImage» после QueryFrame , Например.

Этот простой код:

import cv /
видеофайл = cv.CaptureFromFile('a.avi') /
кадр = cv.QueryFrame(видеофайл) /
тип печати (видеофайл) /
тип печати (кадр)

возвращает:

введите 'cv.Capture' /
введите 'NoneType'

  • OpenCV и Python находятся в окнах PATH...
  • Я переместил содержимое пакетов сайтов OpenCV туда и обратно в папку Pyhton27 Lib\Site-packages.
  • Я пробовал разные avi-файлы (на случай, если проблема с кодеком). Этот AVI использует кодировку MJPEG (и GSpot сообщает, что для чтения используется ffdshow Video Decoder).
  • Изображения работают нормально (я думаю): простой код преобразования: im = cv.LoadImageM("c:\tests\colormap3.tif") cv.SaveImage("c:\tests\colormap3-out.png", im) открывается , преобразует и сохраняет новое изображение...
  • Я протестировал файлы AVI в разных папках, используя «c:\», «c:/», «c:\» и «c://».

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


person vag_porto    schedule 02.05.2011    source источник


Ответы (3)


Это может показаться глупым, но у меня была такая же проблема с теми же симптомами для того же фрагмента кода (Python 2.7.1, Win 7, OpenCV 2.2.0). Я изменил путь к файлу с

capture = cv.CaptureFromFile('C:\Misc\tree.avi')

to

capture = cv.CaptureFromFile('C:/Misc/tree.avi')

и вуаля

<type 'cv.Capture'>
<type 'cv.iplimage'>
person ilya    schedule 03.06.2011
comment
Илья: спасибо за предложение, но проблема не в этом. Я знаю, что иногда изменение с / на \ или даже на \\ или // решает проблемы с путями, и я пробовал их все. Это определенно проблема кодека: если я конвертирую видео в необработанный YUV, программа работает. - person vag_porto; 20.06.2011

У меня была эта проблема, и вот как я ее исправил. Я взглянул на вывод команды OpenCV cmake, и в ней была следующая строка:

...
--     FFMPEG:                     NO
...

Чтобы исправить это, вы можете просто установить следующие библиотеки:

sudo apt-get install libavformat-dev libavcodec-dev libavfilter-dev libswscale-dev

Будем надеяться, что повторный запуск cmake теперь скажет:

...
--     FFMPEG:                     YES
...

Перекомпилируйте OpenCV, переустановите его, и, надеюсь, теперь вы сможете читать видео. Если у вас все еще есть проблемы, вы можете попробовать скомпилировать ffmpeg, используя параметр --enable-shared, используя их в качестве руководств:

http://opencv.willowgarage.com/wiki/FFMPEG
http://ubuntuforums.org/showthread.php?t=786095

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

person DrPython    schedule 27.09.2011

Это должно быть проблемой с кодеками по умолчанию. OpenCV использует методы грубой силы для открытия видеофайлов или захвата с камеры. Он проходит методом проб и ошибок через все источники/кодеки/apis, которые он может найти в некотором разумном порядке. (по крайней мере, 1,1 сделали это). Это означает, что в n разных системах (или днях) у вас может быть n разных способов доступа к одному и тому же видео. Например, порядок нескольких веб-камер также недетерминирован и может зависеть от порядка подключения или бабочек.

Узнайте, что использует ваш ноутбук, (пере)установите это на всех системах и повторите попытку. Кроме того, в версии c вы можете просмотреть свойства захвата и найти cvGetCaptureProperty и cvSetCaptureProperty, где вы можете намекнуть на формат.

[EDIT] Только что посмотрел в документации, эти функции также доступны в Python. Посмотри, должно помочь.

person AndreasT    schedule 02.05.2011
comment
AndreasT: Спасибо за подсказку (я также подозреваю, что это где-то несовместимость с ffdshow); однако функции CaptureProperties не работают, потому что захват не инициализирован (объект создается, но остается пустым)... Но это не проблема с кодировкой самого файла, потому что ни один файл не работает - даже дерево по умолчанию.avi файл примеров OpenCV. - person vag_porto; 02.05.2011