我试图用Python中的OpenCV来跟踪运动。如果一个像素与最后一帧的颜色不匹配,那么它将被设置为黑色;否则,如果它是静态的,它将被设置为白色。我做的很好,但如果我尝试对每一个像素逐一进行处理,性能会受到很大影响,而且运行速度太慢。在
我的代码:
import numpy as np
import cv2
def distance(b1, g1, r1, b2, g2, r2):
return abs(b2 - b1) + abs(g2 - g1) + abs(r2 - r1)
pixelStep = 1
lastFrame = None
thresh = 100
cap = cv2.VideoCapture(0)
while(True):
flag, frame = cap.read()
frameInst = frame.copy()
height = np.size(frame, 0)
width = np.size(frame, 1)
if lastFrame != None:
for x in range(0, height, pixelStep):
for y in range(0, width, pixelStep):
b1 = lastFrame.item(x, y, 0)
g1 = lastFrame.item(x, y, 1)
r1 = lastFrame.item(x, y, 2)
b2 = frame.item(x, y, 0)
g2 = frame.item(x, y, 1)
r2 = frame.item(x, y, 2)
dist = distance(b2, g2, r2, b1, g1, r1)
colorValue = 255
if dist > thresh:
colorValue = 0 # Change to black if there's another change from pixel
frame.itemset(x, y, 0, colorValue)
frame.itemset(x, y, 1, colorValue)
frame.itemset(x, y, 2, colorValue)
lastFrame = frameInst
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
如果我把pixelStep改为3,它会跑得很快,感觉很好。我这样做是对的还是需要用不同的方式来处理?在
根据经验,任何在每个像素上运行的python程序都会太慢。Opencv有大量的函数使用它们!在您的情况下,您可以使用链四函数:
如果你想找出差异所在的区域,你可以用blob检测器给你一个区域列表。在
相关问题 更多 >
编程相关推荐