-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWrapper.py
85 lines (63 loc) · 3.19 KB
/
Wrapper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import numpy as np
import cv2
import argparse
import glob
from scipy.spatial.transform import Rotation as scipyRot
from scipy.optimize import least_squares
from utils import *
def test_homography(imgs,imgs_names,homography_list):
for i,H in enumerate(homography_list):
img1_warp = cv2.warpPerspective(imgs[i],H,[imgs[i].shape[1],imgs[i].shape[0]])
cv2.imshow(f"warp1_{imgs_names[i]}",img1_warp)
def main(args):
# parameters
base_path = args.basePath
input_extn = ".jpg"
square_size = 21.5 #mm
pattern_size = (9,6)
imgs,imgs_names = get_images(base_path,input_extn)
world_corners = get_world_corners(pattern_size,square_size)
imgs_corners = [get_chessboard_corners(img,pattern_size,name,args) for img,name in zip(imgs,imgs_names)]
homography_list = [get_homography(img_corners,world_corners,name) for img_corners,name in zip(imgs_corners,imgs_names)]
A_initial, lamda_initial = get_camera_intrinsics(homography_list)
transformations_initial = tuple([get_transformation_mat(A_initial,lamda_initial,H) for H in homography_list]) # 13*6,
transformations_initial = np.concatenate(transformations_initial)
k1_initial = np.array([0])
k2_initial = np.array([0])
x0 = package_x_vector(A_initial,k1_initial,k2_initial,transformations_initial)
kwargs1 = {
"imgs_corners":imgs_corners,
"world_corners":world_corners,
"per_img":False,
}
result = least_squares(compute_residuals,x0=x0,method='lm',kwargs=kwargs1)
n_imgs = len(imgs)
A_final,k1_final,k2_final,transformations_final = dissect_x_vector(result.x,n_imgs)
distorted_imgs = [inverse_warp(img,A_final,k1_final,k2_final) for img in imgs]
projection_errors_initial = compute_residuals(x0,imgs_corners,world_corners,True)
projection_errors_final = compute_residuals(result.x,imgs_corners,world_corners,True)
projection_errors_initial = [error/world_corners.shape[0] for error in projection_errors_initial]
projection_errors_final = [error/world_corners.shape[0] for error in projection_errors_final]
projections_final = get_projections(transformations_final,A_final,k1_final,k2_final,world_corners)
for i,projection_final in enumerate(projections_final):
draw_circles(distorted_imgs[i],base_path,imgs_names[i],projection_final,imgs_corners[i])
print("----summary-----")
print(f"A_initial:\n{A_initial}")
print(f"k1_initial:{k1_initial}")
print(f"k2_initial:{k2_initial}")
print(f"projection_errors_initial:\n{projection_errors_initial}")
print(f"A_final:\n{A_final}")
print(f"k1_final:{k1_final}")
print(f"k2_final:{k2_final}")
print(f"projection_errors_final:\n{projection_errors_final}")
if args.debug:
test_homography(imgs,imgs_names,homography_list)
if args.display:
cv2.waitKey(0)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--basePath',default='../data/Calibration_Imgs')
parser.add_argument('--display',action='store_true',help="to display images")
parser.add_argument('--debug',action='store_true',help="to display debug information")
args = parser.parse_args()
main(args)