opencv getImage() ошибка

Сегодня я завернул opencv интерфейсом python simplecv. Пройдя официальную поваренную книгу SimpleCV, я смог успешно загружать, сохранять и манипулировать изображениями. Таким образом, я знаю, что библиотека загружается правильно.

Однако под заголовком " Использование камеры, Kinect или виртуальной камеры" мне не удалось выполнить некоторые команды. Особенно, mycam = Camera() работал, но img = mycam.getImage() выдал следующую ошибку:

In [35]: img = mycam.getImage().save()
OpenCV Error: Bad argument (Array should be CvMat or IplImage) in cvGetSize, file /home/jordan/OpenCV-2.2.0/modules/core/src/array.cpp, line 1237
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)

/home/simplecv/<ipython console> in <module>()

/usr/local/lib/python2.7/dist-packages/SimpleCV-1.1-py2.7.egg/SimpleCV/Camera.pyc in getImage(self)
    332 
    333         frame = cv.RetrieveFrame(self.capture)
--> 334         newimg = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 3)
    335         cv.Copy(frame, newimg)
    336         return Image(newimg, self)

error: Array should be CvMat or IplImage

Я использую Ubuntu Natty на планшете HP TX2500. Он имеет встроенную веб-камеру (CyberLink Youcam?) Кто-нибудь видел эту ошибку раньше? Сегодня я был в Интернете в поисках решения, но, похоже, ничего не помогло.

Обновление 1: я протестировал cv.QueryFrame(capture), используя код, найденный здесь в отдельном вопросе о переполнении стека, и это сработало; таким образом, я в значительной степени прибил это к проблеме веб-камеры.

Обновление 2: На самом деле, я получаю те же самые ошибки на машине, у которой даже нет веб-камеры! Похоже, TX2500 не совместим...

5 ответов

Решение

Чтобы ответить на мой собственный вопрос...

Я купил Logitech C210 сегодня, и проблема исчезла. Теперь я получаю предупреждения:

Corrupt JPEG data: X extraneous bytes before marker 0xYY,

Тем не менее, я могу успешно передать видео поток в мой веб-браузер через JpegStreamer(), Если я не смогу решить эту ошибку, я открою новую тему.

Таким образом, пока я буду винить TX2500. Если кто-то найдет решение в будущем, пожалуйста, напишите.

Реквизит @HYRY для расследования. Благодарю.

Поскольку ошибка возникла из Camera.py в SimpleCV, вам необходимо отладить метод getImage(). Если вы можете редактировать это:

def getImage(self):
    if (not self.threaded):
        cv.GrabFrame(self.capture)

    frame = cv.RetrieveFrame(self.capture)
    import pdb       # <-- add this line
    pdb.set_trace()  # <-- add this line
    newimg = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 3)
    cv.Copy(frame, newimg)
    return Image(newimg, self)

затем запустите вашу программу, она будет приостановлена ​​как pdb.set_trace(), здесь вы можете проверить тип фрейма и попытаться выяснить, как получить размер фрейма.

Или вы можете сделать захват в вашем коде и проверить объект фрейма:

mycam = Camera()
cv.GrabFrame(mycam.capture)
frame = cv.RetrieveFrame(mycam.capture)

Я получаю камеру с OpenCV

from opencv import cv
from opencv import highgui
from opencv import adaptors

def get_image()
    cam = highgui.cvCreateCameraCapture(0)
    im = highgui.cvQueryFrame(cam)
    # Add the line below if you need it (Ubuntu 8.04+)
    #im = opencv.cvGetMat(im)
    return im

Энтони, один из разработчиков SimpleCV здесь.

Также вместо использования image.save() эта функция записывает файл / видео на диск, вместо этого вы, вероятно, захотите использовать image.show(). Вы можете сохранить, если хотите, но вам нужно указать путь к файлу, например image.save("/tmp/blah.png")

Итак, вы хотите сделать:

img = mycam.getImage()
img.show()

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

Также я должен упомянуть, что я не осознавал, что OpenCV менее 2.3 не работает с веб-камерами на Ubuntu 11.04 и выше. Я не осознавал этого, так как работал на Ubuntu 10.10 раньше, судя по вашему выводу, вы используете python 2.7, что заставляет меня думать, что вы работаете в Ubuntu 11.04 или выше. Во всяком случае, у нас есть решение этой проблемы. Теперь он помещается в мастер, в основном он проверяет, работает ли OpenCV, если нет, то возвращается к Pygame.

Это исправление также будет в версии 1.2 SimpleCV (теперь она в основной ветке)

Другие вопросы по тегам