Пример, который вы пытались адаптировать, относится к новому интерфейсу Python для OpenCV 2.0. Вероятно, это является причиной путаницы между именами префиксных и нефиксированных функций (cv.cvSetData()
против cv.SetData()
).
OpenCV 2.0 теперь поставляется с двумя наборами привязок Python:
- Оболочка Python "старого стиля" , пакет python с модулями
opencv.{cv,highgui,ml}
- Новый интерфейс , расширение Python C (
cv.pyd
), охватывающее все функциональные возможности OpenCV (включая модули highgui
и ml
.)
Причиной сообщения об ошибке является то, что оболочка SWIG не обрабатывает преобразование строки Python в обычный старый C-буфер. Однако оболочка SWIG поставляется с модулем opencv.adaptors
, который предназначен для поддержки преобразования изображений numpy
и PIL
в OpenCV.
Следующий (проверенный) код должен решить исходную проблему (преобразование из PIL в OpenCV) с использованием интерфейса SWIG:
# PIL to OpenCV using the SWIG wrapper
from opencv import cv, adaptors, highgui
import PIL
pil_img = PIL.Image.open(filename)
cv_img = adaptors.PIL2Ipl(pil_img)
highgui.cvNamedWindow("pil2ipl")
highgui.cvShowImage("pil2ipl", cv_img)
Однако это не решает тот факт, что функция cv.cvSetData()
всегда будет сбоить (с текущей реализацией оболочки SWIG).
Затем вы можете использовать оболочку нового стиля, которая позволяет использовать функцию 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 Code Search , кажется, показывает, что это рабочий метод.
Относительно третьего параметра функции cvSetData()
, размер буфера изображения, но шаг изображения. Шаг - это количество байтов в одной строке вашего изображения, которое составляет pixel_depth * number_of_channels * image_width
. Параметр pixel_depth
- это размер в байтах данных, связанных с одним каналом. В вашем примере это будет просто ширина изображения (только один канал, один байт на пиксель).