我试图用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,它会快速运行并感觉正确。我这样做是对吗还是我需要以不同的方式处理这个问题吗?
答案 0 :(得分:2)
根据经验,任何适用于每个像素的python程序都会太慢。 Opencv有很多功能 - 使用它们!在您的情况下,您可以使用第四链函数:
如果您想要找到差异所在的区域,可以使用斑点检测器为您提供区域列表。