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')
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')