python中使用背景减法的质心跟踪

2024-10-02 02:28:59 发布

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

所以我一直在跟随这篇关于质心追踪的教程 https://www.pyimagesearch.com/2018/07/23/simple-object-tracking-with-opencv/ 并建立了形心跟踪类,就像在教程中提到的那样。在

现在,当我尝试使用背景减法来检测,而不是他使用的CNN时,它不起作用,并给我这个问题从质心跟踪器.py在

for i in range(0, inputCentroids):
TypeError: only integer scalar arrays can be converted to a scalar index

这是我正在使用的代码

^{pr2}$

密码在

objects = ct.update(rects)

行。在

以下是本教程中的质心跟踪器的实现:

from scipy.spatial import distance as dist
from collections import OrderedDict
import numpy as np

#Makes a the next unique object ID with
#2 ordered dictionaries
class CentroidTracker():
    def __init__(self, maxDisappeared = 50):
        self.nextObjectID = 0
        self.objects = OrderedDict()
        self.disappeared = OrderedDict()
        self.maxDisappeared = maxDisappeared

    def register(self, centroid):
        self.objects[self.nextObjectID] = centroid
        self.disappeared[self.nextObjectID] = 0
        self.nextObjectID += 1

    def deregister(self, objectID):
        del self.objects[objectID]
        del self.disappeared[objectID]

    def update(self, rects):
        if len(rects) == 0:
        for objectID in self.disappeared.keys():
            self.disappeared[objectID] += 1
            if self.disappeared[objectID] > self.maxDisappeared:
                self.deregister(objectID)
        return self.objects
    inputCentroids = np.zeros((len(rects), 2), dtype="int")
    for (i, (startX, startY, endX, endY)) in enumerate(rects):
        cX = int((startX + endX) / 2.0)
        cY = int((startY + endY) / 2.0)
        inputCentroids[i] = (cX, cY)
    if len(self.objects) == 0:
        for i in range(0, inputCentroids):
            self.register(inputCentroids[i])
    else:
        objectIDs = list(self.objects.keys())
        objectCentroids = list(self.objects.values())
        D = dist.cdist(np.array(objectCentroids), inputCentroids)
        rows = D.min(axis=1).argsort()
        cols = D.argmin(axis=1)[rows]

        usedRows = set()
        usedCols = set()

        for (row, col) in zip(rows, cols):
            if row in usedRows or col in usedCols:
                continue
            objectID = objectIDs[row]
            self.objects[objectID] = inputCentroids[col]
            self.disappeared[objectID] = 0
            usedRows.add(row)
            usedCols.add(col)
            # compute both the row and column index we have NOT yet
            # examined
            unusedRows = set(range(0, D.shape[0])).difference(usedRows)
            unusedCols = set(range(0, D.shape[1])).difference(usedCols)
            if D.shape[0] >= D.shape[1]:
                # loop over the unused row indexes
                for row in unusedRows:
                    # grab the object ID for the corresponding row
                    # index and increment the disappeared counter
                    objectID = objectIDs[row]
                    self.disappeared[objectID] += 1

                    # check to see if the number of consecutive
                    # frames the object has been marked "disappeared"
                    # for warrants deregistering the object
                    if self.disappeared[objectID] > self.maxDisappeared:
                        self.deregister(objectID)
            else:
                for col in unusedCols:
                    self.register(inputCentroids[col])

                # return the set of trackable objects
            return self.objects

我有点迷失在我做错了什么。我要做的就是把一个边界框(x,y,x+w,y+h)传入rects[]列表中,这应该会给出类似的结果,或者我是错的,不明白这是怎么回事?任何帮助都将不胜感激


Tags: theinselfforifobjectsobjectcol
2条回答

按照Axel Puig所说的做,然后在主方法中添加这一行

objects = ct.update(rects)
    if objects is not None:
        for (objectID, centroid) in objects.items():
            text = "ID:{}".format(objectID)
            cv2.putText(frame, text, (centroid[0] - 10, centroid[1] - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
            cv2.circle(frame, (centroid[0], centroid[1]), 4, (0, 255, 0), -1)

解决了这个问题。我想发生的是第一帧没有初始化跟踪器,所以我需要确保它不是没有,然后它就工作了

您忘记了len函数:for i in range(0, len(inputCentroids)):

相关问题 更多 >

    热门问题