Запишите фактический класс экрана-заставки.
Вот свободно применимый экран-заставка, который я недавно отправил в своем iPhone в блоге Действия: http://iphoneinaction.manning.com/iphone_in_action/2009/03/creating-a-splash-screen-part-one.html
Пример, который вы пытались адаптировать, относится к новому интерфейсу python для OpenCV 2.0. Вероятно, это источник путаницы между именами функций с префиксом и без префикса ( cv.cvSetData ()
по сравнению с cv.SetData ()
).
OpenCV 2.0 теперь поставляется с двумя наборами привязок python:
opencv. {Cv, highgui, ml}
модули cv.pyd
), которое включает все функции OpenCV (включая highgui
и ml
модулей.) Причина сообщения об ошибке заключается в том, что оболочка SWIG не обрабатывает преобразование из строки Python в обычный C-буфер. Однако,
Затем вы можете использовать оболочку нового стиля, которая позволяет использовать функцию cv.SetData ()
, как и следовало ожидать:
# PIL to OpenCV using the new wrapper
import cv
import PIL
pil_img = PIL.Image.open(filename)
cv_img = cv.CreateImageHeader(pil_img.size, cv.IPL_DEPTH_8U, 3) # RGB image
cv.SetData(cv_img, pil_img.tostring(), pil_img.size[0]*3)
cv.NamedWindow("pil2ipl")
cv.ShowImage("pil2ipl", cv_img)
Третий подход - переключить ваш интерфейс Python OpenCV на оболочка на основе ctypes . Он поставляется с служебными функциями для явного преобразования данных между, например, строками Python и буферами C. Быстрый взгляд на поиск кода Google , кажется, указывает на то, что это рабочий метод.
Что касается третьего параметра функции cvSetData ()
, размера буфера изображения, но шаг изображения. Шаг - это количество байтов в одной строке вашего изображения, которое составляет глубина_пикселя * число_каналов * ширина_изображения
. Параметр pixel_depth
- это размер в байтах данных, связанных с одним каналом. В вашем примере
Очень сложно иметь и swig, и новую привязку python. Например, в OpenCV 2.0 cmake может принимать как BUILD_SWIG_PYTHON_SUPPORT, так и BUILD_NEW_PYTHON_SUPPORT. Но, в любом случае, я как бы разобрался с большинством подводных камней.
В случае использования «import cv» (новая привязка Python) требуется еще один шаг.
cv.SetData(cv_img, pil_img.tostring(), pil_img.size[0]*3)
cv.CvtColor(cv_img, cv_img, cv.CV_RGB2BGR)
Преобразование необходимо для изображений RGB, потому что последовательность отличается в PIL и IplImage. То же самое относится к Ipl к PIL.
Но если вы используете opencv.adaptors, об этом уже позаботились. Если интересно, вы можете изучить детали в adaptors.py.