opencvpython:读取和设置每个像素

2024-10-01 02:25:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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,它会跑得很快,感觉很好。我这样做是对的还是需要用不同的方式来处理?在


Tags: ifnpabsitemcv2frameb2b1
1条回答
网友
1楼 · 发布于 2024-10-01 02:25:48

根据经验,任何在每个像素上运行的python程序都会太慢。Opencv有大量的函数使用它们!在您的情况下,您可以使用链四函数:

如果你想找出差异所在的区域,你可以用blob检测器给你一个区域列表。在

相关问题 更多 >