|  | @@ -57,7 +57,8 @@ def rotationMatrixEulerAngles(rotMatrix):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  while True:
 | 
	
		
			
				|  |  |      ret, frame = cap.read()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +    center_y, center_x = frame.shape[0]//2, frame.shape[1]//2
 | 
	
		
			
				|  |  | +    cv2.drawMarker(frame, (center_x, center_y), (0,0,255), markerType=cv2.MARKER_CROSS, markerSize=10, thickness=1, line_type=cv2.LINE_AA)
 | 
	
		
			
				|  |  |      if not ret:
 | 
	
		
			
				|  |  |          break
 | 
	
		
			
				|  |  |      gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 | 
	
	
		
			
				|  | @@ -81,7 +82,7 @@ while True:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              # Chuyển đổi rVec thành ma trận quay R
 | 
	
		
			
				|  |  |              R, _ = cv2.Rodrigues(rVec[i])
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              # Tính toán tọa độ các điểm của marker so với camera
 | 
	
		
			
				|  |  |              object_points = np.array([
 | 
	
		
			
				|  |  |                  [-MARKER_SIZE / 2, MARKER_SIZE / 2, 0],
 | 
	
	
		
			
				|  | @@ -99,10 +100,10 @@ while True:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              R, _ = cv2.Rodrigues(rVec[i])        # Chuyển rVec sang ma trận quay
 | 
	
		
			
				|  |  | -            R_inv = np.linalg.inv(R)            # Lấy nghịch đảo của ma trận quay (tức là R^T nếu R là trực giao)
 | 
	
		
			
				|  |  | +            R_inv = R.T           # Lấy nghịch đảo của ma trận quay (tức là R^T nếu R là trực giao)
 | 
	
		
			
				|  |  |              position = - R_inv @ tVec[i].reshape(3, 1)  # Tính vị trí camera trong hệ marker
 | 
	
		
			
				|  |  |              position = position.reshape(3,)
 | 
	
		
			
				|  |  | -            # position += default_positions[ids[0]]
 | 
	
		
			
				|  |  | +            position += default_positions[ids[0]]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              angles = rotationMatrixEulerAngles(R.T)
 | 
	
		
			
				|  |  |              markers[f'marker {ids[0]}'] = np.hstack((position, angles))
 | 
	
	
		
			
				|  | @@ -114,26 +115,27 @@ while True:
 | 
	
		
			
				|  |  |                      top_right,
 | 
	
		
			
				|  |  |                      cv2.FONT_HERSHEY_PLAIN,
 | 
	
		
			
				|  |  |                      1.3,
 | 
	
		
			
				|  |  | -                    (0, 0, 255),
 | 
	
		
			
				|  |  | -                    2,
 | 
	
		
			
				|  |  | -                    cv2.LINE_AA,
 | 
	
		
			
				|  |  | +                    (0, 0, 255), 2, cv2.LINE_AA
 | 
	
		
			
				|  |  |                  )
 | 
	
		
			
				|  |  | -            if ids[0] == 3:
 | 
	
		
			
				|  |  | -                position += np.array([2.5, 2.5, 0])
 | 
	
		
			
				|  |  | -            if ids[0] == 4:
 | 
	
		
			
				|  |  | -                position += np.array([-2.5, 12.8, 0.])
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          # Nếu marker trung tâm (marker 0) xuất hiện thì chỉ cần lấy vị trí so với marker này
 | 
	
		
			
				|  |  | -        # if 'marker 0' in markers.keys():
 | 
	
		
			
				|  |  | -        #     cam_position = markers['marker 0']
 | 
	
		
			
				|  |  | -        # # Nếu không, xét trung bình các marker
 | 
	
		
			
				|  |  | -        # else:
 | 
	
		
			
				|  |  | -        #     cam_position = np.array([0., 0., 0., 0., 0., 0.])
 | 
	
		
			
				|  |  | -        #     for v in markers.values():
 | 
	
		
			
				|  |  | -        #         cam_position += v
 | 
	
		
			
				|  |  | -        #     cam_position /= len(markers)
 | 
	
		
			
				|  |  | +        if 'marker 0' in markers.keys():
 | 
	
		
			
				|  |  | +            cam_position = markers['marker 0']
 | 
	
		
			
				|  |  | +        # Nếu không, xét trung bình các marker
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            cam_position = np.array([0., 0., 0., 0., 0., 0.])
 | 
	
		
			
				|  |  | +            for v in markers.values():
 | 
	
		
			
				|  |  | +                cam_position += v
 | 
	
		
			
				|  |  | +            cam_position /= len(markers)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          print(','.join(f'{i:.1f}' for i in position.tolist()))
 | 
	
		
			
				|  |  | +        cv2.putText(
 | 
	
		
			
				|  |  | +            frame,
 | 
	
		
			
				|  |  | +            ','.join(f'{i:.1f}' for i in position.tolist()),
 | 
	
		
			
				|  |  | +            (10, 20),
 | 
	
		
			
				|  |  | +            cv2.FONT_HERSHEY_PLAIN,
 | 
	
		
			
				|  |  | +            1.,
 | 
	
		
			
				|  |  | +            (0, 255, 0), 1, cv2.LINE_AA
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  |      if visualization:
 | 
	
		
			
				|  |  |          cv2.imshow("frame", frame)
 | 
	
		
			
				|  |  |          key = cv2.waitKey(1)
 |