Fix the intrinsix matrix if vertices of the bounding box is behind the camera
This commit is contained in:
parent
20a4a46182
commit
063cc9d902
|
@ -50,10 +50,15 @@ camera.listen(image_queue.put)
|
||||||
We want to take 3D points from the simulation and project them into the 2D plane of the camera. Firstly, we need to construct the camera projection matrix:
|
We want to take 3D points from the simulation and project them into the 2D plane of the camera. Firstly, we need to construct the camera projection matrix:
|
||||||
|
|
||||||
```py
|
```py
|
||||||
def build_projection_matrix(w, h, fov):
|
def build_projection_matrix(w, h, fov, is_behind_camera=False):
|
||||||
focal = w / (2.0 * np.tan(fov * np.pi / 360.0))
|
focal = w / (2.0 * np.tan(fov * np.pi / 360.0))
|
||||||
K = np.identity(3)
|
K = np.identity(3)
|
||||||
K[0, 0] = K[1, 1] = focal
|
|
||||||
|
if is_behind_camera:
|
||||||
|
K[0, 0] = K[1, 1] = -focal
|
||||||
|
else:
|
||||||
|
K[0, 0] = K[1, 1] = focal
|
||||||
|
|
||||||
K[0, 2] = w / 2.0
|
K[0, 2] = w / 2.0
|
||||||
K[1, 2] = h / 2.0
|
K[1, 2] = h / 2.0
|
||||||
return K
|
return K
|
||||||
|
@ -99,6 +104,7 @@ fov = camera_bp.get_attribute("fov").as_float()
|
||||||
|
|
||||||
# Calculate the camera projection matrix to project from 3D -> 2D
|
# Calculate the camera projection matrix to project from 3D -> 2D
|
||||||
K = build_projection_matrix(image_w, image_h, fov)
|
K = build_projection_matrix(image_w, image_h, fov)
|
||||||
|
K_b = build_projection_matrix(image_w, image_h, fov, is_behind_camera=True)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Bounding boxes
|
## Bounding boxes
|
||||||
|
@ -191,7 +197,7 @@ while True:
|
||||||
forward_vec = vehicle.get_transform().get_forward_vector()
|
forward_vec = vehicle.get_transform().get_forward_vector()
|
||||||
ray = bb.location - vehicle.get_transform().location
|
ray = bb.location - vehicle.get_transform().location
|
||||||
|
|
||||||
if forward_vec.dot(ray) > 1:
|
if forward_vec.dot(ray) > 0:
|
||||||
# Cycle through the vertices
|
# Cycle through the vertices
|
||||||
verts = [v for v in bb.get_world_vertices(carla.Transform())]
|
verts = [v for v in bb.get_world_vertices(carla.Transform())]
|
||||||
for edge in edges:
|
for edge in edges:
|
||||||
|
@ -249,6 +255,11 @@ cv2.waitKey(1)
|
||||||
Now we use a modified game loop to draw the vehicle bounding boxes:
|
Now we use a modified game loop to draw the vehicle bounding boxes:
|
||||||
|
|
||||||
```py
|
```py
|
||||||
|
def point_in_canvas(pos, img_h, img_w):
|
||||||
|
"""Return true if point is in canvas"""
|
||||||
|
if (pos[0] >= 0) and (pos[0] < img_w) and (pos[1] >= 0) and (pos[1] < img_h):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
# Retrieve and reshape the image
|
# Retrieve and reshape the image
|
||||||
|
@ -279,12 +290,28 @@ while True:
|
||||||
forward_vec = vehicle.get_transform().get_forward_vector()
|
forward_vec = vehicle.get_transform().get_forward_vector()
|
||||||
ray = npc.get_transform().location - vehicle.get_transform().location
|
ray = npc.get_transform().location - vehicle.get_transform().location
|
||||||
|
|
||||||
if forward_vec.dot(ray) > 1:
|
if forward_vec.dot(ray) > 0:
|
||||||
p1 = get_image_point(bb.location, K, world_2_camera)
|
|
||||||
verts = [v for v in bb.get_world_vertices(npc.get_transform())]
|
verts = [v for v in bb.get_world_vertices(npc.get_transform())]
|
||||||
for edge in edges:
|
for edge in edges:
|
||||||
p1 = get_image_point(verts[edge[0]], K, world_2_camera)
|
p1 = get_image_point(verts[edge[0]], K, world_2_camera)
|
||||||
p2 = get_image_point(verts[edge[1]], K, world_2_camera)
|
p2 = get_image_point(verts[edge[1]], K, world_2_camera)
|
||||||
|
|
||||||
|
p1_in_canvas = point_in_canvas(p1, image_h, image_w)
|
||||||
|
p2_in_canvas = point_in_canvas(p2, image_h, image_w)
|
||||||
|
|
||||||
|
if not p1_in_canvas and not p2_in_canvas:
|
||||||
|
continue
|
||||||
|
|
||||||
|
ray0 = verts[edge[0]] - camera.get_transform().location
|
||||||
|
ray1 = verts[edge[1]] - camera.get_transform().location
|
||||||
|
cam_forward_vec = camera.get_transform().get_forward_vector()
|
||||||
|
|
||||||
|
# One of the vertex is behind the camera
|
||||||
|
if not (cam_forward_vec.dot(ray0) > 0):
|
||||||
|
p1 = get_image_point(verts[edge[0]], K_b, world_2_camera)
|
||||||
|
if not (cam_forward_vec.dot(ray1) > 0):
|
||||||
|
p2 = get_image_point(verts[edge[1]], K_b, world_2_camera)
|
||||||
|
|
||||||
cv2.line(img, (int(p1[0]),int(p1[1])), (int(p2[0]),int(p2[1])), (255,0,0, 255), 1)
|
cv2.line(img, (int(p1[0]),int(p1[1])), (int(p2[0]),int(p2[1])), (255,0,0, 255), 1)
|
||||||
|
|
||||||
cv2.imshow('ImageWindowName',img)
|
cv2.imshow('ImageWindowName',img)
|
||||||
|
@ -330,7 +357,7 @@ while True:
|
||||||
forward_vec = vehicle.get_transform().get_forward_vector()
|
forward_vec = vehicle.get_transform().get_forward_vector()
|
||||||
ray = npc.get_transform().location - vehicle.get_transform().location
|
ray = npc.get_transform().location - vehicle.get_transform().location
|
||||||
|
|
||||||
if forward_vec.dot(ray) > 1:
|
if forward_vec.dot(ray) > 0:
|
||||||
p1 = get_image_point(bb.location, K, world_2_camera)http://host.robots.ox.ac.uk/pascal/VOC/
|
p1 = get_image_point(bb.location, K, world_2_camera)http://host.robots.ox.ac.uk/pascal/VOC/
|
||||||
verts = [v for v in bb.get_world_vertices(npc.get_transform())]
|
verts = [v for v in bb.get_world_vertices(npc.get_transform())]
|
||||||
x_max = -10000
|
x_max = -10000
|
||||||
|
@ -408,7 +435,7 @@ while True:
|
||||||
if dist < 50:
|
if dist < 50:
|
||||||
forward_vec = vehicle.get_transform().get_forward_vector()
|
forward_vec = vehicle.get_transform().get_forward_vector()
|
||||||
ray = npc.get_transform().location - vehicle.get_transform().location
|
ray = npc.get_transform().location - vehicle.get_transform().location
|
||||||
if forward_vec.dot(ray) > 1:
|
if forward_vec.dot(ray) > 0:
|
||||||
p1 = get_image_point(bb.location, K, world_2_camera)
|
p1 = get_image_point(bb.location, K, world_2_camera)
|
||||||
verts = [v for v in bb.get_world_vertices(npc.get_transform())]
|
verts = [v for v in bb.get_world_vertices(npc.get_transform())]
|
||||||
x_max = -10000
|
x_max = -10000
|
||||||
|
|
Loading…
Reference in New Issue