当前位置: 首页 > 面试题库 >

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

葛霄
2023-03-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中是否有更快的方法?


问题答案:

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



 类似资料:
  • 我的当前程序将向用户输出图像,并根据用户输入,根据需要重新调整图像。 长话短说,我试图在图像文件中找到圆形对象。我将使用Hough圆变换。然而,因为我在图像中的许多圆不是“完美圆”,所以我正在做一个“猜测”圆半径的算法。但是,我希望允许用户根据需要重新调整半径。 有没有办法要求用户输入,然后根据用户输入,重新调整imshow()中的窗口?现在,imshow()拒绝显示实际的窗口,直到我使用cv2.

  • 问题内容: 我已经安装了opencv 3.4.3(使用和) 当我运行包含此行的代码时: 我收到此错误: 是功能不再通过OpenCV的3.4.3支持? 问题答案: 您收到的错误消息与该模块不存在有关。它与SIFT算法没有直接关系,也与其中的任何算法都没有关系(所有都会发送该错误)。我建议您要么重新安装(pip install opencv-contrib- python),要么使用anaconda或

  • 问题内容: 我正在尝试将一张图片与其他图片列表进行比较,并返回该列表中具有最高70%相似度的图片(例如Google搜索图片)。 我在这篇文章中获得了这段代码,并根据自己的情况进行了更改 我的问题是,如何将图像与图像列表进行比较并仅获得相似图像?有什么方法可以做到这一点? 问题答案: 我建议您看一下图像之间推土机的距离(EMD)。该度量给人一种将标准化的灰度图像转换成另一幅图像有多难的感觉,但可以将

  • 本文向大家介绍借助NumPy和Python-OpenCV(CV2)创建图像拼贴,包括了借助NumPy和Python-OpenCV(CV2)创建图像拼贴的使用技巧和注意事项,需要的朋友参考一下 使用的模块:在本文中,我们将使用NumPy和python-opencv(cv2)库。 NumPy: Numpy是一个python库,它将帮助我们基于科学计算来解决问题并存储相同数据类型的数据。  下载NumP

  • 当我在浏览上面的接口时,在阅读了许多相同主题的站点后,我对这些接口的语法不是很清楚。 请考虑以下代码段: 如果每个查询都是可理解的。

  • 本文向大家介绍对比Java中的Comparable排序接口和Comparator比较器接口,包括了对比Java中的Comparable排序接口和Comparator比较器接口的使用技巧和注意事项,需要的朋友参考一下 Comparable Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在