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

2024-05-17 06:24:13 发布

您现在位置:Python中文网/ 问答频道 /正文

几天前,我开始使用新的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

一、二、二、三、三、四、四、四、四、四、四、四、六

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

一、二、二、三、三、四、四、四、四、四、四、四、六

看,这里的老cvcv2大约12 times faster。结果图像是一样的。(输入图像大小为720x540)

为什么会这样?

cv2比cv慢吗?

或者我在这里犯了什么错误?上面的代码在cv2中是否有一个更快的方法?


Tags: 代码in图像importfortimenpwidth
1条回答
网友
1楼 · 发布于 2024-05-17 06:24:13

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

下面的程序演示如何使用ndarray对象的item()、itemset()方法加快origin for loop版本。

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轴的长度是图像的宽度

相关问题 更多 >