美文网首页OpenCvOpenCV with Python By Exampleopencv
Python-OpenCV —— 技巧篇之评估与优化

Python-OpenCV —— 技巧篇之评估与优化

作者: IConquer | 来源:发表于2018-03-12 16:36 被阅读43次

    在做图像处理时,你不仅要保证你的代码是正确的,还要保证运行的速度是否最快,根据Python之禅 There should be one and preferably only one obvious way to do it.你需要检查你的代码。

    评估代码时间

    import cv2
    start = cv2.getTickCount()
    # 这里写代码...
    end = cv2.getTickCount()
    print((end - start) / cv2.getTickFrequency())
    

    这段代码就是用来测量程序运行时间的(单位:s),其中cv2.getTickCount()函数得到电脑启动以来的时钟周期数,cv2.getTickFrequency()返回你电脑的主频,前后相减再除以主频就是你代码的运行时间(这样解释并不完全准确,但能理解就行)。另外,也可以用Python中的time模块计时:

    import time
    start = time.clock()
    # 这里写代码...
    end = time.clock()
    print(end - start)
    

    OpenCV优化

    # 用cv2.useOptimized()检查是否可以优化
    In [5]: cv2.useOptimized()
    Out[5]: True
    
    In [6]: %timeit res = cv2.medianBlur(img,49)
    10 loops, best of 3: 34.9 ms per loop
    
    # 禁止优化
    In [7]: cv2.setUseOptimized(False)
    
    In [8]: cv2.useOptimized()
    Out[8]: False
    
    In [9]: %timeit res = cv2.medianBlur(img,49)
    10 loops, best of 3: 64.1 ms per loop
    #可以看到,前后相差一倍运行时间
    

    Python中的性能优化

    举例说明

    In [10]: x = 5
    
    In [11]: %timeit y=x**2
    10000000 loops, best of 3: 73 ns per loop
    
    In [12]: %timeit y=x*x
    10000000 loops, best of 3: 58.3 ns per loop
    
    In [15]: z = np.uint8([5])
    
    In [17]: %timeit y=z*z
    1000000 loops, best of 3: 1.25 us per loop
    
    In [19]: %timeit y=np.square(z)
    1000000 loops, best of 3: 1.16 us per loop
    

    可以看到, x = 5 ; y = x*x是最快的,比Numpy快约20倍。

    总结:Python标量操作速度比Numpy标量操作快得多。对于操作一两个元素,使用Python,大数组时用Numpy
    举例说明2

    In [35]: %timeit z = cv2.countNonZero(img)
    100000 loops, best of 3: 15.8 us per loop
    
    In [36]: %timeit z = np.count_nonzero(img)
    1000 loops, best of 3: 370 us per loop
    

    可以看到, OpenCV函数比Numpy几乎快25倍
    总结:通常,OpenCV函数比Numpy功能。对于同一操作,优先选用OpenCV。

    性能优化技巧

    1. 在Python中尽量避免使用循环、尤其是多重循环,机器耗费时间;
    2. 将算法/代码尽可能的向量话,因为Numpy和OpenCV对此进行了优化;
    3. 利用缓存一致性;
    4. 不要做数组的复制,这极其耗费资源。

    相关文章

      网友评论

        本文标题:Python-OpenCV —— 技巧篇之评估与优化

        本文链接:https://www.haomeiwen.com/subject/fynnfftx.html