|
@@ -57,7 +57,8 @@ def rotationMatrixEulerAngles(rotMatrix):
|
|
|
|
|
|
|
|
while True:
|
|
while True:
|
|
|
ret, frame = cap.read()
|
|
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:
|
|
if not ret:
|
|
|
break
|
|
break
|
|
|
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
|
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
|
|
# Chuyển đổi rVec thành ma trận quay R
|
|
|
R, _ = cv2.Rodrigues(rVec[i])
|
|
R, _ = cv2.Rodrigues(rVec[i])
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
# Tính toán tọa độ các điểm của marker so với camera
|
|
# Tính toán tọa độ các điểm của marker so với camera
|
|
|
object_points = np.array([
|
|
object_points = np.array([
|
|
|
[-MARKER_SIZE / 2, MARKER_SIZE / 2, 0],
|
|
[-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, _ = 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 = - R_inv @ tVec[i].reshape(3, 1) # Tính vị trí camera trong hệ marker
|
|
|
position = position.reshape(3,)
|
|
position = position.reshape(3,)
|
|
|
- # position += default_positions[ids[0]]
|
|
|
|
|
|
|
+ position += default_positions[ids[0]]
|
|
|
|
|
|
|
|
angles = rotationMatrixEulerAngles(R.T)
|
|
angles = rotationMatrixEulerAngles(R.T)
|
|
|
markers[f'marker {ids[0]}'] = np.hstack((position, angles))
|
|
markers[f'marker {ids[0]}'] = np.hstack((position, angles))
|
|
@@ -114,26 +115,27 @@ while True:
|
|
|
top_right,
|
|
top_right,
|
|
|
cv2.FONT_HERSHEY_PLAIN,
|
|
cv2.FONT_HERSHEY_PLAIN,
|
|
|
1.3,
|
|
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
|
|
# 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()))
|
|
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:
|
|
if visualization:
|
|
|
cv2.imshow("frame", frame)
|
|
cv2.imshow("frame", frame)
|
|
|
key = cv2.waitKey(1)
|
|
key = cv2.waitKey(1)
|