Как я создаю изображение OpenCV из изображения PIL?

Запишите фактический класс экрана-заставки.

Вот свободно применимый экран-заставка, который я недавно отправил в своем iPhone в блоге Действия: http://iphoneinaction.manning.com/iphone_in_action/2009/03/creating-a-splash-screen-part-one.html

12
задан Arkady 30 October 2009 в 17:52
поделиться

2 ответа

Пример, который вы пытались адаптировать, относится к новому интерфейсу 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-буфер. Однако, Затем вы можете использовать оболочку нового стиля, которая позволяет использовать функцию 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 - это размер в байтах данных, связанных с одним каналом. В вашем примере

9
ответ дан 2 December 2019 в 20:18
поделиться

Очень сложно иметь и 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.

4
ответ дан 2 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: