Example #1
0
def test_f():
    """
    Test f(input, K, obj_point)
    :return:
    """

    alpha = 0
    belt = 0
    r = 1
    input = [0.0, 0.0, 0.0]
    input[0] = alpha
    input[1] = belt
    input[2] = r

    cam = Camera()
    cam.set_K(fx=800, fy=800, cx=640 / 2., cy=480 / 2.)
    cam.set_width_heigth(640, 480)
    cam.set_R_mat(
        Rt_matrix_from_euler_t.R_matrix_from_euler_t(0, np.deg2rad(0), 0))
    cam.set_t(0., 0., 0.5, 'world')
    pl = CircularPlane(origin=np.array([0., 0., 0.]),
                       normal=np.array([0, 0, 1]),
                       radius=0.15,
                       n=4)
    x1 = round(pl.radius * np.cos(np.deg2rad(45)), 3)
    y1 = round(pl.radius * np.sin(np.deg2rad(45)), 3)
    objectPoints_square = np.array([[x1, -x1, -x1, x1], [y1, y1, -y1, -y1],
                                    [0., 0., 0., 0.], [1., 1., 1., 1.]])

    new_objectPoints = np.copy(objectPoints_square)

    cms.f(input, cam.K, new_objectPoints)
def accuracy_func(plane_size=(0.3, 0.3),camera_intrinsic_params=(800.,800.,320.,240.), theta_params=(0.0, 180.0, 5), r_params=(0.1, 2.0, 5), z=0, y=0):
    """
    Calculate the accuracy degree of given position y,z in world

    y:
    z:
    :return 0 means the cam is out of range of marker
    """

    # --------------------------------------accuracy_degree_distribution---------------------
    cam = Camera()
    fx = camera_intrinsic_params[0]
    fy = camera_intrinsic_params[1]
    cx = camera_intrinsic_params[2]
    cy = camera_intrinsic_params[3]
    cam.set_K(fx=fx, fy=fy, cx=cx, cy=cy)
    width = cx * 2
    height = cy * 2
    cam.set_width_heigth(width, height)

    cams,accuracy_mat = create_cam_distribution_in_YZ(cam=None, plane_size=plane_size, theta_params=theta_params, r_params=r_params,
                                  plot=False)

    accuracy_mat = np.zeros([30, 60])  # define the new acc_mat as 30 x 30 ,which means 3m x 3m area in real world and each cell is 0.1m x 0.1m
    inputX, inputY, inputZ, input_ippe1_t, input_ippe1_R, input_ippe2_t, input_ippe2_R, input_pnp_t, input_pnp_R, input_transfer_error, display_mat,accuracy_mat_new = bf.heightGetCondNum(cams,accuracy_mat,theta_params, r_params)

    # print accuracy_mat_new
    # --------------------------------------------------------------------------------------------
    degree = 5  # divide accuracy into 5 degree
    r = np.sqrt(z * z + y * y)
    # out of range
    if r >= r_params[1] or r == 0:
        return 0
    else:
        # according to radius and angle of cam, Calculate the index of accuracy matrix
        r_begin = r_params[0]
        r_end = r_params[1]
        r_num = r_params[2]
        r_step = (r_end - r_begin) / (r_num - 1)
        # print "r_step",r_step
        half_r_step = r_step / 2.0
        r_num1 = math.floor(r / r_step)
        r_num2 = math.floor((r - r_step * r_num1) / half_r_step)
        row_index = int(r_num1 + r_num2)  # row index

        angle_begin = theta_params[0]
        angle_end = theta_params[1]
        angle_num = theta_params[2]
        angle_step = (angle_end - angle_begin) / (angle_num - 1)
        # print "angle_step",angle_step
        half_angle_step = angle_step / 2.0
        angle = np.rad2deg(np.arccos(y / r))  # deg
        angle_num1 = math.floor(angle / angle_step)
        angle_num2 = math.floor((angle - angle_step * angle_num1) / half_angle_step)
        col_index = int(angle_num1 + angle_num2)
        # print "row_index,col_index",row_index,col_index
        acc_degree = accuracy_mat_new[row_index, col_index]
        # print "acc_degree",acc_degree
        return acc_degree
def cam_distribution_study():
    """
    cam Distribution in 3D, show the cond num distribution for each cam position
    """
    number_of_points = 4
    # TODO Change the radius of circular plane
    pl = CircularPlane(origin=np.array([0., 0., 0.]), normal=np.array([0, 0, 1]), radius=0.15, n=4)
    pl.random(n=number_of_points, r=0.01, min_sep=0.01)
    plane_size = (0.3, 0.3)
    cam = Camera()
    cam.set_K(fx=800, fy=800, cx=640 / 2., cy=480 / 2.)
    cam.set_width_heigth(640, 480)
    # TODO cam distribution position PARAMETER CHANGE!!!
    # cams = create_cam_distribution(cam, plane_size,
    #                                theta_params=(0, 360, 30), phi_params=(0, 70, 10),
    #                                r_params=(0.2, 2.0, 20), plot=False)
    angle_begin = 0.0#0.0
    angle_end = 180.0#180.0
    angle_num = 37 #37 TODO need to set
    # angle_step = (angle_end - angle_begin) / (angle_num - 1)
    theta_params = (angle_begin,angle_end,angle_num)

    r_begin = 0.1 # we cant set this as 0.0 !!! avoid float error!!!
    r_end = 3.0
    r_num = 30 #30 TODO need to set
    # r_step = (r_end - r_begin) / (r_num - 1)
    r_params = (r_begin,r_end,r_num)

    cams,accuracy_mat = create_cam_distribution_in_YZ(cam=None, plane_size=(0.3, 0.3), theta_params=theta_params, r_params=r_params,
                                  plot=False)
    # TODO
    accuracy_mat = np.zeros([30, 60])# define the new acc_mat as 30 x 30 ,which means 3m x 3m area in real world and each cel
    inputX, inputY, inputZ, input_ippe1_t, input_ippe1_R, input_ippe2_t, input_ippe2_R, input_pnp_t, input_pnp_R, input_transfer_error, display_mat, accuracy_mat_new = bf.heightGetCondNum(
        cams, accuracy_mat, theta_params, r_params)
    # print "accuracy_mat distribution:\n",accuracy_mat_new
    print "----------------Start to show:-------------------"
    # print "accuracy_mat_new\n",accuracy_mat_new
    # save accuracy matrix in file
    print "-----accuracy_mat_new---------\n",accuracy_mat_new
    smtf.saveMatToFile(accuracy_mat_new)
    # plot condition number distribution
    # dc.displayCondNumDistribution(display_mat)
    # plot the Rt error
    # dc.displayError_YZ_plane_2D(inputY, inputZ, input_ippe1_t, input_ippe1_R, input_ippe2_t, input_ippe2_R, input_pnp_t, input_pnp_R)
    # dc.displayError_YZ_plane_3D(inputY, inputZ, input_ippe1_t, input_ippe1_R, input_ippe2_t, input_ippe2_R, input_pnp_t,
    #                           input_pnp_R, input_transfer_error)
    # dc.displayRTError3D_ippe12(inputY, inputZ, input_ippe1_t, input_ippe1_R, input_ippe2_t, input_ippe2_R, input_pnp_t,
    #                           input_pnp_R, input_transfer_error)
    # dc.displayRTError3D_LM(inputY, inputZ, input_ippe1_t, input_ippe1_R, input_ippe2_t, input_ippe2_R, input_pnp_t,
    #                           input_pnp_R, input_transfer_error)
    # dc.displayRTError3D_EPNP(inputY, inputZ, input_ippe1_t, input_ippe1_R, input_ippe2_t, input_ippe2_R, input_pnp_t,
    #                           input_pnp_R, input_transfer_error)
    dc.displayRTError3D_DLS(inputY, inputZ, input_ippe1_t, input_ippe1_R, input_ippe2_t, input_ippe2_R, input_pnp_t,
                              input_pnp_R, input_transfer_error)
    print "----------------End-----------------------------"
Example #4
0
def test2_covariance_alpha_belt_r():
    """
    Test covariance_alpha_belt_r(cam, new_objectPoints)
    X Y fixed, Z changed
    :return:
    """
    pl = CircularPlane(origin=np.array([0., 0., 0.]),
                       normal=np.array([0, 0, 1]),
                       radius=0.15,
                       n=4)
    x1 = round(pl.radius * np.cos(np.deg2rad(45)), 3)
    y1 = round(pl.radius * np.sin(np.deg2rad(45)), 3)
    objectPoints_square = np.array([[x1, -x1, -x1, x1], [y1, y1, -y1, -y1],
                                    [0., 0., 0., 0.], [1., 1., 1., 1.]])

    new_objectPoints = np.copy(objectPoints_square)

    # -----------------------------X Y fixed, Z changed-----------------------------
    cams_XYfixed = []
    for i in np.linspace(0.5, 2, 5):
        cam1 = Camera()
        cam1.set_K(fx=800, fy=800, cx=640 / 2., cy=480 / 2.)
        cam1.set_width_heigth(640, 480)
        cam1.set_R_axisAngle(1.0, 0.0, 0.0, np.deg2rad(180.0))
        cam1.set_t(0, 0, i, frame='world')
        # 0.28075725, -0.23558331, 1.31660688
        cams_XYfixed.append(cam1)

    zInputs = []
    volumes = []
    ellipsoid_paras = np.array([[0], [0], [0], [0], [0], [0]])  # a,b,c,x,y,z
    for cam in cams_XYfixed:
        cam_tem = cam.clone()
        valid = cms.validCam(cam_tem, new_objectPoints)
        if valid:
            t = cam.get_world_position()
            zInputs.append(t[2])
            print "Height", t[2]

            cov_mat = cms.covariance_alpha_belt_r(cam, new_objectPoints)
            a, b, c = ellipsoid.get_semi_axes_abc(cov_mat, 0.95)
            display_array = np.array(
                [[0.0], [0.0], [0.0], [0.0], [0.0], [0.0]], dtype=float)
            display_array[0:3, 0] = a, b, c
            display_array[3:6, 0] = np.copy(t[0:3])
            ellipsoid_paras = np.hstack((ellipsoid_paras, display_array))

            v = ellipsoid.ellipsoid_Volume(a, b, c)
            print "volumn", v
            volumes.append(v)

    dvm.displayCovVolume_XYfixed3D(zInputs, volumes)
def Z_fixed_study_square():
    cams_HeightFixed = []
    cam_1 = Camera()
    cam_1.set_K(fx=800, fy=800, cx=640 / 2., cy=480 / 2.)
    cam_1.set_width_heigth(640, 480)
    cam_1.set_R_axisAngle(1.0, 0.0, 0.0, np.deg2rad(180.0))
    cam_1.set_t(0.1, 0.1, 1, frame='world')
    cams_HeightFixed.append(cam_1)

    cam_2 = Camera()
    cam_2.set_K(fx=800, fy=800, cx=640 / 2., cy=480 / 2.)
    cam_2.set_width_heigth(640, 480)
    cam_2.set_R_axisAngle(1.0, 0.0, 0.0, np.deg2rad(180.0))
    cam_2.set_t(-0.1, 0.1, 1, frame='world')
    # 0.28075725, -0.23558331, 1.31660688
    cams_HeightFixed.append(cam_2)

    cam_3 = Camera()
    cam_3.set_K(fx=800, fy=800, cx=640 / 2., cy=480 / 2.)
    cam_3.set_width_heigth(640, 480)
    cam_3.set_R_axisAngle(1.0, 0.0, 0.0, np.deg2rad(180.0))
    cam_3.set_t(-0.1, -0.1, 1, frame='world')
    # 0.28075725, -0.23558331, 1.31660688
    cams_HeightFixed.append(cam_3)

    cam_4 = Camera()
    cam_4.set_K(fx=800, fy=800, cx=640 / 2., cy=480 / 2.)
    cam_4.set_width_heigth(640, 480)
    cam_4.set_R_axisAngle(1.0, 0.0, 0.0, np.deg2rad(180.0))
    cam_4.set_t(0.1, -0.1, 1, frame='world')
    # 0.28075725, -0.23558331, 1.31660688
    cams_HeightFixed.append(cam_4)
    inputX, inputY, inputZ, input_ippe1_t, input_ippe1_R, input_ippe2_t, input_ippe2_R, input_pnp_t, input_pnp_R, input_transfer_error, display_mat = bf.heightGetCondNum(cams_HeightFixed)
Example #6
0
def test3_covariance_alpha_belt_r():
    """
    Y fixed, study X Z  like a half circle above the marker
    :return:
    """
    pl = CircularPlane(origin=np.array([0., 0., 0.]),
                       normal=np.array([0, 0, 1]),
                       radius=0.15,
                       n=4)
    x1 = round(pl.radius * np.cos(np.deg2rad(45)), 3)
    y1 = round(pl.radius * np.sin(np.deg2rad(45)), 3)
    objectPoints_square = np.array([[x1, -x1, -x1, x1], [y1, y1, -y1, -y1],
                                    [0., 0., 0., 0.], [1., 1., 1., 1.]])

    new_objectPoints = np.copy(objectPoints_square)
    # ------------------------------Y fixed, study X Z  like a half circle -----------------------------------------
    cams_Yfixed = []
    for angle in np.linspace(np.deg2rad(0), np.deg2rad(180), 20):
        x = np.cos(angle)
        z = np.sin(angle)
        cam1 = Camera()
        cam1.set_K(fx=800, fy=800, cx=640 / 2., cy=480 / 2.)
        cam1.set_width_heigth(640, 480)
        # TODO  WE have not set R yet
        # print 'cam1.R',cam1.R
        cam1.set_t(x, 0, z, frame='world')
        cams_Yfixed.append(cam1)

    xInputs = []
    zInputs = []
    volumes = []
    for cam in cams_Yfixed:
        cam_tem = cam.clone()
        valid = cms.validCam(cam_tem, new_objectPoints)
        if valid:
            t = cam.get_world_position()
            xInputs.append(t[0])
            zInputs.append(t[2])
            print "x = ", t[0]
            print "z = ", t[2]

            cov_mat = cms.covariance_alpha_belt_r(cam, new_objectPoints)
            a, b, c = ellipsoid.get_semi_axes_abc(cov_mat, 0.95)
            v = ellipsoid.ellipsoid_Volume(a, b, c)
            print "v", v
            volumes.append(v)

    dvm.displayCovVolume_Zfixed3D(xInputs, zInputs, volumes)
Example #7
0
def test_covariance_alpha_belt_r():
    """
    Test covariance_alpha_belt_r(cam, new_objectPoints)
    Z fixed, study X Y-
    :return:
    """
    pl = CircularPlane(origin=np.array([0., 0., 0.]),
                       normal=np.array([0, 0, 1]),
                       radius=0.15,
                       n=4)
    x1 = round(pl.radius * np.cos(np.deg2rad(45)), 3)
    y1 = round(pl.radius * np.sin(np.deg2rad(45)), 3)
    objectPoints_square = np.array([[x1, -x1, -x1, x1], [y1, y1, -y1, -y1],
                                    [0., 0., 0., 0.], [1., 1., 1., 1.]])

    new_objectPoints = np.copy(objectPoints_square)

    # ------------------------------Z fixed, study X Y-----------------------------------------
    cams_Zfixed = []
    for x in np.linspace(-0.5, 0.5, 5):
        for y in np.linspace(-0.5, 0.5, 5):
            cam1 = Camera()
            cam1.set_K(fx=800, fy=800, cx=640 / 2., cy=480 / 2.)
            cam1.set_width_heigth(640, 480)
            # TODO  WE have not set R yet
            # print 'cam1.R',cam1.R
            cam1.set_t(x, y, 1.3, frame='world')
            cams_Zfixed.append(cam1)

    xInputs = []
    yInputs = []
    volumes = []
    for cam in cams_Zfixed:
        cam_tem = cam.clone()
        valid = cms.validCam(cam_tem, new_objectPoints)
        if valid:
            t = cam.get_world_position()
            xInputs.append(t[0])
            yInputs.append(t[1])

            cov_mat = cms.covariance_alpha_belt_r(cam, new_objectPoints)
            a, b, c = ellipsoid.get_semi_axes_abc(cov_mat, 0.95)
            v = ellipsoid.ellipsoid_Volume(a, b, c)
            volumes.append(v)

    dvm.displayCovVolume_Zfixed3D(xInputs, yInputs, volumes)
Example #8
0
class OptimalPointsSim(object):
    """ Class that defines and optimization to obtain optimal control points
  configurations for homography and plannar pose estimation. """
    def __init__(self):
        """ Definition of a simulated camera """
        self.cam = Camera()
        self.cam.set_K(fx=100, fy=100, cx=640, cy=480)
        self.cam.set_width_heigth(1280, 960)
        """ Initial camera pose looking stratight down into the plane model """
        self.cam.set_R_axisAngle(1.0, 0.0, 0.0, np.deg2rad(180))
        self.cam.set_t(0.0, 0.0, 1.5, frame='world')
        """ Plane for the control points """
        self.sph = Sphere(radius=0.5)
        self.sph.random_points(p=6, r=0.5, min_dist=0.001)

    def run(self):
        self.objectPoints = self.sph.get_sphere_points()
        self.init_params = flatten_points(self.objectPoints, type='object')

        self.objective1 = lambda params: matrix_condition_number_autograd(
            params, self.cam.P, normalize=False)
        self.objective2 = lambda params, iter: matrix_condition_number_autograd(
            params, self.cam.P, normalize=True)

        print("Optimizing condition number...")
        objective_grad = grad(self.objective2)
        self.optimized_params = adam(objective_grad,
                                     self.init_params,
                                     step_size=0.001,
                                     num_iters=200,
                                     callback=self.plot_points)

    def plot_points(self, params, iter, gradient):
        phisim = np.linspace((-math.pi) / 2., (math.pi / 2.))
        thetasim = np.linspace(0, 2 * np.pi)
        print params
        pointscoord = np.full((3, 6), 0.0)

        for i in range(6):

            pointscoord[0, i] = params[i]
            pointscoord[1, i] = params[i + 1]
            pointscoord[2, i] = params[i + 2]

        x = np.outer(np.sin(thetasim), np.cos(phisim))
        y = np.outer(np.sin(thetasim), np.sin(phisim))
        z = np.outer(np.cos(thetasim), np.ones_like(phisim))
        fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
        ax.plot_wireframe(sph.radius * x,
                          sph.radius * y,
                          sph.radius * z,
                          color='g')
        ax.scatter(pointscoord[:3, 0],
                   pointscoord[:3, 1],
                   pointscoord[:3, 2],
                   c='r')
        ax.scatter(pointscoord[:3, 3],
                   pointscoord[:3, 4],
                   pointscoord[:3, 5],
                   c='r')
        plt.show()
Example #9
0
from vision.rt_matrix import *
import numpy as np
from matplotlib import pyplot as plt

#%%
# load points
points = np.loadtxt('house.p3d').T
points = np.vstack((points, np.ones(points.shape[1])))

#%%
# setup camera
#P = hstack((eye(3),array([[0],[0],[-10]])))
cam = Camera()
## Test matrix functions
cam.set_K(1460, 1460, 608, 480)
cam.set_width_heigth(1280, 960)  #TODO Yue
# cam.set_R(0.0,  0.0,  1.0, 0.0)
cam.set_t(0.0, 0.0, -8.0)
cam.set_R_axisAngle(1.0, 0.0, 0.0, np.deg2rad(140.0))  #TODO Yue
cam.set_P()
print(cam.factor())

#%%

x = np.array(cam.project(points))

#%%
# plot projection
plt.figure()
plt.plot(x[0], x[1], 'k.')
plt.xlim(0, 1280)