OpenCV-Python接口,cv和cv2的性能比较

发布于 2021-01-29 18:17:14

几天前,我开始使用新的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 fastercv2。结果图像是相同的。(输入图像的尺寸为720x540)

为什么会这样?

与cv相比,cv2慢吗?

还是我在这里犯任何错误?以上代码在cv2中是否有更快的方法?

关注者
0
被浏览
149
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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
    

    下面的程序演示了如何首先创建调色板,并使用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
    

    简历版本输出为:

    0.468999862671
    

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看