Performance comparison of OpenCV-Python interfaces, cv and cv2(OpenCV-Python接口、cv和cv2的性能比较)
问题描述
几天前,我开始使用新的 OpenCV-Python 接口,cv2.
A few days back, I started using new OpenCV-Python interface, cv2.
我的问题是关于 cv 和 cv2 接口的比较.
My question is regarding the comparison of cv and cv2 interface.
在易用性方面,新的 cv2 界面有了很大的改进,使用 cv2 真的很简单有趣.
Regarding the ease of use, new cv2 interface has improved far greater, and it is really easy and fun to work with cv2.
但是速度呢?
我制作了两个小代码片段,一个在 cv 中,另一个在 cv2 中,以检查性能.两者都执行相同的功能,访问图像的像素,对其进行测试,进行一些修改等.
I made two small code snipplets, one in cv and another in cv2, to check the performances. Both does the same function, access pixels of an image, test it, make some modifications, etc.
下面是代码:
cv2 接口:
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
time taken = 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
time taken = 1.16368889809
========================================================
=======================================================
看,这里旧的 cv 比 cv2 快 12 倍.结果图像是相同的.(输入图像大小为 720x540)
See, here old cv is about 12 times faster than cv2. And resulting images are same. (input image is of size 720x540)
为什么会这样?
cv2 比 cv 慢吗?
Is cv2 slower compared to cv?
或者我在这里犯了什么错误?以上代码在cv2中有更快的方法吗?
Or am I making any mistake here? Is there a faster method in cv2 for the above code?
推荐答案
cv2.imread()返回的图片是NumPy的数组对象.所以你可以使用 NumPy 的函数来加速计算.
The image returned by cv2.imread() is an array object of NumPy. So you can use NumPy's functions to speedup calculation.
下面的程序展示了如何使用 ndarray 对象的 item(), itemset() 方法来加速你的 origin for 循环版本.
The following program shows how to speedup your origin for loop version by using item(), itemset() method of ndarray object.
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 的数组索引来获取结果:
And the following program show how to create the palette first, and use NumPy's array index to get the result:
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轴的长度是图片的宽度
这篇关于OpenCV-Python接口、cv和cv2的性能比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:OpenCV-Python接口、cv和cv2的性能比较
基础教程推荐
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
