72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
"""
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Manually select points to get the projection map
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
"""
|
|
import argparse
|
|
import os
|
|
import numpy as np
|
|
import cv2
|
|
from surround_view import FisheyeCameraModel, PointSelector, display_image
|
|
import surround_view.param_settings as settings
|
|
|
|
|
|
def get_projection_map(camera_model, image):
|
|
und_image = camera_model.undistort(image)
|
|
name = camera_model.camera_name
|
|
gui = PointSelector(und_image, title=name)
|
|
dst_points = settings.project_keypoints[name]
|
|
choice = gui.loop()
|
|
if choice > 0:
|
|
src = np.float32(gui.keypoints)
|
|
dst = np.float32(dst_points)
|
|
camera_model.project_matrix = cv2.getPerspectiveTransform(src, dst)
|
|
proj_image = camera_model.project(und_image)
|
|
|
|
ret = display_image("Bird's View", proj_image)
|
|
if ret > 0:
|
|
return True
|
|
if ret < 0:
|
|
cv2.destroyAllWindows()
|
|
|
|
return False
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("-camera", required=True,
|
|
choices=["front", "back", "left", "right"],
|
|
help="The camera view to be projected")
|
|
parser.add_argument("-scale", nargs="+", default=None,
|
|
help="scale the undistorted image")
|
|
parser.add_argument("-shift", nargs="+", default=None,
|
|
help="shift the undistorted image")
|
|
args = parser.parse_args()
|
|
|
|
if args.scale is not None:
|
|
scale = [float(x) for x in args.scale]
|
|
else:
|
|
scale = (1.0, 1.0)
|
|
|
|
if args.shift is not None:
|
|
shift = [float(x) for x in args.shift]
|
|
else:
|
|
shift = (0, 0)
|
|
|
|
camera_name = args.camera
|
|
camera_file = os.path.join(os.getcwd(), "yaml", camera_name + ".yaml")
|
|
image_file = os.path.join(os.getcwd(), "images", camera_name + ".png")
|
|
image = cv2.imread(image_file)
|
|
camera = FisheyeCameraModel(camera_file, camera_name)
|
|
camera.set_scale_and_shift(scale, shift)
|
|
success = get_projection_map(camera, image)
|
|
if success:
|
|
print("saving projection matrix to yaml")
|
|
camera.save_data()
|
|
else:
|
|
print("failed to compute the projection map")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|