diff --git a/EndoCalibrator.py b/EndoCalibrator.py index 02c0efd..fa8baee 100644 --- a/EndoCalibrator.py +++ b/EndoCalibrator.py @@ -8,9 +8,10 @@ def __init__(self, args): self.args = args - def calibrate(self, Is_example_showed=True): + def calibrate_row_size(self, Is_example_showed=True): criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) + resize_size = (self.args.resized_width, self.args.resized_height) square_size = self.args.square_size pattern_size = (self.args.pattern_size_row, self.args.pattern_size_col) pattern_points = np.zeros((np.prod(pattern_size), 3), dtype=np.float32) @@ -23,6 +24,7 @@ for fname in chess_img_list: img = cv2.imread(fname) + # img = cv2.resize(img, resize_size, interpolation=cv2.INTER_LANCZOS4) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, pattern_size) @@ -33,5 +35,32 @@ if Is_example_showed: img = cv2.drawChessboardCorners(img, pattern_size, corners2, ret) + print(fname) cv2.imshow("corners", img) cv2.waitKey(0) + + ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None) + + if Is_example_showed: + for fname in chess_img_list: + img = cv2.imread(fname) + #img = cv2.resize(img, resize_size, interpolation=cv2.INTER_LANCZOS4) + undistort_img = cv2.undistort(img, mtx, dist) + cv2.imshow("undistort", undistort_img) + cv2.waitKey() + + zoom_x = resize_size[0] / gray.shape[1] + zoom_y = resize_size[1] / gray.shape[0] + intrinsics_scaled = self.scale_intrinsics(mtx, zoom_x, zoom_y) + os.makedirs(self.args.npy_outdir, exist_ok=True) + np.save(os.path.join(self.args.npy_outdir, 'intrinsics_scaled.npy'), intrinsics_scaled) + np.save(os.path.join(self.args.npy_outdir, 'dist_coeffs.npy'), dist) + np.save(os.path.join(self.args.npy_outdir, 'caribrate_img_size.npy'), np.array([gray.shape[1], gray.shape[0]])) + + def scale_intrinsics(self, mat, sx, sy): + out = np.copy(mat) + out[0, 0] *= sx + out[0, 2] *= sx + out[1, 1] *= sy + out[1, 2] *= sy + return out diff --git a/Movie2imgConverter.py b/Movie2imgConverter.py new file mode 100644 index 0000000..f0ef2ab --- /dev/null +++ b/Movie2imgConverter.py @@ -0,0 +1,26 @@ +import numpy as np +from glob import glob +import os +import cv2 + +class Movie2imgConverter: + def __init__(self, args): + self.args = args + + def convert_endo_movie2img(self): + src_dir = self.args.movie_dir + if os.path.exists(src_dir) is False: + print("動画のディレクトリパスがミスってます") + raise + + movie_name_list = glob(os.path.join(src_dir, "*" + self.args.endo_movie_extend)) + + if len(movie_name_list) == 0: + print("対象のディレクトリに動画が見つかりません") + raise + + sequence_num = 0 + for movie_name in movie_name_list: + print("start processing {}".format(os.path.basename(movie_name))) + sum_frames = cv2.VideoCapture(movie_name) + out_subdir = os.path.join(self.args.out_dir, '{}seq'.format(sequence_num)) diff --git a/__pycache__/EndoCalibrator.cpython-36.pyc b/__pycache__/EndoCalibrator.cpython-36.pyc index 06b161f..a6cfbdf 100644 --- a/__pycache__/EndoCalibrator.cpython-36.pyc +++ b/__pycache__/EndoCalibrator.cpython-36.pyc Binary files differ diff --git a/main.py b/main.py index 4462bfd..b2ed764 100644 --- a/main.py +++ b/main.py @@ -2,21 +2,31 @@ from EndoCalibrator import EndoCalibrator parser = argparse.ArgumentParser() -parser.add_argument("--mode", type=str, required=True, choices=["calibrate"], help="処理モード") +parser.add_argument("--mode", type=str, required=True, choices=["calibrate", "convert"], help="処理モード") parser.add_argument("--imgs_dir", type=str, required=True, help="画像が入ってるディレクトリ") -parser.add_argument("--output_dir", type=str, default="./temp", help="出力先") +parser.add_argument("--resized_height", type=int, default=352, help="画像サイズの高さ(幅もだが,アップサンプリングの" + "関係で2の乗数を多く含む方が良い)") +parser.add_argument("--resized_width", type=int, default=480, help="画像サイズの幅") # カメラキャリブレーション用 +parser.add_argument("--npy_outdir", type=str, default="./params", help="カメラキャリブレーション結果の出力先") parser.add_argument("--square_size", type=float, default=20.0, help='正方形の一辺のサイズ[mm]') -parser.add_argument("--pattern_size_col", type=int, default=9, help="チェスの列数") -parser.add_argument("--pattern_size_row", type=int, default=6, help="チェスの行数") +parser.add_argument("--pattern_size_col", type=int, default=6, help="チェスの列数") +parser.add_argument("--pattern_size_row", type=int, default=9, help="チェスの行数") parser.add_argument("--chess_img_extend", type=str, default=".JPG", help="チェス画像の拡張子") +# 映像変換用 +parser.add_argument("--movie_dir", type=str, default="./tmp", help="入力動画のディレクトリ,映像変換時はrequired") +parser.add_argument("--out_dir", type=str, default="./out", help="出力用のディレクトリ") +parser.add_argument("--param_dir", type=str, default="./params", help="カメラキャリブレーションで取得したパラメータ先") +parser.add_argument("--num_of_pass", type=int, default=1, help="フレーム間の間") +parser.add_argument("--endo_movie_extend", type=str, default=".mov", help="入力動画の拡張子") + args = parser.parse_args() if __name__ == '__main__': mode = args.mode if mode == 'calibrate': - editer = EndoCalibrator(args) - editer.calibrate() + editor = EndoCalibrator(args) + editor.calibrate_row_size(Is_example_showed=False) diff --git a/module_test.py b/module_test.py new file mode 100644 index 0000000..f276f23 --- /dev/null +++ b/module_test.py @@ -0,0 +1,6 @@ +import numpy as np + +intrinsics = np.load("./tmp/intrinsics_scaled.npy") +dist = np.load("./tmp/dist_coeffs.npy") +a = np.load("./tmp/caribrate_img_size.npy") +print("a") diff --git a/params/caribrate_img_size.npy b/params/caribrate_img_size.npy new file mode 100644 index 0000000..6cf44b9 --- /dev/null +++ b/params/caribrate_img_size.npy Binary files differ diff --git a/params/dist_coeffs.npy b/params/dist_coeffs.npy new file mode 100644 index 0000000..e76aaa1 --- /dev/null +++ b/params/dist_coeffs.npy Binary files differ diff --git a/params/intrinsics_scaled.npy b/params/intrinsics_scaled.npy new file mode 100644 index 0000000..3c4e6a2 --- /dev/null +++ b/params/intrinsics_scaled.npy Binary files differ