2012-02-03 16 views
6

He peinado la web buscando la manera de obtener los enlaces de extracción/descriptor de la característica OpenCV 2.3.1a para escupir cualquier sabor de las características/descripciones de la imagen (STAR ​​/ SURF/ORB/SIFT/RÁPIDO). .. Soy muy consciente de que OpenCV tiene un método llamado "goodFeaturesToTrack Esto no me ayuda ya que no hay descriptores de opción (que es lo que realmente necesito) He seguido la documentación que se enumeran aquí:Detección de características en enlaces de OpenCV Python

http://opencv.itseez.com/modules/features2d/doc/feature_detection_and_description.html

Parece que nada funciona. Probé todos los sabores de descriptores/características. He intentado utilizar imágenes de canal único y múltiple (es decir, color y blanco y negro) y múltiples formatos de imagen (8bit y 32f). trabajó con la distribución actual y compiló los enlaces del repositorio de origen. La mayoría de los métodos dan como resultado un error "desconocido no es un conjunto numpy". Aquí hay un ejemplo:

SimpleCV:1>import cv2 
SimpleCV:2>img = Image("aerospace.jpg") 
SimpleCV:3>bwimg = img._getGrayscaleBitmap() 
SimpleCV:4>bwimg 
SimpleCV:4><iplimage(nChannels=1 width=600 height=400 widthStep=600)> 
SimpleCV:5>surfer = cv2.SURF(0.5,4,2,False,False) 
SimpleCV:6>points = surfer.detect(bwimg,None) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 

/Library/Python/2.6/site-packages/SimpleCV-1.2-py2.6.egg/SimpleCV/Shell/Shell.pyc in <module>() 
- 

TypeError: <unknown> is not a numpy array 
SimpleCV:7> 

Vale la pena señalar que estoy usando SimpleCV para cargar la imagen, pero el método _getGrayscaleBitmap() devuelve la imagen gris de 8 bits IPL utilizada por OpenCV. Estoy seguro de que esto funciona como lo uso con cientos de otros métodos de OpenCV sin incidencia.

Entonces, ¿alguien puede indicarme un ejemplo de este código en la web WORKING? He revisado docenas de ejemplos y no he encontrado nada que funcione.

+0

Por lo que vale, envié este ticket a Willow Garage, pero me encantaría encontrar una solución lo antes posible. https://code.ros.org/trac/opencv/ticket/1582 – kscottz

Respuesta

10

Kat, esto funciona para mí:

s = cv2.SURF() 
mask = uint8(ones(gray.shape)) 
keypoints = s.detect(gray,mask) 

que pueden representar los puntos clave y todos. Para obtener los descriptores puede probar esta

k,d = s.detect(gray,mask,False) 
d = d.reshape((-1,128)) 
print d.shape, len(k) 

d debe tener la misma longitud en la lista de puntos clave.

que tienen este ejemplo en el capítulo OpenCV aquí: http://www.maths.lth.se/matematiklth/personal/solem/book.html

+1

Sigue recibiendo el error. ¿Puedes hacerme un favor y decirme el tipo de imagen gris? parece una matriz numpy. ¿Los tipos de imagen cvMat e IPL no funcionan? – kscottz

+0

bien de SimpleCV esto parece que va a trabajar: gris = uint8 (. Np.array (cv.GetMat (img._getGrayscaleBitmap())) transponer()) Me llevará un día o más para hacer una prueba de concepto. – kscottz

+0

Sí, es una matriz nude uint8. Las encuadernaciones cv2 python necesitan algo de trabajo, la mayoría de las características aún no parecen estar implementadas. –

0

Parece que tienes una imagen de PIL. Intente convertir a una imagen numpy: npImage = np.array (img)