El ejemplo que intentó adaptar es para la nueva interfaz de Python para OpenCV 2.0. Esta es probablemente la fuente de la confusión entre los nombres de funciones prefijadas y no prefijadas (cv.cvSetData()
versus cv.SetData()
).
OpenCV 2.0 ahora se envía con dos conjuntos de enlaces Python:
- El "old-style" python wrapper, un paquete de pitón con los
opencv.{cv,highgui,ml}
módulos
- El new interface, una extensión pitón C (
cv.pyd
), que envuelve todo el OpenCV funcionalidades (incluyendo los módulos highgui
y ml
.)
la razón detrás del mensaje de error es que la envoltura TRAGO per no maneja la conversión de una cadena de python a un búfer C simple. Sin embargo, el contenedor SWIG viene con el módulo opencv.adaptors
, que está diseñado para admitir las conversiones de las imágenes numpy
y PIL
en OpenCV.
La siguiente (probado) código debe resolver su problema original (conversión de PIL a OpenCV), utilizando la interfaz 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)
Sin embargo, esto no resuelve el hecho de que la función cv.cvSetData()
siempre fallará (con la implementación actual de SWIG wrapper). A continuación, puede utilizar la envoltura de nuevo estilo, que le permite utilizar la función cv.SetData()
como era de esperar:
# 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)
Un tercer enfoque sería la de cambiar la interfaz de OpenCV pitón a la ctypes-based wrapper. Viene con funciones de utilidad para la conversión explícita de datos entre, p. Ej. cadenas de pitón y almacenamientos intermedios de C Una mirada rápida en google code search parece indicar que este es un método de trabajo.
En cuanto al tercer parámetro de la función cvSetData()
, el tamaño del búfer de imagen, pero el paso de la imagen. El paso es la cantidad de bytes en una fila de su imagen, que es pixel_depth * number_of_channels * image_width
. El parámetro pixel_depth
es el tamaño en bytes de los datos asociados a un canal. En su ejemplo, sería simplemente el ancho de la imagen (solo un canal, un byte por píxel).
El código que ha escrito en el anterior tiene un nombre no definido en el mismo (cvSetData), por lo que es Es difícil saber si realmente lo probaste. –
@Jonathan: No entiendo el error que mencionaste. cvSetData es de hecho una función válida definida en opencv.cv – Arkady
¿Cuál es el estado de la respuesta, actualmente? –