Beispiel #1
0
def detect_wand(x2ds_data, x2ds_splits, mats, thresh=20. / 2000., x3d_threshold=1000000.):
	Ps = np.array([m[2] / np.linalg.norm(m[2][0, :3]) for m in mats], dtype=np.float32)
	wand_x3ds = np.array([[160, 0, 0], [0, 0, 0], [-80, 0, 0], [0, 0, -120], [0, 0, -240]], dtype=np.float32)
	x2ds_labels = -np.ones(x2ds_data.shape[0], dtype=np.int32)
	ISCV.label_T_wand(x2ds_data, x2ds_splits, x2ds_labels, 2.0, 0.5, 0.01, 0.07)
	x2ds_labels2 = x2ds_labels.copy()
	count = np.sum(x2ds_labels2 != -1) / 5
	if count < 3: return None, None, None
	x3ds, x3ds_labels, E_x2ds_single, x2ds_single_labels = Recon.solve_x3ds(x2ds_data, x2ds_splits, x2ds_labels2, Ps)
	count = ISCV.project_and_clean(x3ds, Ps, x2ds_data, x2ds_splits, x2ds_labels, x2ds_labels2, thresh ** 2, thresh ** 2, x3d_threshold)
	if count < 3: return None, None, None
	x3ds, x3ds_labels, E_x2ds_single, x2ds_single_labels = Recon.solve_x3ds(x2ds_data, x2ds_splits, x2ds_labels2, Ps)
	assert np.all(x3ds_labels == [0, 1, 2, 3, 4]), 'ERROR: Labels do not match' # skip if somehow not all points seen
	assert np.max(x3ds ** 2) < 1e9, 'ERROR: Values out of bounds' + repr(x3ds)
	mat = rigid_align_points(wand_x3ds, x3ds)
	x3ds = np.dot(wand_x3ds, mat[:3, :3].T) + mat[:, 3]
	return x3ds, x3ds_labels, x2ds_labels2
Beispiel #2
0
def generate_wand_correspondences(wand_frames, mats2, camera_solved, rigid_filter=True, error_thresholds=None, x3d_threshold=1000000.):
	"""
	Args:
		wand_frames
		mats2
		camera_solved
		rigid_filter = True
		error_thresholds = None
		
	Returns:
		x2s_cameras
		x3s_cameras
		frames_cameras
		num_kept_frames
		
	Requires:
		ISCV.undistort_points
		ISCV.label_T_wand
		Recon.solve_x3ds
		ISCV.project_and_clean
		
	"""

	def get_order(labels):
		"""
		Return the x2d index of the five points of the T Wand
		
		Args:
			labels (int[]): 
			
		Returns:
			int[5]: "order" label indexes
			
		"""
		try:
			l = list(labels)
			order = [l.index(x) for x in xrange(5)]
			return order
		except:
			return None
	
	numCameras = len(mats2)
	Ps2 = np.array([m[2]/np.linalg.norm(m[2][0,:3]) for m in mats2],dtype=np.float32)
	x2ds_frames = []
	x2ds_labels_frames = []
	x2ds_splits_frames = []
	x3ds_frames = []
	# TODO wand geo should be passed in? must be compatible with the label_T_wand
	wand_x3ds = np.array([[160,0,0],[0,0,0],[-80,0,0],[0,0,-120],[0,0,-240]],dtype=np.float32)
	thresh = (20./2000.)**2 if error_thresholds is None else error_thresholds**2 # projection must be close to be included for intersection
	num_kept_frames = 0
	for fi,(x2ds_raw_data,x2ds_splits) in enumerate(wand_frames): # intersect over all frames with current solved cameras
		x2ds_data,_ = undistort_dets(x2ds_raw_data, x2ds_splits, mats2)
		x2ds_labels = -np.ones(x2ds_data.shape[0],dtype=np.int32)
		ISCV.label_T_wand(x2ds_data, x2ds_splits, x2ds_labels, 2.0, 0.5, 0.01, 0.07)
		x2ds_labels2 = x2ds_labels.copy()
		for cs,c0,c1 in zip(camera_solved,x2ds_splits[:-1],x2ds_splits[1:]): # remove labels for unsolved cameras
			if not cs: x2ds_labels2[c0:c1] = -1
		count = np.sum(x2ds_labels2 != -1)/5
		if count >= 3: # only use points seen in three solved cameras
			x3ds, x3ds_labels, E_x2ds_single, x2ds_single_labels = Recon.solve_x3ds(x2ds_data, x2ds_splits, x2ds_labels2, Ps2)
			count = ISCV.project_and_clean(x3ds, Ps2, x2ds_data, x2ds_splits, x2ds_labels, x2ds_labels2, thresh, thresh, x3d_threshold)
			if count < 3: continue
			x3ds, x3ds_labels, E_x2ds_single, x2ds_single_labels = Recon.solve_x3ds(x2ds_data, x2ds_splits, x2ds_labels2, Ps2)
			#if not np.all(x3ds_labels == [0,1,2,3,4]): print 'ERROR'; continue # skip if somehow not all points seen
			#if np.max(x3ds**2) > 1e9: print 'ERROR oh oh',x3ds; continue
			if rigid_filter: # enforce x3ds must be a rigid transform of the wand
				mat = rigid_align_points(wand_x3ds, x3ds)
				x3ds = np.dot(wand_x3ds,mat[:3,:3].T) + mat[:,3]
			for cs,c0,c1 in zip(camera_solved,x2ds_splits[:-1],x2ds_splits[1:]): #copy 'cleaned' labels for solved cameras to avoid bad data
				if cs: x2ds_labels[c0:c1] = x2ds_labels2[c0:c1]
			x2ds_frames.append(x2ds_raw_data)
			x2ds_splits_frames.append(x2ds_splits)
			x2ds_labels_frames.append(x2ds_labels) # CBD not x2ds_labels2, otherwise we can't add cameras!
			x3ds_frames.append(x3ds)
			num_kept_frames+=1

	# TODO collapse this into the code above and clean up
	x2s_cameras,x3s_cameras,frames_cameras = [],[],[]
	for ci in xrange(numCameras):
		orders = [get_order(xlf[xsf[ci]:xsf[ci+1]]) for xlf,xsf in zip(x2ds_labels_frames,x2ds_splits_frames)]
		which_frames = np.where([o is not None for o in orders])[0]
		if len(which_frames) == 0:
			x2s,x3s = np.zeros((0,2),dtype=np.float32),np.zeros((0,3),dtype=np.float32)
		else:
			x2s = np.vstack([x2ds_frames[fi][x2ds_splits_frames[fi][ci]:x2ds_splits_frames[fi][ci+1]][orders[fi]] for fi in which_frames])
			x3s = np.vstack([x3ds_frames[fi] for fi in which_frames])
		x2s_cameras.append(x2s)
		x3s_cameras.append(x3s)
		frames_cameras.append(which_frames)

	return x2s_cameras,x3s_cameras,frames_cameras,num_kept_frames