예제 #1
0
	def test_random_rotation(self):
		z_vec = np.asarray([0,0,1])
		vecs = []
		for i in range(1000):
			rot = util.random_rotation()
			rot_mat, _ = cv2.Rodrigues(rot)
			vecs.append(rot_mat.dot(z_vec))
예제 #2
0
def calib_with_random_n_boards(n):
    """
	Generate n boards at random angle and depth, experiment for calibration result 
	under different 3d noise, 2d noise, number of control points;
	distortion, focal length, and center point.
	"""
    # parameters
    exp_repeat_times = 50
    noise3d_lvls = [0]
    # noise3d_lvls = [0, 0.005, 0.01, 0.04]
    noise2d_lvls = [0]
    board_height = [5]
    board_width = [8]
    board_sqsize = [0.23]
    depth_min = 0.5  #m
    depth_max = 5  #m

    for noise3d in noise3d_lvls:
        for noise2d in noise2d_lvls:
            # @TODO: experiment with different camera parameters?
            true_cam = cam.Camera.make_pinhole_camera()
            cam_loc = np.zeros((3, 1))
            cam_ori = np.zeros((3, 1))
            cam_extrin = util.Pose(cam_loc, cam_ori).extrinsics()
            for bh in board_height:
                for bw in board_width:
                    for bs in board_sqsize:
                        estimations = []
                        for iexp in xrange(exp_repeat_times):
                            # Generate n boards
                            board = bd.Board.gen_calib_board((bw, bh), bs, \
                             np.zeros((3,1)), np.zeros((3,1)), noise3d)
                            perfect_board = bd.Board.gen_calib_board((bw, bh), bs, \
                             np.zeros((3,1)), np.zeros((3,1)), 0)
                            obs_list = []
                            # for i in xrange(n):
                            while len(obs_list) < n:
                                # choose a random pixel
                                pxl_x = np.random.random_integers(
                                    0,
                                    true_cam.width() - 1)
                                pxl_y = np.random.random_integers(
                                    0,
                                    true_cam.height() - 1)

                                # choose a random depth on ray from pixel
                                depth = np.random.rand() * (
                                    depth_max - depth_min) + depth_min
                                # pt3d, ray_vec = true_cam.ray_from_pixel((pxl_x, pxl_y), cam_extrin)
                                # bd_loc = pt3d + depth*ray_vec

                                # choose a random orientation
                                bd_ori = util.random_rotation()

                                # board.move_board(bd_loc, bd_ori)
                                m_board = board.move_board_in_camera(
                                    true_cam, cam_extrin, (pxl_x, pxl_y),
                                    depth, bd_ori)
                                if m_board is not None:
                                    obs_list.append(
                                        m_board.get_points())  #3xN np array

                            img_pts = true_cam.capture_images(
                                cam_extrin, obs_list, noise2d)
                            esti_cam = cam.Camera.calibrate_camera(
                                img_pts, perfect_board, true_cam.size)
                            # vis.plot_camera_with_points(cam_extrin, obs_list)
                            vis.plot_all_chessboards_in_camera(
                                img_pts,
                                true_cam.size,
                                seperate_plot=True,
                                save_name='results/capture_' + str(n) +
                                '_3dn_' + str(noise3d) + '_2dn_' +
                                str(noise2d) + '_bn_' + str(bh * bw) + '_bs_' +
                                str(bs) + '_' + str(iexp) + '.pdf')

                            estimations.append(esti_cam)

                        # Analyze error
                        vis.write_esti_results(estimations, true_cam, \
                         save_name_pre='results/report_'+str(n)+'_3dn_'+str(noise3d)+'_2dn_'+str(noise2d)+'_bn_'+str(bh*bw)+'_bs_'+str(bs))
    print "random {0} board experiment DONE".format(n)
예제 #3
0
def calib_with_covarage():
    # parameters
    exp_repeat_times = 50
    noise3d_lvls = [0]
    noise2d_lvls = [0.3]
    board_height = [5]
    board_width = [8]
    board_sqsize = [0.23]
    depth_min = 6  #m
    depth_max = 9  #m
    n = 50
    coverage = [1.0, 0.5, 0.1]

    for noise3d in noise3d_lvls:
        for noise2d in noise2d_lvls:
            true_cam = cam.Camera.nikon_camera()

            # true_cam.intrinsics.radial_dist = 1*true_cam.intrinsics.radial_dist
            # true_cam.intrinsics.tang_dist = 1*true_cam.intrinsics.tang_dist

            cam_loc = np.zeros((3, 1))
            cam_ori = np.zeros((3, 1))
            cam_extrin = util.Pose(cam_loc, cam_ori).extrinsics()
            bh = board_height[0]
            bw = board_width[0]
            bs = board_sqsize[0]
            for cov in coverage:
                estimations = []
                for iexp in xrange(exp_repeat_times):
                    # Generate n boards
                    board = bd.Board.gen_calib_board((bw, bh), bs, \
                     np.zeros((3,1)), np.zeros((3,1)), noise3d)
                    perfect_board = bd.Board.gen_calib_board((bw, bh), bs, \
                     np.zeros((3,1)), np.zeros((3,1)), 0)
                    obs_list = []
                    # for i in xrange(n):
                    while len(obs_list) < n:
                        # choose a random pixel
                        mid_x = true_cam.width() / 2
                        mid_y = true_cam.height() / 2
                        pxl_x = np.random.random_integers(
                            int(mid_x - cov * mid_x), int(mid_x + cov * mid_x))
                        pxl_y = np.random.random_integers(
                            int(mid_y - cov * mid_y), int(mid_y + cov * mid_y))

                        # choose a random depth on ray from pixel
                        depth = np.random.rand() * (depth_max -
                                                    depth_min) + depth_min
                        # pt3d, ray_vec = true_cam.ray_from_pixel((pxl_x, pxl_y), cam_extrin)
                        # bd_loc = pt3d + depth*ray_vec

                        # choose a random orientation
                        bd_ori = util.random_rotation()

                        # board.move_board(bd_loc, bd_ori)
                        m_board = board.move_board_in_camera(
                            true_cam, cam_extrin, (pxl_x, pxl_y), depth,
                            bd_ori)
                        if m_board is not None:
                            print 'board at (', pxl_x, ',', pxl_y, ',', depth, '), rotation', bd_ori.flatten(
                            )
                            obs_list.append(
                                m_board.get_points())  #3xN np array

                    img_pts = true_cam.capture_images(cam_extrin, obs_list,
                                                      noise2d)
                    esti_cam = cam.Camera.calibrate_camera(img_pts,
                                                           perfect_board,
                                                           true_cam.size,
                                                           noDistortion=False)
                    # esti_cam = cam.Camera.calibrate_camera(img_pts, perfect_board, true_cam.size, noDistortion=True)
                    # esti_cam.intrinsics.radial_dist = np.zeros((3,))
                    # esti_cam.intrinsics.tang_dist = np.zeros((2,))
                    # vis.plot_camera_with_points(cam_extrin, obs_list)
                    # vis.plot_all_chessboards_in_camera(img_pts, true_cam.size, seperate_plot=True, save_name='results/capture_cov_'+str(cov)+'_'+str(iexp)+'.pdf')

                    estimations.append(esti_cam)

                # Analyze error
                vis.write_esti_results(estimations, true_cam, \
                 save_name_pre='results/coverage_'+str(cov)+'_board_'+str(n)+'_2dn_'+str(noise2d))
    print "random {0} board experiment DONE".format(n)
예제 #4
0
def calib_with_angle():
    angle_change = [0, 0.01, 0.1, 1]

    # parameters
    exp_repeat_times = 100
    noise3d_lvls = [0]
    noise2d_lvls = [0.3]
    board_height = [5]
    board_width = [8]
    board_sqsize = [0.23]
    depth_min = 3  #m
    depth_max = 5  #m
    n = 3

    for noise3d in noise3d_lvls:
        for noise2d in noise2d_lvls:
            true_cam = cam.Camera.nikon_camera()

            # true_cam.intrinsics.radial_dist = 1*true_cam.intrinsics.radial_dist
            # true_cam.intrinsics.tang_dist = 1*true_cam.intrinsics.tang_dist
            cam_loc = np.zeros((3, 1))
            cam_ori = np.zeros((3, 1))
            cam_extrin = util.Pose(cam_loc, cam_ori).extrinsics()
            bh = board_height[0]
            bw = board_width[0]
            bs = board_sqsize[0]
            for ac in angle_change:
                estimations = []
                start_angle = util.random_rotation()

                #check start_angle works
                board = bd.Board.gen_calib_board((bw, bh), bs, \
                  np.zeros((3,1)), np.zeros((3,1)), noise3d)
                m_board = board.move_board_in_camera(true_cam, cam_extrin, \
                 (true_cam.width()/2, true_cam.height()/2), 4, start_angle)
                while m_board is None:
                    start_angle = util.random_rotation()
                    m_board = board.move_board_in_camera(true_cam, cam_extrin, \
                    (true_cam.width()/2, true_cam.height()/2), 4, start_angle)
                start_angle = cv2.Rodrigues(start_angle)[0]

                for iexp in xrange(exp_repeat_times):
                    # Generate n boards

                    perfect_board = bd.Board.gen_calib_board((bw, bh), bs, \
                     np.zeros((3,1)), np.zeros((3,1)), 0)
                    obs_list = []
                    # for i in xrange(n):
                    while len(obs_list) < n:
                        # choose a random pixel
                        pxl_x = np.random.random_integers(
                            0,
                            true_cam.width() - 1)
                        pxl_y = np.random.random_integers(
                            0,
                            true_cam.height() - 1)

                        # choose a random depth on ray from pixel
                        depth = np.random.rand() * (depth_max -
                                                    depth_min) + depth_min
                        # pt3d, ray_vec = true_cam.ray_from_pixel((pxl_x, pxl_y), cam_extrin)
                        # bd_loc = pt3d + depth*ray_vec

                        # choose a random orientation
                        bd_ori = start_angle.dot(
                            cv2.Rodrigues(util.random_rot_w_scale(ac))[0])

                        # board.move_board(bd_loc, bd_ori)
                        m_board = board.move_board_in_camera(
                            true_cam, cam_extrin, (pxl_x, pxl_y), depth,
                            bd_ori)
                        if m_board is not None:
                            # print 'board at (', pxl_x, ',', pxl_y,',', depth, '), rotation', bd_ori.flatten()
                            obs_list.append(
                                m_board.get_points())  #3xN np array

                    img_pts = true_cam.capture_images(cam_extrin, obs_list,
                                                      noise2d)
                    esti_cam = cam.Camera.calibrate_camera(img_pts,
                                                           perfect_board,
                                                           true_cam.size,
                                                           noDistortion=False)
                    # esti_cam = cam.Camera.calibrate_camera(img_pts, perfect_board, true_cam.size, noDistortion=True)
                    # esti_cam.intrinsics.radial_dist = np.zeros((3,))
                    # esti_cam.intrinsics.tang_dist = np.zeros((2,))
                    # vis.plot_camera_with_points(cam_extrin, obs_list)
                    # vis.plot_all_chessboards_in_camera(img_pts, true_cam.size, seperate_plot=True, save_name='results/capture_rot_'+str(ac)+'_'+str(iexp)+'.pdf')

                    estimations.append(esti_cam)

                # Analyze error
                vis.write_esti_results(estimations, true_cam, \
                 save_name_pre='results/rot_'+str(ac)+'_board_'+str(n)+'_2dn_'+str(noise2d))
    print "depth {0} board experiment DONE".format(n)
예제 #5
0
def calib_with_random_n_boards(n):
	"""
	Generate n boards at random angle and depth, experiment for calibration result 
	under different 3d noise, 2d noise, number of control points;
	distortion, focal length, and center point.
	"""
	# parameters
	exp_repeat_times = 50
	noise3d_lvls = [0]
	# noise3d_lvls = [0, 0.005, 0.01, 0.04]
	noise2d_lvls = [0]
	board_height = [5]
	board_width = [8]
	board_sqsize = [0.23]
	depth_min = 0.5 #m
	depth_max = 5#m

	for noise3d in noise3d_lvls:
		for noise2d in noise2d_lvls:
			# @TODO: experiment with different camera parameters?
			true_cam = cam.Camera.make_pinhole_camera()
			cam_loc = np.zeros((3,1))
			cam_ori = np.zeros((3,1))
			cam_extrin = util.Pose(cam_loc, cam_ori).extrinsics()
			for bh in board_height:
				for bw in board_width:
					for bs in board_sqsize:
						estimations = []
						for iexp in xrange(exp_repeat_times):
							# Generate n boards
							board = bd.Board.gen_calib_board((bw, bh), bs, \
								np.zeros((3,1)), np.zeros((3,1)), noise3d)
							perfect_board = bd.Board.gen_calib_board((bw, bh), bs, \
								np.zeros((3,1)), np.zeros((3,1)), 0)
							obs_list = []
							# for i in xrange(n):
							while len(obs_list) < n:
								# choose a random pixel
								pxl_x = np.random.random_integers(0, true_cam.width()-1)
								pxl_y = np.random.random_integers(0, true_cam.height()-1)

								# choose a random depth on ray from pixel
								depth = np.random.rand() * (depth_max - depth_min) + depth_min
								# pt3d, ray_vec = true_cam.ray_from_pixel((pxl_x, pxl_y), cam_extrin)
								# bd_loc = pt3d + depth*ray_vec
								
								# choose a random orientation
								bd_ori = util.random_rotation()

								# board.move_board(bd_loc, bd_ori)
								m_board = board.move_board_in_camera(true_cam, cam_extrin, (pxl_x, pxl_y), depth, bd_ori)
								if m_board is not None:
									obs_list.append(m_board.get_points()) #3xN np array

							img_pts = true_cam.capture_images(cam_extrin, obs_list, noise2d)
							esti_cam = cam.Camera.calibrate_camera(img_pts, perfect_board, true_cam.size)
							# vis.plot_camera_with_points(cam_extrin, obs_list)
							vis.plot_all_chessboards_in_camera(img_pts, true_cam.size, seperate_plot=True, save_name='results/capture_'+str(n)+'_3dn_'+str(noise3d)+'_2dn_'+str(noise2d)+'_bn_'+str(bh*bw)+'_bs_'+str(bs)+'_'+str(iexp)+'.pdf')

							estimations.append(esti_cam)

						# Analyze error
						vis.write_esti_results(estimations, true_cam, \
							save_name_pre='results/report_'+str(n)+'_3dn_'+str(noise3d)+'_2dn_'+str(noise2d)+'_bn_'+str(bh*bw)+'_bs_'+str(bs))
	print "random {0} board experiment DONE".format(n)
예제 #6
0
def calib_with_covarage():
	# parameters
	exp_repeat_times = 50
	noise3d_lvls = [0]
	noise2d_lvls = [0.3]
	board_height = [5]
	board_width = [8]
	board_sqsize = [0.23]
	depth_min = 6 #m
	depth_max = 9#m
	n = 50
	coverage = [1.0, 0.5, 0.1]

	for noise3d in noise3d_lvls:
		for noise2d in noise2d_lvls:
			true_cam = cam.Camera.nikon_camera()

			# true_cam.intrinsics.radial_dist = 1*true_cam.intrinsics.radial_dist
			# true_cam.intrinsics.tang_dist = 1*true_cam.intrinsics.tang_dist

			cam_loc = np.zeros((3,1))
			cam_ori = np.zeros((3,1))
			cam_extrin = util.Pose(cam_loc, cam_ori).extrinsics()
			bh = board_height[0]
		 	bw = board_width[0]
			bs = board_sqsize[0]
			for cov in coverage:
				estimations = []
				for iexp in xrange(exp_repeat_times):
					# Generate n boards
					board = bd.Board.gen_calib_board((bw, bh), bs, \
						np.zeros((3,1)), np.zeros((3,1)), noise3d)
					perfect_board = bd.Board.gen_calib_board((bw, bh), bs, \
						np.zeros((3,1)), np.zeros((3,1)), 0)
					obs_list = []
					# for i in xrange(n):
					while len(obs_list) < n:
						# choose a random pixel
						mid_x = true_cam.width()/2
						mid_y = true_cam.height()/2
						pxl_x = np.random.random_integers(int(mid_x-cov*mid_x), int(mid_x+cov*mid_x))
						pxl_y = np.random.random_integers(int(mid_y-cov*mid_y), int(mid_y+cov*mid_y))

						# choose a random depth on ray from pixel
						depth = np.random.rand() * (depth_max - depth_min) + depth_min
						# pt3d, ray_vec = true_cam.ray_from_pixel((pxl_x, pxl_y), cam_extrin)
						# bd_loc = pt3d + depth*ray_vec
						
						# choose a random orientation
						bd_ori = util.random_rotation()

						# board.move_board(bd_loc, bd_ori)
						m_board = board.move_board_in_camera(true_cam, cam_extrin, (pxl_x, pxl_y), depth, bd_ori)
						if m_board is not None:
							print 'board at (', pxl_x, ',', pxl_y,',', depth, '), rotation', bd_ori.flatten()
							obs_list.append(m_board.get_points()) #3xN np array

					img_pts = true_cam.capture_images(cam_extrin, obs_list, noise2d)
					esti_cam = cam.Camera.calibrate_camera(img_pts, perfect_board, true_cam.size, noDistortion=False)
					# esti_cam = cam.Camera.calibrate_camera(img_pts, perfect_board, true_cam.size, noDistortion=True)
					# esti_cam.intrinsics.radial_dist = np.zeros((3,))
					# esti_cam.intrinsics.tang_dist = np.zeros((2,))
					# vis.plot_camera_with_points(cam_extrin, obs_list)
					# vis.plot_all_chessboards_in_camera(img_pts, true_cam.size, seperate_plot=True, save_name='results/capture_cov_'+str(cov)+'_'+str(iexp)+'.pdf')

					estimations.append(esti_cam)

				# Analyze error
				vis.write_esti_results(estimations, true_cam, \
					save_name_pre='results/coverage_'+str(cov)+'_board_'+str(n)+'_2dn_'+str(noise2d))
	print "random {0} board experiment DONE".format(n)
예제 #7
0
def calib_with_angle():
	angle_change = [0, 0.01, 0.1, 1]

	# parameters
	exp_repeat_times = 100
	noise3d_lvls = [0]
	noise2d_lvls = [0.3]
	board_height = [5]
	board_width = [8]
	board_sqsize = [0.23]
	depth_min = 3 #m
	depth_max = 5#m
	n = 3

	for noise3d in noise3d_lvls:
		for noise2d in noise2d_lvls:
			true_cam = cam.Camera.nikon_camera()

			# true_cam.intrinsics.radial_dist = 1*true_cam.intrinsics.radial_dist
			# true_cam.intrinsics.tang_dist = 1*true_cam.intrinsics.tang_dist
			cam_loc = np.zeros((3,1))
			cam_ori = np.zeros((3,1))
			cam_extrin = util.Pose(cam_loc, cam_ori).extrinsics()
			bh = board_height[0]
		 	bw = board_width[0]
			bs = board_sqsize[0]
			for ac in angle_change:
					estimations = []
					start_angle = util.random_rotation()

					#check start_angle works
					board = bd.Board.gen_calib_board((bw, bh), bs, \
							np.zeros((3,1)), np.zeros((3,1)), noise3d)
					m_board = board.move_board_in_camera(true_cam, cam_extrin, \
						(true_cam.width()/2, true_cam.height()/2), 4, start_angle)
					while m_board is None:
						start_angle = util.random_rotation()
						m_board = board.move_board_in_camera(true_cam, cam_extrin, \
						(true_cam.width()/2, true_cam.height()/2), 4, start_angle)
					start_angle = cv2.Rodrigues(start_angle)[0]

					for iexp in xrange(exp_repeat_times):
						# Generate n boards
						
						perfect_board = bd.Board.gen_calib_board((bw, bh), bs, \
							np.zeros((3,1)), np.zeros((3,1)), 0)
						obs_list = []
						# for i in xrange(n):
						while len(obs_list) < n:
							# choose a random pixel
							pxl_x = np.random.random_integers(0, true_cam.width()-1)
							pxl_y = np.random.random_integers(0, true_cam.height()-1)

							# choose a random depth on ray from pixel
							depth = np.random.rand() * (depth_max - depth_min) + depth_min
							# pt3d, ray_vec = true_cam.ray_from_pixel((pxl_x, pxl_y), cam_extrin)
							# bd_loc = pt3d + depth*ray_vec
							
							# choose a random orientation
							bd_ori = start_angle.dot(cv2.Rodrigues(util.random_rot_w_scale(ac))[0])

							# board.move_board(bd_loc, bd_ori)
							m_board = board.move_board_in_camera(true_cam, cam_extrin, (pxl_x, pxl_y), depth, bd_ori)
							if m_board is not None:
								# print 'board at (', pxl_x, ',', pxl_y,',', depth, '), rotation', bd_ori.flatten()
								obs_list.append(m_board.get_points()) #3xN np array

						img_pts = true_cam.capture_images(cam_extrin, obs_list, noise2d)
						esti_cam = cam.Camera.calibrate_camera(img_pts, perfect_board, true_cam.size, noDistortion=False)
						# esti_cam = cam.Camera.calibrate_camera(img_pts, perfect_board, true_cam.size, noDistortion=True)
						# esti_cam.intrinsics.radial_dist = np.zeros((3,))
						# esti_cam.intrinsics.tang_dist = np.zeros((2,))
						# vis.plot_camera_with_points(cam_extrin, obs_list)
						# vis.plot_all_chessboards_in_camera(img_pts, true_cam.size, seperate_plot=True, save_name='results/capture_rot_'+str(ac)+'_'+str(iexp)+'.pdf')

						estimations.append(esti_cam)

					# Analyze error
					vis.write_esti_results(estimations, true_cam, \
						save_name_pre='results/rot_'+str(ac)+'_board_'+str(n)+'_2dn_'+str(noise2d))
	print "depth {0} board experiment DONE".format(n)