【问题标题】:Performance comparison of OpenCV-Python interfaces, cv and cv2OpenCV-Python接口、cv和cv2的性能比较
【发布时间】:2012-03-10 14:10:57
【问题描述】:

几天前,我开始使用新的 OpenCV-Python 接口,cv2

我的问题是关于cvcv2 接口的比较。

在易用性方面,新的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

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

简历界面:

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中有更快的方法吗?

【问题讨论】:

    标签: python performance opencv computer-vision


    【解决方案1】:

    cv2.imread()返回的图像是NumPy的一个数组对象。所以你可以使用 NumPy 的函数来加速计算。

    下面的程序展示了如何使用 ndarray 对象的 item(), itemset() 方法来加速你的 origin for 循环版本。

    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)
    

    输出是:

    0.453000068665
    0.0309998989105
    True
    

    cv 版本输出为:

    0.468999862671
    

    注意:0轴的长度是图片的高度,1轴的长度是图片的宽度

    【讨论】:

    • 感谢您的回答。你能补充一些细节吗?您知道上述过程的更好方法,更快的 numpy 函数等吗?
    • @arkiaz,我修改了你的 cv2 for loop 版本,现在它的速度和 cv 版本一样。我添加了一个 numpy 版本来加快速度。
    • 谢谢,你的第一个方法提供了与 cv 相当的速度,尽管代码变得有点大。使用我的图像t=1.127 获得的结果。但是您的第二种方法给出了t=0.054 的非常好的结果,但给出了一个大的黑屏(即错误的输出)。为什么会这样?
    • @arkiaz,请将“palette = np.array(palette)”行更改为“palette = np.array(palette, np.uint8)”,这将解决问题。
    • 好吧,palette=np.array(palette,np.uint8) 解决了这个问题,而且速度非常快,t=0.503。谢谢。
    猜你喜欢
    • 2014-04-22
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多