OpenCV Python:读取和设置每个像素太慢

时间:2015-04-08 13:34:53

标签: python performance opencv

我试图用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,它会快速运行并感觉正确。我这样做是对吗还是我需要以不同的方式处理这个问题吗?

1 个答案:

答案 0 :(得分:2)

根据经验,任何适用于每个像素的python程序都会太慢。 Opencv有很多功能 - 使用它们!在您的情况下,您可以使用第四链函数:

如果您想要找到差异所在的区域,可以使用斑点检测器为您提供区域列表。