几天前,我开始使用新的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.163689809
一、二、二、三、三、四、四、四、四、四、四、四、六
看,这里的老cv
比cv2
大约12 times faster
。结果图像是一样的。(输入图像大小为720x540)
为什么会这样?
cv2比cv慢吗?
或者我在这里犯了什么错误?上面的代码在cv2中是否有一个更快的方法?
imread()返回的图像是NumPy的数组对象。所以你可以使用NumPy的函数来加速计算。
下面的程序演示如何使用ndarray对象的item()、itemset()方法加快origin for loop版本。
下面的程序演示了如何首先创建调色板,并使用NumPy的数组索引来获得结果:
输出为:
cv版本输出为:
注意:0轴的长度是图像的高度,1轴的长度是图像的宽度
相关问题 更多 >
编程相关推荐