def main(get_depth, get_color, get_skeleton, get_mask, calculate_features, visualize, save_anonomized):

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

	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()

	# for day_index in day_dirs:
	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
		# print "New day:", day_index

		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):
			# print "New hour:", hour_index
			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):
				# print "New min:", minute_index
				minute_dir = minute_dirs[minute_index]

				if minute_dir[0] == '.': # Prevent from reading hidden files
					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()

				for deviceID in ['device_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
				# for dev, depthFile in multiCameraTimeline(depth_files):
				if deviceID == 'device_2':
					dev = 1
				else:
					dev = 0


				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[dev]):

					depthFile = depth_files[dev][frame_id]
					# try:
					if 1:
						''' Load Depth '''
						if get_depth:
							depthIm = sm.imread('depth/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+devices[dev]+'/'+depthFile)
							depthIm = np.array(depthIm, dtype=np.uint16)
						''' Load Color '''
						if get_color:
							colorFile = 'color_'+depthFile[6:-4]+'.jpg'
							# pdb.set_trace()
							colorIm = sm.imread('color/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+devices[dev]+'/'+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 Mask '''
						# if get_mask:
						# 	maskIm = sm.imread('depth/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+devices[dev]+'/'+depthFile[:-4]+"_mask.jpg") > 100
						# 	depthIm = depthIm*(1-maskIm)+maskIm*5000

						''' Load Skeleton Data '''
						if get_skeleton:
							skelFile = 'skel_'+depthFile[6:-4]+'_.dat'
							if os.path.isfile('skel/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+devices[dev]+'/'+skelFile):
								with open('skel/'+dayDir+'/'+hourDir+'/'+minute_dir+'/'+devices[dev]+'/'+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)
						fillImage(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.getForeground(thresh=50)

						''' Find people '''
						if get_skeleton:
							ret = plotUsers(depthIm, users, device=devices[dev], vis=True)
						if get_mask:
							foregroundMask, userBoundingBoxes, userLabels = extractPeople(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/5000.)								
								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 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:
							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
						# print frame_id

					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[dev]):
						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()
# sequenceFrameNames = files[1200:1300]
sequenceFrameNames = files[::500]
# sequenceFrameNames = files[7200:7230] #:7300
imgs = []
for i in sequenceFrameNames:
    imgs.append(scipy.misc.imread(dataDir+str(i)+'.jpg'))
imgs = np.array(imgs)

''' Get posMat from individual image '''
# t=7
t=13
im = imgs[t]
objectNum = 0
# posMatFull = posImage2XYZ(im, 500, 1250)
posMatFull = posImage2XYZ(im, 500, 2000)
imLabels, objSlices, objInds = extractPeople(posMatFull[:,:,2], 10000, True)
if len(objInds)!=0:
	t += 1
assert len(objInds)!=0, "Error: No objects"
	
posMat = posMatFull[objSlices[objectNum]]
for i in range(3):
	posMat[:,:,i] *= (imLabels[objSlices[objectNum]]==objInds[objectNum])
posMat = removeNoise(posMat, thresh=500)
xyz = posMat[(posMat[:,:,2]>0)*(posMat[:,:,0]!=0),:]

''' Get geodesic extrema '''
t1 = time.time()
regions, regionXYZ, regionLabels, edgeDict = regionGraph(posMat, pixelSize=1500)
regionPos = [x[2] for x in regionLabels[1:]]
regionPos.insert(0, [0,0])