Search code examples
pythonkinectkinect-v2pykinect

PyKinectv2 Body tracking count


New to pykinect and kinect in general -- trying to simply get a count of bodies currently being tracked. No skeletal or joint data required. Just want to get a running count of bodies currently in frame. I am using a kinect-v2 and pykinect2.

Being more specific, I'm trying to track how many bodies are in frame and the time elapsed since that value changed. (0 people to 1 person, 1 person to 2, etc.) Due to the built examples for pykinect and the way that they loop, this has proven difficult however. The latest attempt (Now updated with the solved code):

from pykinect2 import PyKinectV2
from pykinect2.PyKinectV2 import *
from pykinect2 import PyKinectRuntime

import ctypes
import _ctypes
import pygame
import sys
#from timer import Timer
import time
from datetime import datetime

if sys.hexversion >= 0x03000000:
    import _thread as thread
else:
    import thread

class Runtime(object):
    def __init__(self):
        pygame.init()
        
        self._kinect = PyKinectRuntime.PyKinectRuntime(PyKinectV2.FrameSourceTypes_Color | PyKinectV2.FrameSourceTypes_Body)
        self._done = False
        self._clock = pygame.time.Clock()
        self._bodies = None


    def run(self):
        peeps = 0
        end_time = 0
        while not self._done:
            n_bodies = 0

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self._done = True
                    
            if self._kinect.has_new_body_frame():
                self._bodies = self._kinect.get_last_body_frame()


                if self._bodies is not None:                    
                    for i in range(0, self._kinect.max_body_count):
                        body = self._bodies.bodies[i]
                        if body.is_tracked:
                            n_bodies +=1
                            if not body.is_tracked:
                                continue


                    if n_bodies == 0:
                        if peeps == 0:
                            pass
                            
                        
                        if peeps != 0:
                            end_time = time.perf_counter() - start_time
                            round_time = round(end_time)
                            print(peeps, "person stood in front of the kinect for", round_time, "seconds at", dateTimeObj.hour, ":", dateTimeObj.minute, ":", dateTimeObj.second)
                            end_time = 0
                            start_time = 0
                            peeps = 0
                            
                                
                    if n_bodies == 1:
                        if peeps == [2, 3, 4, 5, 6]:
                            end_time = time.perf_counter() - start_time
                            round_time = round(end_time)
                            print(peeps, "person stood in front of the kinect for", round_time, "seconds at", dateTimeObj.hour, ":", dateTimeObj.minute, ":", dateTimeObj.second)
                            end_time = 0
                            start_time = 0
                            peeps = 1

                        if peeps == 0:
                            #print(n_bodies)
                            peeps = 1
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()
                            

                        if peeps == 1:
                            pass

                    if n_bodies == 2:
                        if peeps == [1, 3, 4, 5, 6]:
                            end_time = time.perf_counter() - start_time
                            round_time = round(end_time)
                            print(peeps, "person stood in front of the kinect for", round_time, "seconds at", dateTimeObj.hour, ":", dateTimeObj.minute, ":", dateTimeObj.second)
                            end_time = 0
                            start_time = 0
                            peeps = 2
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()
                            
                        if peeps == 0:
                            #print(n_bodies)
                            peeps = 2
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()
                            

                        if peeps == 2:
                            pass

                    if n_bodies == 3:
                        if peeps == [1, 2, 4, 5, 6]:
                            end_time = time.perf_counter() - start_time
                            round_time = round(end_time)
                            print(peeps, "person stood in front of the kinect for", round_time, "seconds at", dateTimeObj.hour, ":", dateTimeObj.minute, ":", dateTimeObj.second)
                            end_time = 0
                            start_time = 0
                            peeps = 3
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()
                            
                        if peeps == 0:
                            #print(n_bodies)
                            peeps = 3
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()
                            

                        if peeps == 3:
                            pass

                    if n_bodies == 4:
                        if peeps == [1, 3, 4, 5, 6]:
                            end_time = time.perf_counter() - start_time
                            round_time = round(end_time)
                            print(peeps, "person stood in front of the kinect for", round_time, "seconds at", dateTimeObj.hour, ":", dateTimeObj.minute, ":", dateTimeObj.second)
                            end_time = 0
                            start_time = 0
                            peeps = 4
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()

                        if peeps == 0:
                            #print(n_bodies)
                            peeps = 4
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()
                            

                        if peeps == 4:
                            pass

                    if n_bodies == 5:
                        if peeps == [1, 2, 3, 4, 6]:
                            end_time = time.perf_counter() - start_time
                            round_time = round(end_time)
                            print(peeps, "person stood in front of the kinect for", round_time, "seconds at", dateTimeObj.hour, ":", dateTimeObj.minute, ":", dateTimeObj.second)
                            end_time = 0
                            start_time = 0
                            peeps = 5
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()
                            
                        if peeps == 0:
                            #print(n_bodies)
                            peeps = 5
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()
                            

                        if peeps == 5:
                            pass

                    if n_bodies == 6:
                        if peeps == [1, 2, 3, 4, 5]:
                            end_time = time.perf_counter() - start_time
                            round_time = round(end_time)
                            print(peeps, "person stood in front of the kinect for", round_time, "seconds at", dateTimeObj.hour, ":", dateTimeObj.minute, ":", dateTimeObj.second)
                            end_time = 0
                            start_time = 0
                            peeps = 6
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()

                        if peeps == 0:
                            #print(n_bodies)
                            peeps = 6
                            start_time = time.perf_counter()
                            dateTimeObj = datetime.now()
                            

                        if peeps == 6:
                            pass

            self._clock.tick(60)
                        
        self._kinect.close()
        pygame.quit()

game = Runtime();
game.run();


Solution

  • I found a useful snippet that does what you need within one of the examples provided in the PyKinect2 GitHub repo.

    You need to get the body frame, and then count the number of tracked bodies:

    kinect = PyKinectRuntime.PyKinectRuntime(PyKinectV2.FrameSourceTypes_Color | PyKinectV2.FrameSourceTypes_Body)
    body_frame = kinect.get_last_body_frame()
    
    n_bodies = 0
    if body_frame is not None: 
        for i in range(0, kinect.max_body_count):
            if body_frame.bodies[i].is_tracked: 
                n_bodies += 1
    
    # n_bodies contains now the number of tracked bodies