예제 #1
0
def make_default_system():
    '''helper function to generate an instance of MultiCameraSystem'''
    lookat = np.array( (0.0, 0.0, 0.0))

    center1 = np.array( (0.0, 0.0, 0.9) )
    distortion1 = np.array( [0.2, 0.3, 0.1, 0.1, 0.1] )
    cam1 = CameraModel.load_camera_simple(name='cam1',
                                          fov_x_degrees=90,
                                          eye=center1,
                                          lookat=lookat,
                                          distortion_coefficients=distortion1,
                                          )

    center2 = np.array( (0.5, -0.8, 0.0) )
    cam2 = CameraModel.load_camera_simple(name='cam2',
                                          fov_x_degrees=90,
                                          eye=center2,
                                          lookat=lookat,
                                          )

    center3 = np.array( (0.5, 0.5, 0.0) )
    cam3 = CameraModel.load_camera_simple(name='cam3',
                                          fov_x_degrees=90,
                                          eye=center3,
                                          lookat=lookat,
                                          )

    system = MultiCameraSystem([cam1,cam2,cam3])
    return system
예제 #2
0
def make_default_system(with_separate_distorions=False):
    """helper function to generate an instance of MultiCameraSystem"""
    if with_separate_distorions:
        raise NotImplementedError
    camxs = np.linspace(-2, 2, 3)
    camzs = np.linspace(-2, 2, 3).tolist()
    camzs.pop(1)
    cameras = []
    lookat = np.array((0.0, 0, 0))
    up = np.array((0.0, 0, 1))

    for enum, camx in enumerate(camxs):
        center = np.array((camx, -5, 0))
        name = "camx_%d" % (enum + 1,)
        cam = CameraModel.load_camera_simple(name=name, fov_x_degrees=45, eye=center, lookat=lookat, up=up)
        cameras.append(cam)

    for enum, camz in enumerate(camzs):
        center = np.array((0, -5, camz))
        name = "camz_%d" % (enum + 1,)
        cam = CameraModel.load_camera_simple(name=name, fov_x_degrees=45, eye=center, lookat=lookat, up=up)
        cameras.append(cam)

    system = MultiCameraSystem(cameras)
    return system
예제 #3
0
def test_equals():
    system = make_default_system()
    assert system != 1234

    system2 = MultiCameraSystem([CameraModel.load_camera_simple(name='cam%d'%i) for i in range(2)])
    system3 = MultiCameraSystem([CameraModel.load_camera_simple(name='cam%d'%i) for i in range(3)])
    assert system2 != system3

    system4 = make_default_system()
    d = system4.to_dict()
    d['camera_system'][0]['width'] += 1
    system5 = MultiCameraSystem.from_dict( d )
    assert system4 != system5
예제 #4
0
def test_equals():
    system = make_default_system()
    assert system != 1234

    system2 = MultiCameraSystem(
        [CameraModel.load_camera_simple(name='cam%d' % i) for i in range(2)])
    system3 = MultiCameraSystem(
        [CameraModel.load_camera_simple(name='cam%d' % i) for i in range(3)])
    assert system2 != system3

    system4 = make_default_system()
    d = system4.to_dict()
    d['camera_system'][0]['width'] += 1
    system5 = MultiCameraSystem.from_dict(d)
    assert system4 != system5
예제 #5
0
def test_align():
    system1 = make_default_system()
    system2 = system1.get_aligned_copy( system1 ) # This should be a no-op.
    assert system1==system2

    system3 = MultiCameraSystem([CameraModel.load_camera_simple(name='cam%d'%i) for i in range(2)])
    nose.tools.assert_raises(ValueError, system3.get_aligned_copy, system1)
예제 #6
0
def test_distortion():
    base = CameraModel.load_camera_default()
    lookat = np.array( (0.0, 0.0, 0.0) )
    up = np.array( (0.0, 0.0, 1.0) )

    cams = []
    cams.append(  base.get_view_camera(eye=np.array((1.0,0.0,1.0)),lookat=lookat,up=up) )

    distortion1 = np.array( [0.2, 0.3, 0.1, 0.1, 0.1] )
    cam_wide = CameraModel.load_camera_simple(name='cam_wide',
                                              fov_x_degrees=90,
                                              eye=np.array((-1.0,-1.0,0.7)),
                                              lookat=lookat,
                                              distortion_coefficients=distortion1,
                                              )
    cams.append(cam_wide)

    cam_ids = []
    for i in range(len(cams)):
        cams[i].name = 'cam%02d'%i
        cam_ids.append(cams[i].name)

    cam_system = MultiCameraSystem(cams)
    R = reconstruct.Reconstructor.from_pymvg(cam_system)
    for cam_id in cam_ids:
        nl_params = R.get_intrinsic_nonlinear(cam_id)
        mvg_cam = cam_system.get_camera_dict()[cam_id]
        assert np.allclose(mvg_cam.distortion, nl_params)
예제 #7
0
def test_align():
    system1 = make_default_system()
    system2 = system1.get_aligned_copy(system1)  # This should be a no-op.
    assert system1 == system2

    system3 = MultiCameraSystem(
        [CameraModel.load_camera_simple(name='cam%d' % i) for i in range(2)])
    nose.tools.assert_raises(ValueError, system3.get_aligned_copy, system1)
예제 #8
0
def test_equality():
    center = np.array( (0, 0.0, 5) )
    lookat = center + np.array( (0,1,0))
    cam_apple1 = CameraModel.load_camera_simple(fov_x_degrees=90,
                                                eye=center,
                                                lookat=lookat,
                                                name='apple')
    cam_apple2 = CameraModel.load_camera_simple(fov_x_degrees=90,
                                                eye=center,
                                                lookat=lookat,
                                                name='apple')
    cam_orange = CameraModel.load_camera_simple(fov_x_degrees=30,
                                                eye=center,
                                                lookat=lookat,
                                                name='orange')
    assert cam_apple1==cam_apple2
    assert cam_apple1!=cam_orange
    assert not cam_apple1==cam_orange
예제 #9
0
def make_default_system():
    '''helper function to generate an instance of MultiCameraSystem'''
    lookat = np.array((0.0, 0.0, 0.0))

    center1 = np.array((0.0, 0.0, 5.0))
    distortion1 = np.array([0.2, 0.3, 0.1, 0.1, 0.1])
    cam1 = CameraModel.load_camera_simple(
        name='cam1',
        fov_x_degrees=90,
        eye=center1,
        lookat=lookat,
        distortion_coefficients=distortion1,
    )

    center2 = np.array((0.5, 0.0, 0.0))
    cam2 = CameraModel.load_camera_simple(
        name='cam2',
        fov_x_degrees=90,
        eye=center2,
        lookat=lookat,
    )

    center3 = np.array((0.5, 0.5, 0.0))
    cam3 = CameraModel.load_camera_simple(
        name='cam3',
        fov_x_degrees=90,
        eye=center3,
        lookat=lookat,
    )

    center4 = np.array((0.5, 0.0, 0.5))
    cam4 = CameraModel.load_camera_simple(
        name='cam4',
        fov_x_degrees=90,
        eye=center4,
        lookat=lookat,
    )

    cameras = [cam1, cam2, cam3, cam4]
    system = MultiCameraSystem(cameras)
    return system
예제 #10
0
파일: test_mcsc.py 프로젝트: wx-b/pymvg
def make_default_system(with_separate_distorions=False):
    '''helper function to generate an instance of MultiCameraSystem'''
    if with_separate_distorions:
        raise NotImplementedError
    camxs = np.linspace(-2, 2, 3)
    camzs = np.linspace(-2, 2, 3).tolist()
    camzs.pop(1)
    cameras = []
    lookat = np.array((0.0, 0, 0))
    up = np.array((0.0, 0, 1))

    for enum, camx in enumerate(camxs):
        center = np.array((camx, -5, 0))
        name = 'camx_%d' % (enum + 1, )
        cam = CameraModel.load_camera_simple(
            name=name,
            fov_x_degrees=45,
            eye=center,
            lookat=lookat,
            up=up,
        )
        cameras.append(cam)

    for enum, camz in enumerate(camzs):
        center = np.array((0, -5, camz))
        name = 'camz_%d' % (enum + 1, )
        cam = CameraModel.load_camera_simple(
            name=name,
            fov_x_degrees=45,
            eye=center,
            lookat=lookat,
            up=up,
        )
        cameras.append(cam)

    system = MultiCameraSystem(cameras)
    return system
예제 #11
0
def _get_cams(with_distortion):
    base = CameraModel.load_camera_default()

    lookat = np.array((0.0, 0.0, 0.0))
    up = np.array((0.0, 0.0, 1.0))

    cams = []
    cams.append(
        base.get_view_camera(eye=np.array((1.0, 0.0, 1.0)),
                             lookat=lookat,
                             up=up))
    cams.append(
        base.get_view_camera(eye=np.array((1.2, 3.4, 5.6)),
                             lookat=lookat,
                             up=up))
    cams.append(
        base.get_view_camera(eye=np.array((0, 0.3, 1.0)), lookat=lookat,
                             up=up))

    if with_distortion:
        distortion1 = np.array([0.2, 0.3, 0.1, 0.1, 0.1])
    else:
        distortion1 = np.zeros((5, ))
    cam_wide = CameraModel.load_camera_simple(
        name='cam_wide',
        fov_x_degrees=90,
        eye=np.array((-1.0, -1.0, 0.7)),
        lookat=lookat,
        distortion_coefficients=distortion1,
    )
    cams.append(cam_wide)

    for i in range(len(cams)):
        cams[i].name = 'cam%02d' % i

    cam_system = MultiCameraSystem(cams)
    reconstructor = Reconstructor.from_pymvg(cam_system)
    result = dict(
        cams=cams,
        cam_system=cam_system,
        reconstructor=reconstructor,
    )
    return result
예제 #12
0
def test_no_duplicate_names():
    cam1a = CameraModel.load_camera_simple(name='cam1')
    cam1b = CameraModel.load_camera_simple(name='cam1')
    cams = [cam1a,cam1b]
    nose.tools.assert_raises(ValueError, MultiCameraSystem, cams)
예제 #13
0
def test_no_duplicate_names():
    cam1a = CameraModel.load_camera_simple(name='cam1')
    cam1b = CameraModel.load_camera_simple(name='cam1')
    cams = [cam1a, cam1b]
    nose.tools.assert_raises(ValueError, MultiCameraSystem, cams)
예제 #14
0
def test_simple_camera():
    center = np.array( (0, 0.0, 5) )
    lookat = center + np.array( (0,1,0))
    cam = CameraModel.load_camera_simple(fov_x_degrees=90,
                                         eye=center,
                                         lookat=lookat)
예제 #15
0
def test_pymvg_roundtrip():
    from pymvg.camera_model import CameraModel
    from pymvg.multi_camera_system import MultiCameraSystem
    from flydra_core.reconstruct import Reconstructor

    # ----------- with no distortion ------------------------
    center1 = np.array( (0, 0.0, 5) )
    center2 = np.array( (1, 0.0, 5) )

    lookat = np.array( (0,1,0))

    cam1 = CameraModel.load_camera_simple(fov_x_degrees=90,
                                          name='cam1',
                                          eye=center1,
                                          lookat=lookat)
    cam2 = CameraModel.load_camera_simple(fov_x_degrees=90,
                                          name='cam2',
                                          eye=center2,
                                          lookat=lookat)
    mvg = MultiCameraSystem( cameras=[cam1, cam2] )
    R = Reconstructor.from_pymvg(mvg)
    mvg2 = R.convert_to_pymvg()

    cam_ids = ['cam1','cam2']
    for distorted in [True,False]:
        for cam_id in cam_ids:
            v1 = mvg.find2d(  cam_id, lookat, distorted=distorted )
            v2 = R.find2d(    cam_id, lookat, distorted=distorted )
            v3 = mvg2.find2d( cam_id, lookat, distorted=distorted )
            assert np.allclose(v1,v2)
            assert np.allclose(v1,v3)

    # ----------- with distortion ------------------------
    cam1dd = cam1.to_dict()
    cam1dd['D'] = (0.1, 0.2, 0.3, 0.4, 0.0)
    cam1d = CameraModel.from_dict(cam1dd)

    cam2dd = cam2.to_dict()
    cam2dd['D'] = (0.11, 0.21, 0.31, 0.41, 0.0)
    cam2d = CameraModel.from_dict(cam2dd)

    mvgd = MultiCameraSystem( cameras=[cam1d, cam2d] )
    Rd = Reconstructor.from_pymvg(mvgd)
    mvg2d = Rd.convert_to_pymvg()
    cam_ids = ['cam1','cam2']
    for distorted in [True,False]:
        for cam_id in cam_ids:
            v1 = mvgd.find2d(  cam_id, lookat, distorted=distorted )
            v2 = Rd.find2d(    cam_id, lookat, distorted=distorted )
            v3 = mvg2d.find2d( cam_id, lookat, distorted=distorted )
            assert np.allclose(v1,v2)
            assert np.allclose(v1,v3)

    # ------------ with distortion at different focal length ------
    mydir = os.path.dirname(__file__)
    caldir = os.path.join(mydir,'sample_calibration')
    print mydir
    print caldir
    R3 = Reconstructor(caldir)
    mvg3 = R3.convert_to_pymvg()
    #R4 = Reconstructor.from_pymvg(mvg3)
    mvg3b = MultiCameraSystem.from_mcsc( caldir )

    for distorted in [True,False]:
        for cam_id in R3.cam_ids:
            v1 = R3.find2d(   cam_id, lookat, distorted=distorted )
            v2 = mvg3.find2d( cam_id, lookat, distorted=distorted )
            #v3 = R4.find2d(   cam_id, lookat, distorted=distorted )
            v4 = mvg3b.find2d( cam_id, lookat, distorted=distorted )
            assert np.allclose(v1,v2)
            #assert np.allclose(v1,v3)
            assert np.allclose(v1,v4)