Сравнение производительности интерфейсов OpenCV-Python, cv и cv2 - PullRequest
25 голосов
/ 20 февраля 2012

Несколько дней назад я начал использовать новый интерфейс OpenCV-Python, cv2.

Мой вопрос касается сравнения интерфейсов cv и cv2.

Что касаетсяпростота использования, новый интерфейс cv2 значительно улучшился, а работать с cv2.

действительно просто и весело. А как же скорость?

Я сделал два небольшихфрагменты кода, один в cv и другой в cv2, чтобы проверить производительность.Оба выполняют одну и ту же функцию, получают доступ к пикселям изображения, проверяют его, вносят некоторые изменения и т. Д.

Ниже приведен код:


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

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

И результат:

затраченное время = 14.4029130936

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

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)

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

Результат:

потраченное время = 1.16368889809

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

Видите, здесь старое cv примерно 12 times faster, чем cv2.И полученные изображения одинаковы.(входное изображение имеет размер 720x540)

Почему это происходит?

Медленнее ли cv2 по сравнению с cv?

Или я здесь ошибаюсь?Есть ли более быстрый метод в cv2 для вышеуказанного кода?

1 Ответ

39 голосов
/ 20 февраля 2012

Изображение, возвращаемое cv2.imread (), является объектом массива NumPy. Таким образом, вы можете использовать функции NumPy для ускорения расчетов.

Следующая программа показывает, как ускорить ваше происхождение для версии цикла с помощью метода item (), itemset () объекта 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

И следующая программа показывает, как сначала создать палитру, и использует индекс массива NumPy для получения результата:

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)

Вывод:

* * 1010

Вывод версии cv:

0.468999862671

Примечание: длина оси 0 - это высота изображения, длина оси 1 - это ширина изображения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...