コード例 #1
0
def main(get_depth, get_color, get_skeleton, get_mask, calculate_features, visualize, save_anonomized, device):

	dev = device
	ret = 0
	backgroundTemplates = np.empty([1,1,1])
	backgroundModel = None
	backgroundCount = 20
	bgPercentage = .05
	prevDepthIm = None

	day_dirs = os.listdir('depth/')
	day_dirs = [x for x in day_dirs if x[0]!='.']
	day_dirs.sort(key=lambda x: int(x))
	hour_index = 0
	minute_index=0

	allFeatures = []
	coms = []
	orns = []

	play_speed = 1
	new_date_entered = False
	framerate = 0
	frame_prev = 0
	frame_prev_time = time()

	day_index = 0
	while day_index < len(day_dirs):

		if new_date_entered:
			try:
				day_index = day_dirs.index(day_new)
			except:
				print "Day not found"
				day_index = 0

		dayDir = day_dirs[day_index]

		hour_dirs = os.listdir('depth/'+dayDir)
		hour_dirs = [x for x in hour_dirs if x[0]!='.']
		hour_dirs.sort(key=lambda x: int(x))

		'''Hours'''
		''' Check for new Hours index '''
		if not new_date_entered:
			if play_speed >= 0  and ret != keys_frame_left:
				hour_index = 0
			else:
				hour_index = len(hour_dirs)-1
		else:
			try:
				hour_index = hour_dirs.index(hour_new)
			except:
				print "Hour was not found"
				hour_index = 0

		while hour_index < len(hour_dirs):
			hourDir = hour_dirs[hour_index]

			minute_dirs = os.listdir('depth/'+dayDir+'/'+hourDir)
			minute_dirs = [x for x in minute_dirs if x[0]!='.']
			minute_dirs.sort(key=lambda x: int(x))

			'''Minutes'''
			''' Check for new minute index '''
			if not new_date_entered:
				if play_speed >= 0  and ret != keys_frame_left:
					minute_index = 0
				else:
					minute_index = len(minute_dirs)-1
			else:
				try:
					minute_index = minute_dirs.index(minute_new)
				except:
					print "Minute was not found"
					minute_index = 0

			''' Loop through this minute '''
			while minute_index < len(minute_dirs):
				minute_dir = minute_dirs[minute_index]

				# Prevent from reading hidden files
				if minute_dir[0] == '.':
					continue

				depth_files = []
				skelFiles = []

				# For each available device:
				devices = os.listdir('depth/'+dayDir+'/'+hourDir+'/'+minute_dir)
				devices = [x for x in devices if x[0]!='.' and x.find('tmp')<0]
				devices.sort()

				deviceID = "device_{0:d}".format(dev+1)

				if not os.path.isdir('depth/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+deviceID):
					continue

				''' Sort files '''
				if get_depth:
					depthTmp = os.listdir('depth/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+deviceID)
					tmpSort = [int(x.split('_')[-3])*100 + int(formatFileString(x.split('_')[-2])) for x in depthTmp]
					depthTmp = np.array(depthTmp)[np.argsort(tmpSort)].tolist()
					depth_files.append([x for x in depthTmp if x.find('.png')>=0])
				if get_skeleton:
					skelTmp = os.listdir('skel/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+deviceID)
					tmpSort = [int(x.split('_')[-4])*100 + int(formatFileString(x.split('_')[-3])) for x in skelTmp]
					skelTmp = np.array(skelTmp)[np.argsort(tmpSort)].tolist()
					skelFiles.append([x for x in skelTmp if x.find('.dat')>=0])

				if len(depth_files) == 0:
					continue

				if play_speed >= 0 and ret != keys_frame_left:
					frame_id = 0
				else:
					frame_id = len(depth_files[dev])-1


				while frame_id < len(depth_files[0]):
				# while frame_id < len(depth_files[dev]):

					depthFile = depth_files[0][frame_id]
					# try:
					if 1:
						''' Load Depth '''
						if get_depth:
							depthIm = sm.imread('depth/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+deviceID+'/'+depthFile)
							depthIm = np.array(depthIm, dtype=np.uint16)
						''' Load Color '''
						if get_color:
							colorFile = 'color_'+depthFile[6:-4]+'.jpg'
							colorIm = sm.imread('color/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+deviceID+'/'+colorFile)
							# colorIm_g = colorIm.mean(-1, dtype=np.uint8)
							colorIm_g = skimage.img_as_ubyte(skimage.color.rgb2gray(colorIm))
							# colorIm_lab = skimage.color.rgb2lab(colorIm).astype(np.uint8)

						''' Load Skeleton Data '''
						if get_skeleton:
							skelFile = 'skel_'+depthFile[6:-4]+'_.dat'
							if os.path.isfile('skel/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+deviceID+'/'+skelFile):
								with open('skel/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+deviceID+'/'+skelFile, 'rb') as inFile:
									users = pickle.load(inFile)
							else:
								print "No user file:", skelFile
							coms = [users[x]['com'] for x in users.keys() if users[x]['com'][2] > 0.0]
							jointCount = 0
							for i in users.keys():
								user = users[i]

						timestamp = depthFile[:-4].split('_')[1:] # Day, hour, minute, second, millisecond, Frame number in this second
						depthIm = np.minimum(depthIm.astype(np.float), 5000)
						fill_image(depthIm)

						'''Background model'''
						if backgroundModel is None:
							bgSubtraction = AdaptiveMixtureOfGaussians(depthIm, maxGaussians=3, learningRate=0.01, decayRate=0.02, variance=300**2)
							backgroundModel = bgSubtraction.getModel()
							if get_color:
								prevColorIm = colorIm_g.copy()
							continue
						else:
							bgSubtraction.update(depthIm)

						backgroundModel = bgSubtraction.getModel()
						foregroundMask = bgSubtraction.get_foreground(thresh=50)

						''' Find people '''
						if get_skeleton:
							ret = plotUsers(depthIm, users, device=deviceID, vis=True)
						if get_mask:
							foregroundMask, userBoundingBoxes, userLabels = extract_people(depthIm, foregroundMask, minPersonPixThresh=1500, gradientFilter=True, gradThresh=100)

						''' Calculate user features '''
						if calculate_features and get_color:
							''' Color Optical Flow '''
							flow = getFlow(prevColorIm, colorIm_g)
							prevColorIm = colorIm_g.copy()

							userCount = len(userBoundingBoxes)
							for i in xrange(userCount):
								userBox = userBoundingBoxes[i]
								userMask = foregroundMask==i+1
								allFeatures.append(computeUserFeatures(colorIm, depthIm, flow, userBox, time=timestamp, mask=userMask, windowSize=[96,72], visualise=False))
						''' Or get CoM + orientation '''
						if get_mask and not calculate_features:
							userCount = len(userBoundingBoxes)
							for i in xrange(userCount):
								userBox = userBoundingBoxes[i]
								userMask = foregroundMask==i+1
								com, ornBasis = calculateBasicPose(depthIm, userMask)
								coms.append(com)
								orns.append(ornBasis[1])
								allFeatures.append({'com':com, "orn":ornBasis, 'time':timestamp})

						''' Visualization '''
						if visualize:
							tmpSecond = depthFile.split("_")[-3]
							if len(tmpSecond) == 0:
								tmpSecond = '0'+tmpSecond
							if get_depth:
								vv.imshow("Depth", depthIm/6000.)
								vv.putText("Depth", "Day "+dayDir+" Time "+hourDir+":"+minute_dir+":"+tmpSecond, (5,220), size=15)
								vv.putText("Depth", "Play speed: "+str(play_speed)+"x", (5,15), size=15)
								vv.putText("Depth", str(int(framerate))+" fps", (275,15), size=15)

							if get_color:
								vv.putText(colorIm, "Day "+dayDir+" Time "+hourDir+":"+minute_dir+" Dev#"+str(dev), (10,220))
								vv.imshow("I_orig", colorIm)
								if get_mask:
									# vv.imshow("I", colorIm*foregroundMask[:,:,np.newaxis])
									vv.imshow("I_masked", colorIm + (255-colorIm)*(((foregroundMask)[:,:,np.newaxis])))
							if get_mask:
								vv.imshow("Mask", foregroundMask.astype(np.float)/float(foregroundMask.max()))
								# vv.imshow("BG Model", backgroundModel.astype(np.float)/float(backgroundModel.max()))


							''' Multi-camera map '''
							if 0 and len(coms) > 0:
								mapRez = [200,200]
								mapIm = np.zeros(mapRez)
								coms_np = np.array(coms)
								xs = np.minimum(np.maximum(mapRez[0]+((coms_np[:,2]+500)/3000.*mapRez[0]).astype(np.int), 0),mapRez[0]-1)
								ys = np.minimum(np.maximum(((coms_np[:,0]+500)/1500.*mapRez[0]).astype(np.int), 0), mapRez[1]-1)
								mapIm[xs, ys] = 255
								vv.imshow("Map", mapIm)
								# scatter(coms_np[:,0], -coms_np[:,2])


							'''3D Vis'''
							if 0:
								# figure = mlab.figure(1, fgcolor=(1,1,1), bgcolor=(0,0,0))
								# from pyKinectTools.utils.DepthUtils import *
								pts = depthIm2XYZ(depthIm).astype(np.int)
								interval = 25
								figure.scene.disable_render = True
								mlab.clf()
								# ss = mlab.points3d(-pts[::interval,0], pts[::interval,1], pts[::interval,2], colormap='Blues', vmin=1000., vmax=5000., mode='2dvertex')
								ss = mlab.points3d(pts[::interval,0], pts[::interval,1], pts[::interval,2], 5.-(np.minimum(pts[::interval,2], 5000)/float((-pts[:,2]).max()))/1000., scale_factor=25., colormap='Blues')#, mode='2dvertex')
								# , scale_factor=25.
								mlab.view(azimuth=0, elevation=0, distance=3000., focalpoint=(0,0,0), figure=figure)#, reset_roll=False)
								# mlab.roll(90)
								currentView = mlab.view()
								figure.scene.disable_render = False
								mlab.draw()
								# mlab.show()
								# ss = mlab.points3d(pts[::interval,0], pts[::interval,1], pts[::interval,2], color=col, scale_factor=5)
								# ss = mlab.points3d(pts[:,0], pts[:,1], pts[:,2], color=(1,1,1), scale_factor=5)

								# ss = mlab.points3d(pts[:,0], pts[:,1], pts[:,2])


						''' Playback control: Look at keyboard input '''
						ret = vv.waitKey()

						if frame_id - frame_prev > 0:
							framerate = (frame_id - frame_prev) / (time() - frame_prev_time)
						frame_prev = frame_id
						frame_prev_time = time()

						new_date_entered = False
						if ret > 0:
							# player_controls(ret)
							# print "Ret is",ret

							if ret == keys_ESC:
								break
							elif ret == keys_space:
								print "Enter the following into the command line"
								tmp = raw_input("Enter date: ")
								day_new = tmp
								tmp = raw_input("Enter hour: ")
								hour_new = tmp
								tmp = raw_input("Enter minute: ")
								minute_new = tmp

								print "New date:", day_new, hour_new, minute_new

								new_date_entered = True
								break

							elif ret == keys_down_arrow:
								play_speed = 0
							elif ret == keys_left_arrow:
								play_speed -= 1
							elif ret == keys_right_arrow:
								play_speed += 1
							elif ret == keys_i:
									embed()
							elif ret == keys_frame_left:
								frame_id -= 1
							elif ret == keys_frame_right:
								frame_id += 1
							elif ret == keys_help:
								display_help()

						frame_id += play_speed

					if save_anonomized and get_mask:
						save_dir = 'color_masked/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+devices[dev]+'/'
						createDirectory(save_dir)
						sm.imsave(save_dir+'colorM_'+depthFile[6:-4]+'.jpg', colorIm*(1-foregroundMask))
					# except:
						# print "Erroneous frame"
						# if visualize:
						# 	vv.imshow("D", depthIm.astype(np.float)/5000)
						# 	ret = vv.waitKey(10)


					# End seconds
					if ret == keys_ESC or new_date_entered:
						break
					if frame_id >= len(depth_files[0]):
						minute_index += 1
					elif frame_id < 0:
						minute_index -= 1
						break

				# End hours
				if ret == keys_ESC or new_date_entered:
					break

				if minute_index >= len(minute_dirs):
					hour_index += 1
				elif minute_index < 0:
					hour_index -= 1
					break

			# End days
			if ret == keys_ESC:
				break
			if new_date_entered:
				break

			if hour_index >= len(hour_dirs):
				day_index += 1
			elif hour_index < 0:
				day_index -= 1

			if day_index < 0:
				day_index = 0


		if ret == keys_ESC or day_index > len(day_dirs):
			break


	np.save("/media/Data/r40_cX_", allFeatures)
	embed()
コード例 #2
0
def main(deviceID, record, baseDir, frameDifferencePercent, getSkel, anonomize, viz,  imgStoreCount=10):

		'''------------ Setup Kinect ------------'''
		''' Physical Kinect '''
		depthDevice = RealTimeDevice(device=deviceID, getDepth=True, getColor=True, getSkel=getSkel)
		depthDevice.start()

		maxFramerate = 60
		minFramerate = 1.0/3.0
		motionLagTime = 3
		recentMotionTime = time.clock()

		''' ------------- Main -------------- '''

		''' Setup time-based stuff '''
		prevTime = 0
		prevFrame = 0
		prevFrameTime = 0
		currentFrame = 0;
		ms = time.clock()
		diff = 0

		prevSec = 0;
		secondCount = 0
		prevSecondCountMax = 0

		''' Ensure base folder is there '''
		if not os.path.isdir(baseDir):
				os.mkdir(baseDir)        

		depthOld = []
		colorOld = []
		backgroundModel = None

		if viz:
			import cv2
			from pyKinectTools.utils.DepthUtils import world2depth
			cv2.namedWindow("image")        



		while 1:
				# try:
				if 1:

						depthDevice.update()
						colorRaw = depthDevice.colorIm
						depthRaw8 = depthDevice.depthIm
						users = depthDevice.users
						skel = None


						if len(depthOld) == imgStoreCount:
								depthOld.pop(0)        

						''' If framerate is too fast then skip '''
						''' Keep this after update to ensure fast enough kinect refresh '''
						if (time.clock() - float(ms))*1000 < 1000.0/maxFramerate:
								continue                

						if viz and 0:
								for i in depthDevice.user.users:
										tmpPx = depthDevice.user.get_user_pixels(i)

										if depthDevice.skel_cap.is_tracking(i):
												brightness = 50
										else:
												brightness = 150
										depthRaw8 = depthRaw8*(1-np.array(tmpPx).reshape([480,640]))
										depthRaw8 += brightness*(np.array(tmpPx).reshape([480,640]))

						d = None
						d = np.array(depthRaw8)

						d /= (np.nanmin([d.max(), 2**16])/256.0)
						d = d.astype(np.uint8)

						''' Get new time info '''
						currentFrame += 1
						time_ = time.localtime()
						day = str(time_.tm_yday)
						hour = str(time_.tm_hour)
						minute = str(time_.tm_min)
						second = str(time_.tm_sec)
						ms = str(time.clock())
						ms_str = str(ms)[str(ms).find(".")+1:]


						''' Look at how much of the image has changed '''
						if depthOld != []:
								diff = np.sum(np.logical_and((depthRaw8 - depthOld[0]) > 200, (depthRaw8 - depthOld[0]) < 20000)) / 307200.0 * 100

								''' We want to watch all video for at least 5 seconds after we seen motion '''
								''' This prevents problems where there is small motion that doesn't trigger the motion detector '''
								if diff > frameDifferencePercent:
										recentMotionTime = time.clock()

						depthOld.append(depthRaw8)                                

						if anonomize:
							'''Background model'''
							if backgroundModel is None:
								bgSubtraction = AdaptiveMixtureOfGaussians(depthRaw8, maxGaussians=3, learningRate=0.2, decayRate=0.9, variance=100**2)
								backgroundModel = bgSubtraction.getModel()
								continue
							else:
								bgSubtraction.update(depthRaw8)

							backgroundModel = bgSubtraction.getModel()
							cv2.imshow("BG Model", backgroundModel/backgroundModel.max())
							foregroundMask = bgSubtraction.getForeground(thresh=100)
							''' Find people '''
							foregroundMask, _, _ = extractPeople(depthRaw8, foregroundMask, minPersonPixThresh=5000, gradientFilter=True, gradThresh=15)
						else: 
							foregroundMask = None

						''' Write to file if there has been substantial change. '''
						# if 1:
						if diff > frameDifferencePercent or time.clock()-prevFrameTime > 1/minFramerate or time.clock()-recentMotionTime < motionLagTime:
								if depthRaw8 != []:

										''' Logical time '''
										if second != prevSec:
												prevSecondCountMax = secondCount                                
												secondCount = 0
												prevSec = second
										else:
												secondCount = int(secondCount) + 1

										secondCount = str(secondCount)
										if len(ms_str) == 1:
												ms_str = '0' + ms_str
										if len(secondCount) == 1:
												secondCount = '0' + secondCount


										''' Keep track of framerate '''
										if prevTime != second:
												prevTime = second
												# print currentFrame - prevFrame, " fps. Diff = ", str(diff)[:4] + "%" #" #threads = ", len(processList), 
												print "FPS: "+ str(prevSecondCountMax) + " Diff: " + str(diff)[:4] + "%" #" #threads = ", len(processList), 
												prevFrame = currentFrame


										''' Create folder/file names '''
										depthDir = baseDir+'depth/'+day+"/"+hour+"/"+minute+"/device_"+str(deviceID)
										depthName = depthDir + "/depth_"+day+"_"+hour+"_"+minute+"_"+second+"_"+secondCount+"_"+ms_str+".png"
										
										colorDir = baseDir+'color/'+day+"/"+hour+"/"+minute+"/device_"+str(deviceID)
										colorName = colorDir + "/color_"+day+"_"+hour+"_"+minute+"_"+second+"_"+secondCount+"_"+ms_str+".jpg"
										
										if getSkel:
											skelDir = baseDir+'skel/'+day+"/"+hour+"/"+minute+"/device_"+str(deviceID)
											usersName = skelDir + "/skel_"+day+"_"+hour+"_"+minute+"_"+second+"_"+secondCount+"_"+ms_str+"_.dat"
										else:
											skelDir = None
											usersName = None

										if anonomize:
											maskDir = baseDir+'mask/'+day+"/"+hour+"/"+minute+"/device_"+str(deviceID)										
											maskName = maskDir + "/mask_"+day+"_"+hour+"_"+minute+"_"+second+"_"+secondCount+"_"+ms_str+".jpg"
										else:
											maskDir = None
											maskName = None

										''' Create folders if they doesn't exist '''
										createDirectory(depthDir)
										createDirectory(colorDir)
										if getSkel:
											createDirectory(skelDir)
										if anonomize:
											createDirectory(maskDir)

										# if not os.path.isdir(depthDir):
										# 		for p in xrange(4, len(depthDir.split("/"))+1):                         
										# 				try:
										# 						os.mkdir("/".join(depthDir.split('/')[0:p])) 
										# 						os.mkdir("/".join(colorDir.split('/')[0:p]))
										# 						if getSkel:
										# 							os.mkdir("/".join(skelDir.split('/')[0:p]))
										# 						if anonomize:
										# 							os.mkdir("/".join(maskDir.split('/')[0:p]))																
										# 				except:
										# 						# print "error making dir"
										# 						pass



										''' Save data '''
										if record:
											save_frame(depthName, depthRaw8, colorName, colorRaw, usersName, users, maskName=maskName, mask=foregroundMask)
												

										prevFrameTime = time.clock()



								''' Display skeletons '''
								if viz and getSkel:
										# print "Users: ", len(users)
										for u_key in users.keys():
												u = users[u_key]
												pt = world2depth(u.com)
												w = 10
												d[pt[0]-w:pt[0]+w, pt[1]-w:pt[1]+w] = 255
												w = 3
												if u.tracked:
														print "Joints: ", len(u.jointPositions)
														for j in u.jointPositions.keys():
																pt = world2depth(u.jointPositions[j])
																d[pt[0]-w:pt[0]+w, pt[1]-w:pt[1]+w] = 200                                                        


								if viz:
										if 1:
												cv2.imshow("imageD", d)
										if 0:
												# cv2.imshow("imageM", mask/float(mask.max()))
												cv2.imshow("imageM", colorRaw + (255-colorRaw)*(foregroundMask>0)[:,:,np.newaxis] + 50*(((foregroundMask)[:,:,np.newaxis])))
										if 1:
												cv2.imshow("imageC", colorRaw)
												# cv2.imshow("image", colorRaw + (255-colorRaw)*(foregroundMask>0)[:,:,np.newaxis] + 50*(((foregroundMask)[:,:,np.newaxis])))

										ret = cv2.waitKey(10)
										if ret >= 0:
												break
コード例 #3
0
def main(get_depth, get_color, get_skeleton, get_mask, calculate_features,
         visualize, save_anonomized, device):

    dev = device
    ret = 0
    backgroundTemplates = np.empty([1, 1, 1])
    backgroundModel = None
    backgroundCount = 20
    bgPercentage = .05
    prevDepthIm = None

    day_dirs = os.listdir('depth/')
    day_dirs = [x for x in day_dirs if x[0] != '.']
    day_dirs.sort(key=lambda x: int(x))
    hour_index = 0
    minute_index = 0

    allFeatures = []
    coms = []
    orns = []

    play_speed = 1
    new_date_entered = False
    framerate = 0
    frame_prev = 0
    frame_prev_time = time()

    day_index = 0
    while day_index < len(day_dirs):

        if new_date_entered:
            try:
                day_index = day_dirs.index(day_new)
            except:
                print "Day not found"
                day_index = 0

        dayDir = day_dirs[day_index]

        hour_dirs = os.listdir('depth/' + dayDir)
        hour_dirs = [x for x in hour_dirs if x[0] != '.']
        hour_dirs.sort(key=lambda x: int(x))
        '''Hours'''
        ''' Check for new Hours index '''
        if not new_date_entered:
            if play_speed >= 0 and ret != keys_frame_left:
                hour_index = 0
            else:
                hour_index = len(hour_dirs) - 1
        else:
            try:
                hour_index = hour_dirs.index(hour_new)
            except:
                print "Hour was not found"
                hour_index = 0

        while hour_index < len(hour_dirs):
            hourDir = hour_dirs[hour_index]

            minute_dirs = os.listdir('depth/' + dayDir + '/' + hourDir)
            minute_dirs = [x for x in minute_dirs if x[0] != '.']
            minute_dirs.sort(key=lambda x: int(x))
            '''Minutes'''
            ''' Check for new minute index '''
            if not new_date_entered:
                if play_speed >= 0 and ret != keys_frame_left:
                    minute_index = 0
                else:
                    minute_index = len(minute_dirs) - 1
            else:
                try:
                    minute_index = minute_dirs.index(minute_new)
                except:
                    print "Minute was not found"
                    minute_index = 0
            ''' Loop through this minute '''
            while minute_index < len(minute_dirs):
                minute_dir = minute_dirs[minute_index]

                # Prevent from reading hidden files
                if minute_dir[0] == '.':
                    continue

                depth_files = []
                skelFiles = []

                # For each available device:
                devices = os.listdir('depth/' + dayDir + '/' + hourDir + '/' +
                                     minute_dir)
                devices = [
                    x for x in devices if x[0] != '.' and x.find('tmp') < 0
                ]
                devices.sort()

                deviceID = "device_{0:d}".format(dev + 1)

                if not os.path.isdir('depth/' + dayDir + '/' + hourDir + '/' +
                                     minute_dir + '/' + deviceID):
                    continue
                ''' Sort files '''
                if get_depth:
                    depthTmp = os.listdir('depth/' + dayDir + '/' + hourDir +
                                          '/' + minute_dir + '/' + deviceID)
                    tmpSort = [
                        int(x.split('_')[-3]) * 100 +
                        int(formatFileString(x.split('_')[-2]))
                        for x in depthTmp
                    ]
                    depthTmp = np.array(depthTmp)[np.argsort(tmpSort)].tolist()
                    depth_files.append(
                        [x for x in depthTmp if x.find('.png') >= 0])
                if get_skeleton:
                    skelTmp = os.listdir('skel/' + dayDir + '/' + hourDir +
                                         '/' + minute_dir + '/' + deviceID)
                    tmpSort = [
                        int(x.split('_')[-4]) * 100 +
                        int(formatFileString(x.split('_')[-3]))
                        for x in skelTmp
                    ]
                    skelTmp = np.array(skelTmp)[np.argsort(tmpSort)].tolist()
                    skelFiles.append(
                        [x for x in skelTmp if x.find('.dat') >= 0])

                if len(depth_files) == 0:
                    continue

                if play_speed >= 0 and ret != keys_frame_left:
                    frame_id = 0
                else:
                    frame_id = len(depth_files[dev]) - 1

                while frame_id < len(depth_files[0]):
                    # while frame_id < len(depth_files[dev]):

                    depthFile = depth_files[0][frame_id]
                    # try:
                    if 1:
                        ''' Load Depth '''
                        if get_depth:
                            depthIm = sm.imread('depth/' + dayDir + '/' +
                                                hourDir + '/' + minute_dir +
                                                '/' + deviceID + '/' +
                                                depthFile)
                            depthIm = np.array(depthIm, dtype=np.uint16)
                        ''' Load Color '''
                        if get_color:
                            colorFile = 'color_' + depthFile[6:-4] + '.jpg'
                            colorIm = sm.imread('color/' + dayDir + '/' +
                                                hourDir + '/' + minute_dir +
                                                '/' + deviceID + '/' +
                                                colorFile)
                            # colorIm_g = colorIm.mean(-1, dtype=np.uint8)
                            colorIm_g = skimage.img_as_ubyte(
                                skimage.color.rgb2gray(colorIm))
                            # colorIm_lab = skimage.color.rgb2lab(colorIm).astype(np.uint8)
                        ''' Load Skeleton Data '''
                        if get_skeleton:
                            skelFile = 'skel_' + depthFile[6:-4] + '_.dat'
                            if os.path.isfile('skel/' + dayDir + '/' +
                                              hourDir + '/' + minute_dir +
                                              '/' + deviceID + '/' + skelFile):
                                with open(
                                        'skel/' + dayDir + '/' + hourDir +
                                        '/' + minute_dir + '/' + deviceID +
                                        '/' + skelFile, 'rb') as inFile:
                                    users = pickle.load(inFile)
                            else:
                                print "No user file:", skelFile
                            coms = [
                                users[x]['com'] for x in users.keys()
                                if users[x]['com'][2] > 0.0
                            ]
                            jointCount = 0
                            for i in users.keys():
                                user = users[i]

                        timestamp = depthFile[:-4].split(
                            '_'
                        )[1:]  # Day, hour, minute, second, millisecond, Frame number in this second
                        depthIm = np.minimum(depthIm.astype(np.float), 5000)
                        fill_image(depthIm)
                        '''Background model'''
                        if backgroundModel is None:
                            bgSubtraction = AdaptiveMixtureOfGaussians(
                                depthIm,
                                maxGaussians=3,
                                learningRate=0.01,
                                decayRate=0.02,
                                variance=300**2)
                            backgroundModel = bgSubtraction.getModel()
                            if get_color:
                                prevColorIm = colorIm_g.copy()
                            continue
                        else:
                            bgSubtraction.update(depthIm)

                        backgroundModel = bgSubtraction.getModel()
                        foregroundMask = bgSubtraction.get_foreground(
                            thresh=50)
                        ''' Find people '''
                        if get_skeleton:
                            ret = plotUsers(depthIm,
                                            users,
                                            device=deviceID,
                                            vis=True)
                        if get_mask:
                            foregroundMask, userBoundingBoxes, userLabels = extract_people(
                                depthIm,
                                foregroundMask,
                                minPersonPixThresh=1500,
                                gradientFilter=True,
                                gradThresh=100)
                        ''' Calculate user features '''
                        if calculate_features and get_color:
                            ''' Color Optical Flow '''
                            flow = getFlow(prevColorIm, colorIm_g)
                            prevColorIm = colorIm_g.copy()

                            userCount = len(userBoundingBoxes)
                            for i in xrange(userCount):
                                userBox = userBoundingBoxes[i]
                                userMask = foregroundMask == i + 1
                                allFeatures.append(
                                    computeUserFeatures(colorIm,
                                                        depthIm,
                                                        flow,
                                                        userBox,
                                                        time=timestamp,
                                                        mask=userMask,
                                                        windowSize=[96, 72],
                                                        visualise=False))
                        ''' Or get CoM + orientation '''
                        if get_mask and not calculate_features:
                            userCount = len(userBoundingBoxes)
                            for i in xrange(userCount):
                                userBox = userBoundingBoxes[i]
                                userMask = foregroundMask == i + 1
                                com, ornBasis = calculateBasicPose(
                                    depthIm, userMask)
                                coms.append(com)
                                orns.append(ornBasis[1])
                                allFeatures.append({
                                    'com': com,
                                    "orn": ornBasis,
                                    'time': timestamp
                                })
                        ''' Visualization '''
                        if visualize:
                            tmpSecond = depthFile.split("_")[-3]
                            if len(tmpSecond) == 0:
                                tmpSecond = '0' + tmpSecond
                            if get_depth:
                                vv.imshow("Depth", depthIm / 6000.)
                                vv.putText("Depth",
                                           "Day " + dayDir + " Time " +
                                           hourDir + ":" + minute_dir + ":" +
                                           tmpSecond, (5, 220),
                                           size=15)
                                vv.putText("Depth",
                                           "Play speed: " + str(play_speed) +
                                           "x", (5, 15),
                                           size=15)
                                vv.putText("Depth",
                                           str(int(framerate)) + " fps",
                                           (275, 15),
                                           size=15)

                            if get_color:
                                vv.putText(
                                    colorIm,
                                    "Day " + dayDir + " Time " + hourDir +
                                    ":" + minute_dir + " Dev#" + str(dev),
                                    (10, 220))
                                vv.imshow("I_orig", colorIm)
                                if get_mask:
                                    # vv.imshow("I", colorIm*foregroundMask[:,:,np.newaxis])
                                    vv.imshow(
                                        "I_masked", colorIm + (255 - colorIm) *
                                        (((foregroundMask)[:, :, np.newaxis])))
                            if get_mask:
                                vv.imshow(
                                    "Mask",
                                    foregroundMask.astype(np.float) /
                                    float(foregroundMask.max()))
                                # vv.imshow("BG Model", backgroundModel.astype(np.float)/float(backgroundModel.max()))
                            ''' Multi-camera map '''
                            if 0 and len(coms) > 0:
                                mapRez = [200, 200]
                                mapIm = np.zeros(mapRez)
                                coms_np = np.array(coms)
                                xs = np.minimum(
                                    np.maximum(
                                        mapRez[0] +
                                        ((coms_np[:, 2] + 500) / 3000. *
                                         mapRez[0]).astype(np.int), 0),
                                    mapRez[0] - 1)
                                ys = np.minimum(
                                    np.maximum(((coms_np[:, 0] + 500) / 1500. *
                                                mapRez[0]).astype(np.int), 0),
                                    mapRez[1] - 1)
                                mapIm[xs, ys] = 255
                                vv.imshow("Map", mapIm)
                                # scatter(coms_np[:,0], -coms_np[:,2])
                            '''3D Vis'''
                            if 0:
                                # figure = mlab.figure(1, fgcolor=(1,1,1), bgcolor=(0,0,0))
                                # from pyKinectTools.utils.DepthUtils import *
                                pts = depthIm2XYZ(depthIm).astype(np.int)
                                interval = 25
                                figure.scene.disable_render = True
                                mlab.clf()
                                # ss = mlab.points3d(-pts[::interval,0], pts[::interval,1], pts[::interval,2], colormap='Blues', vmin=1000., vmax=5000., mode='2dvertex')
                                ss = mlab.points3d(
                                    pts[::interval, 0],
                                    pts[::interval, 1],
                                    pts[::interval, 2],
                                    5. -
                                    (np.minimum(pts[::interval, 2], 5000) /
                                     float((-pts[:, 2]).max())) / 1000.,
                                    scale_factor=25.,
                                    colormap='Blues')  #, mode='2dvertex')
                                # , scale_factor=25.
                                mlab.view(azimuth=0,
                                          elevation=0,
                                          distance=3000.,
                                          focalpoint=(0, 0, 0),
                                          figure=figure)  #, reset_roll=False)
                                # mlab.roll(90)
                                currentView = mlab.view()
                                figure.scene.disable_render = False
                                mlab.draw()
                                # mlab.show()
                                # ss = mlab.points3d(pts[::interval,0], pts[::interval,1], pts[::interval,2], color=col, scale_factor=5)
                                # ss = mlab.points3d(pts[:,0], pts[:,1], pts[:,2], color=(1,1,1), scale_factor=5)

                                # ss = mlab.points3d(pts[:,0], pts[:,1], pts[:,2])
                        ''' Playback control: Look at keyboard input '''
                        ret = vv.waitKey()

                        if frame_id - frame_prev > 0:
                            framerate = (frame_id - frame_prev) / (
                                time() - frame_prev_time)
                        frame_prev = frame_id
                        frame_prev_time = time()

                        new_date_entered = False
                        if ret > 0:
                            # player_controls(ret)
                            # print "Ret is",ret

                            if ret == keys_ESC:
                                break
                            elif ret == keys_space:
                                print "Enter the following into the command line"
                                tmp = raw_input("Enter date: ")
                                day_new = tmp
                                tmp = raw_input("Enter hour: ")
                                hour_new = tmp
                                tmp = raw_input("Enter minute: ")
                                minute_new = tmp

                                print "New date:", day_new, hour_new, minute_new

                                new_date_entered = True
                                break

                            elif ret == keys_down_arrow:
                                play_speed = 0
                            elif ret == keys_left_arrow:
                                play_speed -= 1
                            elif ret == keys_right_arrow:
                                play_speed += 1
                            elif ret == keys_i:
                                embed()
                            elif ret == keys_frame_left:
                                frame_id -= 1
                            elif ret == keys_frame_right:
                                frame_id += 1
                            elif ret == keys_help:
                                display_help()

                        frame_id += play_speed

                    if save_anonomized and get_mask:
                        save_dir = 'color_masked/' + dayDir + '/' + hourDir + '/' + minute_dir + '/' + devices[
                            dev] + '/'
                        createDirectory(save_dir)
                        sm.imsave(
                            save_dir + 'colorM_' + depthFile[6:-4] + '.jpg',
                            colorIm * (1 - foregroundMask))
                    # except:
                    # print "Erroneous frame"
                    # if visualize:
                    # 	vv.imshow("D", depthIm.astype(np.float)/5000)
                    # 	ret = vv.waitKey(10)

                    # End seconds
                    if ret == keys_ESC or new_date_entered:
                        break
                    if frame_id >= len(depth_files[0]):
                        minute_index += 1
                    elif frame_id < 0:
                        minute_index -= 1
                        break

                # End hours
                if ret == keys_ESC or new_date_entered:
                    break

                if minute_index >= len(minute_dirs):
                    hour_index += 1
                elif minute_index < 0:
                    hour_index -= 1
                    break

            # End days
            if ret == keys_ESC:
                break
            if new_date_entered:
                break

            if hour_index >= len(hour_dirs):
                day_index += 1
            elif hour_index < 0:
                day_index -= 1

            if day_index < 0:
                day_index = 0

        if ret == keys_ESC or day_index > len(day_dirs):
            break

    np.save("/media/Data/r40_cX_", allFeatures)
    embed()
コード例 #4
0
def main(device_id, record, base_dir, frame_difference_percent, get_skeleton, anonomize, viz, motion_lag_time=10, min_fps=0.5):
		'''
		---parameters---
		device_id
		record
		base_dir
		frame_difference_percent
		get_skeleton
		anonomize
		viz
		motion_lag_time
		min_fps
		'''

		'''------------ Setup Kinect ------------'''
		''' Physical Kinect '''
		depthDevice = RealTimeDevice(device=device_id, get_depth=True, get_color=True, get_skeleton=get_skeleton)
		depthDevice.start()

		maxFramerate = 100
		minFramerate = min_fps
		recentMotionTime = time.time()
		imgStoreCount = 100

		''' ------------- Main -------------- '''

		''' Setup time-based stuff '''
		prevTime = 0
		prevFrame = 0
		prevFrameTime = 0
		currentFrame = 0
		ms = time.time()
		prevFPSTime = time.time()
		diff = 0

		prevSec = 0;
		secondCount = 0
		prevSecondCountMax = 0

		''' Ensure base folder is there '''
		createDirectory(base_dir)
		skel_dir = None
		skel_filename = None
		maskDir = None
		maskName = None

		depthOld = []
		backgroundModel = None

		while 1:
				# try:
				if 1:
						depthDevice.update()
						colorRaw = depthDevice.colorIm
						depthRaw = depthDevice.depthIm
						users = depthDevice.users
						skel = None

						if len(depthOld) == imgStoreCount:
								depthOld.pop(0)

						''' If framerate is too fast then skip '''
						''' Keep this after update to ensure fast enough kinect refresh '''
						if (time.time() - float(ms))*1000 < 1000.0/maxFramerate:
								continue

						''' Get new time info '''
						time_ = time.localtime()
						day = str(time_.tm_yday)
						hour = str(time_.tm_hour)
						minute = str(time_.tm_min)
						second = str(time_.tm_sec)
						ms = str(time.time())
						ms_str = ms

						''' Look at how much of the image has changed '''
						if depthOld != []:
								mask = (depthRaw != 0) * (depthOld[0] != 0)
								diff = (((depthRaw - depthOld[0]).astype(np.int16) > 200)*mask).sum() / (float(mask.sum()) * 100.)

								''' We want to watch all video for at least 5 seconds after we seen motion '''
								''' This prevents problems where there is small motion that doesn't trigger the motion detector '''
								if diff > frame_difference_percent:
										recentMotionTime = time.time()
						depthOld.append(depthRaw)

						if anonomize:
							'''Background model'''
							if backgroundModel is None:
								bgSubtraction = AdaptiveMixtureOfGaussians(depthRaw, maxGaussians=3, learningRate=0.2, decayRate=0.9, variance=100**2)
								backgroundModel = bgSubtraction.getModel()
								continue
							else:
								bgSubtraction.update(depthRaw)

							backgroundModel = bgSubtraction.getModel()
							cv2.imshow("BG Model", backgroundModel/backgroundModel.max())
							foregroundMask = bgSubtraction.get_foreground(thresh=100)
							''' Find people '''
							foregroundMask, _, _ = extract_people(depthRaw, foregroundMask, minPersonPixThresh=5000, gradientFilter=True, gradThresh=15)
						else:
							foregroundMask = None

						''' Write to file if there has been substantial change. '''
						if diff > frame_difference_percent or time.time()-prevFrameTime > 1/minFramerate or time.time()-recentMotionTime < motion_lag_time:
								currentFrame += 1
								if depthRaw != []:

										''' Logical time '''
										if second != prevSec:
												prevSecondCountMax = secondCount
												secondCount = 0
												prevSec = second
										else:
												secondCount = int(secondCount) + 1

										secondCount = str(secondCount)
										if len(ms_str) == 1:
												ms_str = '0' + ms_str
										if len(secondCount) == 1:
												secondCount = '0' + secondCount

										''' Keep track of framerate '''
										if prevTime != second:
												prevTime = second
												print "FPS: {0:.1f} Diff: {1:.1f}%".format((currentFrame-prevFrame)/(time.time()-prevFPSTime), diff)
												prevFrame = currentFrame
												prevFPSTime = time.time()

										''' Create folder/file names '''
										if record:
											if 1:
												''' Version 1. 2012 '''
												ms_str = str(ms)[str(ms).find(".")+1:]
												depth_dir = base_dir+'depth/'+day+"/"+hour+"/"+minute+"/device_"+str(device_id)
												depth_filename = depth_dir + "/depth_"+day+"_"+hour+"_"+minute+"_"+second+"_"+secondCount+"_"+ms_str+".png"

												color_dir = base_dir+'color/'+day+"/"+hour+"/"+minute+"/device_"+str(device_id)
												color_filename = color_dir + "/color_"+day+"_"+hour+"_"+minute+"_"+second+"_"+secondCount+"_"+ms_str+".jpg"

												if get_skeleton:
													skel_dir = base_dir+'skel/'+day+"/"+hour+"/"+minute+"/device_"+str(device_id)
													skel_filename = skel_dir + "/skel_"+day+"_"+hour+"_"+minute+"_"+second+"_"+secondCount+"_"+ms_str+"_.dat"
												if anonomize:
													maskDir = base_dir+'mask/'+day+"/"+hour+"/"+minute+"/device_"+str(device_id)
													maskName = maskDir + "/mask_"+day+"_"+hour+"_"+minute+"_"+second+"_"+secondCount+"_"+ms_str+".jpg"
											else:
												''' Version 2. April 2013 '''
												base_sub_dir = "{:s}device_{:d}/{:s}/{:s}/{:s}".format(base_dir,device_id,day,hour,minute)
												depth_dir = "{:s}/depth".format(base_sub_dir)
												color_dir = "{:s}/color".format(base_sub_dir)
												depth_filename = "{:s}/depth_{:s}_{:s}_{:s}_{:s}_{:s}_{:s}_.png".format(depth_dir,day,hour,minute,second,secondCount,ms_str)
												color_filename = "{:s}/color_{:s}_{:s}_{:s}_{:s}_{:s}_{:s}_.jpg".format(color_dir,day,hour,minute,second,secondCount,ms_str)

												if get_skeleton:
													skel_dir = "{:s}/skel".format(base_sub_dir)
													skel_filename = "{:s}/skel_{:s}_{:s}_{:s}_{:s}_{:s}_{:s}_.dat".format(skel_dir,day,hour,minute,second,secondCount,ms_str)

												if anonomize:
													maskDir = "{:s}/mask".format(base_sub_dir)
													maskName = "{:s}/mask_{:s}_{:s}_{:s}_{:s}_{:s}_{:s}_.jpg".format(skel_dir,day,hour,minute,second,secondCount,ms_str)

											''' Create folders if they doesn't exist '''
											createDirectory(depth_dir)
											createDirectory(color_dir)
											if get_skeleton:
												createDirectory(skel_dir)
											if anonomize:
												createDirectory(maskDir)

											''' Save data '''
											save_frame(depth_filename, depthRaw, color_filename, colorRaw, skel_filename, users, maskName=maskName, mask=foregroundMask)

										prevFrameTime = time.time()

								''' Display skeletons '''
								if viz:
									d = np.array(depthRaw)
									d /= (np.nanmin([d.max(), 2**16])/256.0)
									d = d.astype(np.uint8)

									if get_skeleton:
										for u_key in users.keys():
												u = users[u_key]
												pt = skel2depth(np.array([u.com]))[0]
												w = 10
												d[pt[1]-w:pt[1]+w, pt[0]-w:pt[0]+w] = 255
												w = 3
												if u.tracked:
														pts = skel2depth(np.array(u.jointPositions.values()), d.shape)
														d = display_skeletons(d, pts, (100,0,0), skel_type='Kinect')


									if 1:
											cv2.imshow("imageD", d)
									if 0:
											cv2.imshow("imageM", colorRaw + (255-colorRaw)*(foregroundMask>0)[:,:,np.newaxis] + 50*(((foregroundMask)[:,:,np.newaxis])))
									if 1:
											cv2.imshow("imageC", colorRaw)

									ret = cv2.waitKey(10)
									if ret >= 0:
											break