python performance opencv computer-vision

Comparación de rendimiento de las interfaces OpenCV-Python, cv y cv2



performance computer-vision (1)

La imagen devuelta por cv2.imread () es un objeto de matriz de NumPy. Entonces puede usar las funciones de NumPy para acelerar el cálculo.

El siguiente programa muestra cómo acelerar su origen para la versión de bucle utilizando el método item (), itemset () del objeto ndarray.

import time import numpy as np import cv2 gray = cv2.imread(''lena_full.jpg'',0) height, width = gray.shape h = np.empty((height,width,3), np.uint8) t = time.time() for i in xrange(height): for j in xrange(width): k = gray.item(i, j) if k == 127: h.itemset(i, j, 0, 255) h.itemset(i, j, 1, 255) h.itemset(i, j, 2, 255) elif k > 127: h.itemset(i, j, 0, 0) h.itemset(i, j, 1, 0) h.itemset(i, j, 2, 255-k) else: h.itemset(i, j, 0, k) h.itemset(i, j, 1, 0) h.itemset(i, j, 2, 0) print time.time()-t

Y el siguiente programa muestra cómo crear primero la paleta y usar el índice de matriz de NumPy para obtener el resultado:

t = time.time() palette = [] for i in xrange(256): if i == 127: palette.append((255, 255, 255)) elif i > 127: palette.append((0,0,255-i)) else: palette.append((i, 0, 0)) palette = np.array(palette, np.uint8) h2 = palette[gray] print time.time() - t print np.all(h==h2)

El resultado es:

0.453000068665 0.0309998989105 True

La salida de la versión cv es:

0.468999862671

Nota: la longitud del eje 0 es la altura de la imagen, la longitud del eje 1 es el ancho de la imagen

Hace unos días, comencé a usar la nueva interfaz OpenCV-Python, cv2 .

Mi pregunta es sobre la comparación de la interfaz cv y cv2 .

En cuanto a la facilidad de uso, la nueva interfaz cv2 ha mejorado mucho más, y es muy fácil y divertido trabajar con cv2 .

¿Pero qué hay de la velocidad?

Hice dos pequeños snipplets de código, uno en cv y otro en cv2 , para verificar las actuaciones. Ambos hacen la misma función, acceden a los píxeles de una imagen, la prueban, hacen algunas modificaciones, etc.

A continuación está el código:

cv2 interface :

import time import numpy as np import cv2 gray = cv2.imread(''sir.jpg'',0) width = gray.shape[0] height = gray.shape[1] h = np.empty([width,height,3]) t = time.time() for i in xrange(width): for j in xrange(height): if gray[i,j]==127: h[i,j]=[255,255,255] elif gray[i,j]>127: h[i,j]=[0,0,255-gray[i,j]] else: h[i,j]=[gray[i,j],0,0] t2 = time.time()-t print "time taken = ",t2

=============================================== ===

Y el resultado es:

tiempo empleado = 14.4029130936

=============================================== ====

interfaz cv:

import cv,time gray = cv.LoadImage(''sir.jpg'',0) h = cv.CreateImage(cv.GetSize(gray),8,3) t=time.time() for i in xrange(gray.width): for j in xrange(gray.height): k = cv.Get2D(gray,j,i)[0] if k==127: cv.Set2D(h,j,i,(255,255,255)) elif k>127: cv.Set2D(h,j,i,(0,0,255-k)) else: cv.Set2D(h,j,i,(k,0,0)) t2 = time.time()-t print "time taken = ",t2 cv.ShowImage(''img'',h) cv.WaitKey(0)

=============================================== ====

El resultado es:

tiempo tomado = 1.16368889809

=============================================== =====

Mira, aquí el viejo cv es aproximadamente 12 times faster que cv2 . Y las imágenes resultantes son iguales. (la imagen de entrada es del tamaño 720x540)

¿Por qué pasó esto?

¿Es cv2 más lento en comparación con cv?

¿O estoy cometiendo un error aquí? ¿Hay un método más rápido en cv2 para el código anterior?