Python-OpenCV 杂项(二)(三): 鼠标事件、 程序性能的检测和优化

0x00. 查看鼠标事件

下面的方法可以查看OpenCV支持的所有鼠标事件:

import cv2
events=[i for i in dir(cv2) if 'EVENT'in i]
print events

输出结果:

['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEMOVE', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']

0x01. 使用示例:

下面代码实现鼠标移动绘制图像:

import cv2
import numpy as np
def draw_circle(event,x,y,flags,param):
  if event==cv2.EVENT_MOUSEMOVE:
    cv2.circle(img,(x,y),100,(255,0,0),-1)

img = np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
  cv2.imshow('image',img)
  if cv2.waitKey(20)&0xFF==27:
    break
cv2.destroyAllWindows()



在图像处理的中每秒钟都要进行大量的运算,所以对程序的要求不仅要能给出正确的结果,同时还需要快。

0x00. 获取程序执行时间

cv2.getTickCount 函数返回从参考点到这个函数被执行的时钟数。所以当在一个函数执行前后都调用它的话,就会得到这个函数的执行时间(时钟数)。

使用示例:

e1 = cv2.getTickCount()
# 你的代码
e2 = cv2.getTickCount()
time = (e2 - e1)/ cv2.getTickFrequency()

cv2.getTickFrequency 返回时钟频率,或者说每秒钟的时钟数。

使用示例:

img1 = cv2.imread('messi5.jpg')

e1 = cv2.getTickCount()
for i in xrange(5,49,2):
    img1 = cv2.medianBlur(img1,i)
e2 = cv2.getTickCount()
t = (e2 - e1)/cv2.getTickFrequency()
print t

当然,Python中也可以使用time库来获取程序执行的时间。

0x01. OpenCV 中的默认优化

OpenCV 中的很多函数都被优化过(使用 SSE2,AVX 等)。也包含一些没有被优化的代码。如果我们的系统支持优化的话要尽量利用这一点。在编译时优化是被默认开启的。

可以使用函数 cv2.useOptimized() 来查看优化是否被开启了,使用函数 cv2.setUseOptimized() 来开启优化。

# check if optimization is enabled
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

# Disable it
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

from: https://segmentfault.com/a/1190000003804939
https://segmentfault.com/a/1190000003804954

你可能感兴趣的:(python,性能优化,opencv,鼠标事件,杂项)