|
import numpy as np |
|
import h5py |
|
import cv2 |
|
|
|
|
|
def normalize_intrinsic(x, K): |
|
|
|
return (x - K[:2, 2]) / np.diag(K)[:2] |
|
|
|
|
|
def normalize_size(x, size, scale=1): |
|
size = size.reshape([1, 2]) |
|
norm_fac = size.max() |
|
return (x - size / 2 + 0.5) / (norm_fac * scale) |
|
|
|
|
|
def np_skew_symmetric(v): |
|
zero = np.zeros_like(v[:, 0]) |
|
M = np.stack( |
|
[ |
|
zero, |
|
-v[:, 2], |
|
v[:, 1], |
|
v[:, 2], |
|
zero, |
|
-v[:, 0], |
|
-v[:, 1], |
|
v[:, 0], |
|
zero, |
|
], |
|
axis=1, |
|
) |
|
return M |
|
|
|
|
|
def draw_points(img, points, color=(0, 255, 0), radius=3): |
|
dp = [(int(points[i, 0]), int(points[i, 1])) for i in range(points.shape[0])] |
|
for i in range(points.shape[0]): |
|
cv2.circle(img, dp[i], radius=radius, color=color) |
|
return img |
|
|
|
|
|
def draw_match( |
|
img1, |
|
img2, |
|
corr1, |
|
corr2, |
|
inlier=[True], |
|
color=None, |
|
radius1=1, |
|
radius2=1, |
|
resize=None, |
|
): |
|
if resize is not None: |
|
scale1, scale2 = [img1.shape[1] / resize[0], img1.shape[0] / resize[1]], [ |
|
img2.shape[1] / resize[0], |
|
img2.shape[0] / resize[1], |
|
] |
|
img1, img2 = cv2.resize(img1, resize, interpolation=cv2.INTER_AREA), cv2.resize( |
|
img2, resize, interpolation=cv2.INTER_AREA |
|
) |
|
corr1, corr2 = ( |
|
corr1 / np.asarray(scale1)[np.newaxis], |
|
corr2 / np.asarray(scale2)[np.newaxis], |
|
) |
|
corr1_key = [ |
|
cv2.KeyPoint(corr1[i, 0], corr1[i, 1], radius1) for i in range(corr1.shape[0]) |
|
] |
|
corr2_key = [ |
|
cv2.KeyPoint(corr2[i, 0], corr2[i, 1], radius2) for i in range(corr2.shape[0]) |
|
] |
|
|
|
assert len(corr1) == len(corr2) |
|
|
|
draw_matches = [cv2.DMatch(i, i, 0) for i in range(len(corr1))] |
|
if color is None: |
|
color = [(0, 255, 0) if cur_inlier else (0, 0, 255) for cur_inlier in inlier] |
|
if len(color) == 1: |
|
display = cv2.drawMatches( |
|
img1, |
|
corr1_key, |
|
img2, |
|
corr2_key, |
|
draw_matches, |
|
None, |
|
matchColor=color[0], |
|
singlePointColor=color[0], |
|
flags=4, |
|
) |
|
else: |
|
height, width = max(img1.shape[0], img2.shape[0]), img1.shape[1] + img2.shape[1] |
|
display = np.zeros([height, width, 3], np.uint8) |
|
display[: img1.shape[0], : img1.shape[1]] = img1 |
|
display[: img2.shape[0], img1.shape[1] :] = img2 |
|
for i in range(len(corr1)): |
|
left_x, left_y, right_x, right_y = ( |
|
int(corr1[i][0]), |
|
int(corr1[i][1]), |
|
int(corr2[i][0] + img1.shape[1]), |
|
int(corr2[i][1]), |
|
) |
|
cur_color = (int(color[i][0]), int(color[i][1]), int(color[i][2])) |
|
cv2.line( |
|
display, |
|
(left_x, left_y), |
|
(right_x, right_y), |
|
cur_color, |
|
1, |
|
lineType=cv2.LINE_AA, |
|
) |
|
return display |
|
|