Skip to content

Commit acc61e9

Browse files
committed
add vectorization
1 parent a5cb4d2 commit acc61e9

2 files changed

Lines changed: 24 additions & 23 deletions

File tree

GEMstack/onboard/perception/spot_corner_detection.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,16 @@ def callback(self, right_cam_msg):
8282
# Now transform corners to 3D vehicle frame
8383
if len(corners) > 0:
8484
for corners_four in corners:
85-
corners_four_vehicle_frame = []
86-
for c in corners_four:
87-
c_vehicle_frame = fr_cam_2d_to_vehicle_3d(c)
88-
corners_four_vehicle_frame.append(c_vehicle_frame)
85+
corners_four_vehicle_frame = fr_cam_2d_to_vehicle_3d(corners_four)
8986
corners_3d_vehicle_frame.append(corners_four_vehicle_frame)
9087

88+
print(f"corners_3d_vehicle_frame: {corners_3d_vehicle_frame}")
9189
# Store the parking spots corners in vehicle frame
9290
self.parking_spots_corners = corners_3d_vehicle_frame
9391

9492
# Visualize
9593
if self.visualization:
96-
self.visualize(image_annotated, centers, corners, approxes, corners_3d_vehicle_frame)
94+
self.visualize(image_annotated, centers, corners, approxes)
9795

9896

9997
# All local helper functions
@@ -118,7 +116,7 @@ def process_image_msg(self, image_msg):
118116
return cv_image
119117

120118

121-
def visualize(self, image, centers, corners, approxes, corners_3d_vehicle_frame):
119+
def visualize(self, image, centers, corners, approxes):
122120
if len(corners) > 0:
123121
# Draw centers as red crosses
124122
for (cx, cy) in centers:

GEMstack/onboard/perception/utils/detection_utils.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,32 +81,35 @@ def cvtFootInch2Meter(ft, inch=0.0):
8181
[cvtFootInch2Meter(0, 140+30), cvtFootInch2Meter(0, 0 -5)-1.46+0.151], # RR
8282
])
8383

84-
def cvtOriginImgPixel2DToVehicleFrameMeter3D(TransMat, pixelPointXY):
85-
"""
86-
pixelPointXY: (u, v) in original image (pixel)
87-
TransMat: 3x3 perspective transform matrix (pixel -> real world meter)
88-
"""
89-
BASE_VEHICLE_DIST = 1.10
90-
91-
point = np.array([pixelPointXY[0], pixelPointXY[1], 1.0], dtype=np.float32).reshape(3, 1)
92-
93-
transformed = TransMat @ point
94-
transformed /= transformed[2, 0]
84+
def cvtOriginImgPixels2DToVehicleFrameMeter2D(TransMat, pixelPointXYs):
85+
BASE_VEHICLE_DIST = 1.10 # meter
86+
87+
# Add homogeneous coordinate: [u, v, 1]
88+
N = pixelPointXYs.shape[0]
89+
homogeneous_points = np.hstack([pixelPointXYs, np.ones((N, 1), dtype=np.float32)]) # (N, 3)
90+
91+
# Apply perspective transform
92+
transformed = (TransMat @ homogeneous_points.T).T # (N, 3)
93+
94+
# Normalize (divide by last coordinate)
95+
transformed /= transformed[:, [2]]
9596

96-
x_real = transformed[0, 0]
97-
y_real = transformed[1, 0]
98-
z_real = 0.0
97+
x_real = transformed[:, 0]
98+
y_real = transformed[:, 1]
99+
z_real = np.zeros_like(x_real)
99100

101+
# Convert to vehicle pointcloud coordinate
100102
x_pc = -y_real
101103
y_pc = -x_real
102104
z_pc = z_real
103105

104-
return np.array([x_pc + BASE_VEHICLE_DIST, y_pc, z_pc], dtype=np.float32)
106+
# Return: x + front base distance offset
107+
return np.stack([x_pc + BASE_VEHICLE_DIST, y_pc, z_pc], axis=1)
105108

106109

107-
def fr_cam_2d_to_vehicle_3d(fr_2d_pt):
110+
def fr_cam_2d_to_vehicle_3d(fr_2d_pts):
108111
TransMat = cv2.getPerspectiveTransform( np.float32(pixelFrontRightCamListXY),
109112
np.float32(worldFrontRightCamListXY))
110113

111-
result = cvtOriginImgPixel2DToVehicleFrameMeter3D(TransMat, fr_2d_pt)
114+
result = cvtOriginImgPixels2DToVehicleFrameMeter2D(TransMat, fr_2d_pts)
112115
return result.tolist()

0 commit comments

Comments
 (0)