Abi*_*n K 25 python performance opencv computer-vision
几天前,我开始使用新的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
Run Code Online (Sandbox Code Playgroud)
================================================== ===
结果是:
所用时间= 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)
Run Code Online (Sandbox Code Playgroud)
================================================== ====
结果是:
所用时间= 1.16368889809
================================================== =====
看,这里的老cv约12 times faster比cv2.结果图像是相同的.(输入图像大小为720x540)
为什么会这样?
cv2与cv相比是否较慢?
或者我在这里犯了什么错误?对于上面的代码,cv2中有更快的方法吗?
HYR*_*YRY 39
cv2.imread()返回的图像是NumPy的数组对象.因此,您可以使用NumPy的功能来加速计算.
以下程序显示如何使用ndarray对象的item(),itemset()方法加速循环版本的原点.
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
Run Code Online (Sandbox Code Playgroud)
以下程序首先显示如何创建调色板,并使用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)
Run Code Online (Sandbox Code Playgroud)
输出是:
0.453000068665
0.0309998989105
True
Run Code Online (Sandbox Code Playgroud)
cv版本输出是:
0.468999862671
Run Code Online (Sandbox Code Playgroud)
注意:轴0的长度是图像的高度,轴1的长度是图像的宽度