pd.DataFrame是覆盖列,而不是将数据保存到pd.DataFrame

问题描述 投票:0回答:2

这里,我正在尝试创建一个数据框以比较两个框之间对象的位置:

Pcount = []
Pcountdb = []
framenumber = 0
frames_count = 0
frames_count = self.vdo.get(cv2.CAP_PROP_FRAME_COUNT)
df = pd.DataFrame(index=range(int(frames_count))) 
if len(outputs) > 0:
    for i in range(len(outputs):
        bbox_xyxy = outputs[:,:4]
        identities = outputs[:,-1]
        sx = outputs[:,0]
        sy = outputs[:,1]
        ex = outputs[:,2]
        ey = outputs[:,3]
        cx = ((sx + ex) /2)
        cy = ((sy + ey) /2)
        ct = (cx, cy)
        cx2 = (cx.tolist())
        cy2 = (cy.tolist())
        P = identities[i]
        df[str(P.astype(int))] = ""                              
        #creates new column with an id number obtained through deepsort

        df.at[int(framenumber), str(P.astype(int))] = [cx2[i], cy2[i]]  
        #the i function from a for loop is necessary for multiple objects in the same frame

        print(df)

        if not P in Pcountdb:
            global PcountT
            Pcountdb.append(P)
            PcountT = PcountT + 1

framenumber = framenumber + 1

编辑:上面的脚本以占位符开头

df = pd.DataFrame ...为我的视频中的每个图像/帧创建一行数据的数据帧

一旦我的对象检测器被deepsort遍历,并且Deepsort识别出每个检测到的对象并将其标识为具有位置的对象,就会创建bbox_xyxy。

然后,我分解np.arrays并计算这些对象的中心点,以便可以将它们视为单个点,而不是边界框矩形。

Pandas接受我的输入,并创建一个带有对象ID(在本例中为1),中心x y坐标的DataFrame,并将其放置在与每个帧对应的行中]

接下来,我们打印数据框并查看结果

print(df)返回:

                     1
Frames                
3       [614.5, 632.0]

                     1
Frames                
3                     
4       [610.5, 624.0]

                     1
Frames                
3                     
4                     
5       [603.0, 618.0]

                     1
Frames                
3                     
4                     
5                     
6       [574.0, 615.5]

                     1
Frames                
3                     
4                     
5                     
6                     
7       [564.0, 610.0]

                     1
Frames                
3                     
4                     
5                     
6                     
7                     
8       [559.0, 597.0]

DataFrame仅跟踪每列的最新坐标集。如果我要生成两列,则我的数据框中将仅出现每个对象的最后一眼(如上所示,其中一个对象标识为1)]

我需要将输出保存到我​​的pd.DataFrame = df中,而不是被覆盖。
                     1
Frames                
3       [614.5, 632.0]
4       [610.5, 624.0]
5       [603.0, 618.0]
6       [574.0, 615.5]
7       [564.0, 610.0]
8       [559.0, 597.0]

因此,我可以比较这些对象在帧之间的位置,给我一个对象数,该对象可以对对象进行计数并将它们存储在两个数据库中,“ UP和” DOWN“

[这里,我正在尝试创建一个数据框以比较对象在帧之间的位置:Pcount = [] Pcountdb = [] framenumber = 0framescount = 0framescount = self.vdo.get(cv2 ....

python pandas numpy opencv tracking
2个回答
0
投票

您的DataFrame只是添加了最后一个原始数据,因为每次for循环运行时,您都将列重置为null。因此所有先前的值都将被删除。通过查看您的代码,我可以看到,因为您的代码不需要进入for循环。


0
投票
for i in range(len(outputs)):
                    P = identities[i]

                    if not P in Pcountdb:
                        df[str(P.astype(int))] = ""
                        global PcountT
                        Pcountdb.append(P)
                        PcountT = PcountT + 1
                    else:
                        if P in Pcountdb:
                            df.at[int(framenumber), str(P.astype(int))] = [cx2[i], cy2[i]]


[222 rows x 1 columns]
                     1
 Frames                
 4       [610.5, 624.0]
 5       [603.0, 618.0]
 6       [574.0, 615.5]
 7       [564.0, 610.0]
 8       [559.0, 597.0]
 ...                ...
 226     [640.5, 518.5]
 227     [643.0, 525.0]
 228     [646.0, 529.5]
 229     [647.5, 529.5]
 230     [650.5, 531.5]
© www.soinside.com 2019 - 2024. All rights reserved.