openCV 核心操作 3 程序性能检测及优化

    科技2022-08-06  100

    使用 OpenCV 检测程序效率

    cv2.getTickCount() #当你在一个函数执行前后都调用它的话,你就会得到这个函数的执行时间 (时钟数)。 cv2.getTickFrequency() #每秒钟的时钟数

    一个函数运行了多少秒

    import cv2 import numpy as np e1 = cv2.getTickCount() e2 = cv2.getTickCount() time = (e2 - e1)/ cv2.getTickFrequency()

    OpenCV 中的默认优化

    cv2.useOptimized() #查看优化是否被开启了 cv2.setUseOptimized() #开启优化 cv2.setUseOptimized(False) #关闭优化

    在 IPython 中检测程序效率

    cv2.countNonZero(img) #快 np.count_nonzero(img) #慢

    效率优化技术

    1.尽量避免使用循环,尤其双层三层循环,它们天生就是非常慢的。 2.算法中尽量使用向量操作,因为 Numpy 和 OpenCV 都对向量操作进行 了优化。 3.利用高速缓存一致性。 4.没有必要的话就不要复制数组。使用视图来代替复制。数组复制是非常浪 费资源的。 5.就算进行了上述优化,如果你的程序还是很慢,或者说大的训话不可避免的话, 你你应该尝试使用其他的包,比如说 Cython,来加速你的程序。

    练习:输出图片的信息,(行 列 通道等),使用滑动条完成两张图片的图像混合过渡,并在图中用红色矩形圈出足球目标(改变像素值)

    import cv2 import numpy as np img=np.zeros((500,500),dtype='uint8') cv2.namedWindow('image') def nothing (x) : pass #获取球的坐标 # def Mouse(event, x, y, flags, param): # print(x,y) # cv2.setMouseCallback('image', Mouse) img1 = cv2.imread('football.png') img2 = cv2.imread('lhu.jpg') print(img1.shape) print(img2.shape) #使两个图片大小相同 f1 = img1[0:375,0:500] f2 = img2[0:375,0:500] RED = [0,0,255] #创建滑动条 cv2.createTrackbar('A', 'image', 0, 100, nothing) #截取两个球 g1 = f1[300:370,110:180] g2 = f1[310:370,360:430] #给两个球加红框 constant_a = cv2.copyMakeBorder(g1, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=RED) constant_b = cv2.copyMakeBorder(g2, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=RED) while 1: a1 = cv2.getTrackbarPos('A', 'image') #使两个图片混合过渡 dst = cv2.addWeighted(f1, float(a1/100), f2, 1-float(a1/100), 0) #用加了红框的图片代替原来的足球 f1[295:375, 105:185] = constant_a f1[305:375, 355:435] = constant_b cv2.imshow('image',dst) if(cv2.waitKey(10)==27): break cv2.destroyAllWindows()

    效果图

    Processed: 0.013, SQL: 8