Esempio n. 1
0
    def test_internal_correct_and_save():
        """
        Test internal correction saving method.
        """
        calib = CalibratePSEye()
        fn_c = calibsdir + '/camera_params.csv'
        # Asserts
        for t in (int, float, complex, list, tuple, range, dict, set,
                  frozenset, bool, bytes, bytearray, memoryview):
                try:
                    calib.correct_and_save(t)
                except TypeError:
                    pass
                else:
                    raise RuntimeError('Failed to catch %s imgpath' % t.__name__)
        calib.load_calibrations(fn_c)
        cp = calib.calibpath
        calib.calibpath = None
        try:
            calib.correct_and_save('file-that-does-not-exist')
        except RuntimeError:
            pass
        else:
            raise RuntimeError('Failed to catch _calib_path is None')

        # Saving
        calib.calibpath = cp
        imgpath = testdir + '/raw'
        storeddir = testdir + '/00000000-000000_undistorted'
        storedcp = testdir + '/00000000-000000_camera_params.csv'
        if os_exists(storeddir):
            rmtree(storeddir)
        if os_exists(storedcp):
            os_remove(storedcp)
        ud1 = calib.correct_and_save(imgpath)
        try:
            # Proper saving
            if not os_exists(storeddir) or not os_exists(storedcp):
                raise RuntimeError('Error creating corrected directories')
            imgcount1 = len([f for f in listdir(imgpath) if f[-4:].lower() == '.jpg'])
            imgcount2 = len([f for f in listdir(storeddir) if f[-4:].lower() == '.jpg'])
            if imgcount1 != imgcount2:
                raise RuntimeError('Not all images were saved')

            # Correct calibration
            #   Check pre-save equality
            imglist = [f for f in listdir(imgpath) if f[-4:].lower() == '.jpg']
            rawimg = [cv_imread(imgpath + '/' + f) for f in imglist]
            ud2 = calib.correct(rawimg)  # will know if `correct` works
            if not array_equal(ud1, ud2):
                raise RuntimeError('Failed pre-save equality check')

            #   Check post-save equality
            for i in range(len(imglist)):
                fnud = storeddir + ('/_f%s' % str(i+1).zfill(5)) + '.jpg'
                cv_imwrite(fnud, ud2[i,...], (IMWRITE_JPEG_QUALITY, 100))
            ud1list = [cv_imread(storeddir + '/' + f) for f in imglist]
            ud2list = [cv_imread(storeddir + '/_' + f) for f in imglist]

            ud1reload = asarray(ud1list, dtype='uint8')
            ud2reload = asarray(ud2list, dtype='uint8')
            if not array_equal(ud1reload, ud2reload):
                raise RuntimeError('Failed reload equality check')
        finally:
            os_remove(storedcp)
            rmtree(storeddir)
            try:
                if os_exists(storedcp):
                    raise RuntimeError('failed to deleted cameraParams csv')
                if os_exists(storeddir):
                    raise RuntimeError('failed to remove undistored img dir')
            except AssertionError:
                raise RuntimeError('Exception during test cleanup')
Esempio n. 2
0
    def test_internal_correct():
        """
        Test internal correction method.

        Discovered this song while debugging this test case on 2020-06-19
        https://open.spotify.com/track/5XgYWQKEqSqA5vXJmwZa6n?si=HvcZD32-T2KRspTPcb4uGQ
        """
        calib = CalibratePSEye()
        calib.load_calibrations(calibsdir + '/camera_params.csv')

        # test datatype check
        try:
            for t in ('uint16', 'uint32', 'uint64', 'int16', 'int32', 'int64',
                      'float32', 'float64', 'object'):
                frames = zeros((240, 320, 3), dtype=t)
                calib.correct(frames)
        except TypeError:
            pass
        else:
            raise RuntimeError('Failed to catch not-uint8 dtype')

        # test size check
        try:
            frames = zeros((240,320), dtype='uint8')
            calib.correct(frames)
        except TypeError:
            pass
        else:
            raise RuntimeError('Failed to catch frames too few dimensions')
        try:
            frames = zeros((240,320,1,1,1), dtype='uint8')
            calib.correct(frames)
        except TypeError:
            pass
        else:
            raise RuntimeError('Failed to catch frames too many dimensions')

        # setup test
        frames = []
        for f in listdir(testdir+'/raw'):
            if f[-4:].lower() == '.jpg':
                frames.append(cv_imread(testdir + '/raw/' + f))
        fshape = [len(frames)] + list(frames[0].shape)
        u1 = zeros(fshape, dtype='uint8')
        for i in range(len(frames)):
            f = frames[i].copy()
            u1[i,...] = undistort(f, calib.cameraMatrix, calib.distCoeffs, None)

        # test single frame
        u2 = calib.correct(frames[0])
        if not array_equal(u1[0,...], u2):
            raise RuntimeError('Single-frame undistort/remap is incorrect')

        # test several frames
        u2 = calib.correct(asarray(frames, dtype='uint8'))
        if not array_equal(u1, u2):
            raise RuntimeError('Multi-frame ndarray undistort/remap is incorrect')

        u2 = calib.correct(frames)
        if not array_equal(u1, u2):
            raise RuntimeError('Multi-frame list undistort/remap is incorrect')