¿Cómo procesar la imagen con opencv en python?

Quiero usar algoritmos de detección de bordes de la biblioteca opencv. Aquí hay un pedazo de código de python:

from opencv.cv import * from opencv.highgui import * img = cvLoadImage ('xxx.jpg') cvNamedWindow ('img') cvShowImage ('img', img) cvWaitKey () canny = cvCreateImage (cvSize (img.width, img.height), 8, 3) cvCanny (img, canny, 50, 200) harris = cvCreateImage (cvSize (img.width, img.height), 8, 3) cvCornerHarris (img, harris, 5, 5, 0.1) 

Cargar y mostrar la imagen funciona bien, pero fallan las transformaciones de canny y harris.
cvCanny falla con:

 RuntimeError: openCV Error: Status=Unsupported format or combination of formats function name=cvCanny error message= file_name=cv/cvcanny.cpp line=72 

y cvCornerHarris falla con este error:

 RuntimeError: openCV Error: Status=Assertion failed function name=cvCornerHarris error message=src.size() == dst.size() && dst.type() == CV_32FC1 file_name=cv/cvcorner.cpp line=370 

De estos mensajes puedo inferir que la imagen cargada tiene un formato inválido. Pero no entiendo cómo convertirlo.
Aquí están los valores de algunos campos img :

 img.type = 1111638032 img.nChannels = 3 img.depth = 8 

Aquí está el código fijo. Ver comentarios en línea. Larga historia corta: sus tipos de datos eran incorrectos. Lee la API .

 try: from opencv.cv import * from opencv.highgui import * except: # # Different OpenCV installs name their packages differently. # from cv import * if __name__ == '__main__': import sys # # 1 = Force the image to be loaded as RGB # img = LoadImage (sys.argv[1], 1) NamedWindow ('img') ShowImage ('img', img) WaitKey () # # Canny and Harris expect grayscale (8-bit) input. # Convert the image to grayscale. This is a two-step process: # 1. Convert to 3-channel YCbCr image # 2. Throw away the chroma (Cb, Cr) and keep the luma (Y) # yuv = CreateImage(GetSize(img), 8, 3) gray = CreateImage(GetSize(img), 8, 1) CvtColor(img, yuv, CV_BGR2YCrCb) Split(yuv, gray, None, None, None) canny = CreateImage(GetSize(img), 8, 1) Canny(gray, canny, 50, 200) NamedWindow ('canny') ShowImage ('canny', canny) WaitKey() # # The Harris output must be 32-bit float. # harris = CreateImage (GetSize(img), IPL_DEPTH_32F, 1) CornerHarris(gray, harris, 5, 5, 0.1) 

Para otras personas interesadas en el mismo tipo de problema, recomiendo visitar http://simplecv.org

Aquí hay un poco de código que escribí para detectar la línea en una imagen obtenida de una cámara web. Incluso se mostrará la imagen a través de http. detección de barba

 import SimpleCV import time c = SimpleCV.Camera(1) js = SimpleCV.JpegStreamer() while(1): img = c.getImage() img = img.smooth() lines = img.findLines(threshold=25,minlinelength=20,maxlinegap=20) [line.draw(color=(255,0,0)) for line in lines] #find the avg length of the lines sum = 0 for line in lines: sum = line.length() + sum if sum: print sum / len(lines) else: print "No lines found!" img.save(js.framebuffer) time.sleep(0.1) 

Echa un vistazo al proyecto para el que hice esto en http://labs.radiantmachines.com/beard/ . Detectará cuánto tiempo dura la barba del cuello 🙂

Puede convertir una imagen a escala de grises en un solo paso en lugar de dos:

 gray = cv.CreateMat(img.height, img.width, cv.CV_8UC1) cv.CvtColor(img, gray, cv.CV_BGR2GRAY)