Realcat
fix: eloftr
63f3cf2
raw
history blame
8.32 kB
# -*- coding: UTF-8 -*-
'''=================================================
@Project -> File pram -> vis_seg
@IDE PyCharm
@Author fx221@cam.ac.uk
@Date 07/02/2024 11:06
=================================================='''
import cv2
import numpy as np
from copy import deepcopy
def myHash(text: str):
hash = 0
for ch in text:
hash = (hash * 7879 ^ ord(ch) * 5737) & 0xFFFFFFFF
return hash
def generate_color_dic(n_seg=1000):
out = {}
for i in range(n_seg + 1):
sid = i
if sid == 0:
color = (0, 0, 255) # [b, g, r]
else:
# rgb_new = hash(str(sid * 319993))
rgb_new = myHash(str(sid * 319993))
r = (rgb_new & 0xFF0000) >> 16
g = (rgb_new & 0x00FF00) >> 8
b = rgb_new & 0x0000FF
color = (b, g, r)
out[i] = color
return out
def vis_seg_point(img, kpts, segs=None, seg_color=None, radius=7, thickness=-1):
outimg = deepcopy(img)
for i in range(kpts.shape[0]):
# print(kpts[i])
if segs is not None and seg_color is not None:
color = seg_color[segs[i]]
else:
color = (0, 255, 0)
outimg = cv2.circle(outimg,
center=(int(kpts[i, 0]), int(kpts[i, 1])),
color=color,
radius=radius,
thickness=thickness, )
return outimg
def vis_corr_incorr_point(img, kpts, pred_segs, gt_segs, radius=7, thickness=-1):
outimg = deepcopy(img)
for i in range(kpts.shape[0]):
# print(kpts[i])
p_seg = pred_segs[i]
g_seg = gt_segs[i]
if p_seg == g_seg:
if g_seg != 0:
color = (0, 255, 0)
else:
color = (255, 0, 0)
else:
color = (0, 0, 255)
outimg = cv2.circle(outimg,
center=(int(kpts[i, 0]), int(kpts[i, 1])),
color=color,
radius=radius,
thickness=thickness, )
return outimg
def vis_inlier(img, kpts, inliers, radius=7, thickness=1, with_outlier=True):
outimg = deepcopy(img)
for i in range(kpts.shape[0]):
if not with_outlier:
if not inliers[i]:
continue
if inliers[i]:
color = (0, 255, 0)
else:
color = (0, 0, 255)
outimg = cv2.rectangle(outimg,
pt1=(int(kpts[i, 0] - radius), int(kpts[i, 1] - radius)),
pt2=(int(kpts[i, 0] + radius), int(kpts[i, 1] + radius)),
color=color,
thickness=thickness, )
return outimg
def vis_global_seg(cls, seg_color, radius=7, thickness=-1):
all_patches = []
for i in range(cls.shape[0]):
if cls[i] == 0:
continue
color = seg_color[i]
patch = np.zeros(shape=(radius, radius, 3), dtype=np.uint8)
patch[..., 0] = color[0]
patch[..., 1] = color[1]
patch[..., 2] = color[2]
all_patches.append(patch)
if len(all_patches) == 0:
color = seg_color[0]
patch = np.zeros(shape=(radius, radius, 3), dtype=np.uint8)
patch[..., 0] = color[0]
patch[..., 1] = color[1]
patch[..., 2] = color[2]
all_patches.append(patch)
return np.vstack(all_patches)
def plot_matches(img1, img2, pts1, pts2, inliers, radius=3, line_thickness=2, horizon=True, plot_outlier=False,
confs=None):
rows1 = img1.shape[0]
cols1 = img1.shape[1]
rows2 = img2.shape[0]
cols2 = img2.shape[1]
# r = 3
if horizon:
img_out = np.zeros((max([rows1, rows2]), cols1 + cols2, 3), dtype='uint8')
# Place the first image to the left
img_out[:rows1, :cols1] = img1
# Place the next image to the right of it
img_out[:rows2, cols1:] = img2 # np.dstack([img2, img2, img2])
for idx in range(inliers.shape[0]):
# if idx % 10 > 0:
# continue
if inliers[idx]:
color = (0, 255, 0)
else:
if not plot_outlier:
continue
color = (0, 0, 255)
pt1 = pts1[idx]
pt2 = pts2[idx]
if confs is not None:
nr = int(radius * confs[idx])
else:
nr = radius
img_out = cv2.circle(img_out, (int(pt1[0]), int(pt1[1])), nr, color, 2)
img_out = cv2.circle(img_out, (int(pt2[0]) + cols1, int(pt2[1])), nr, color, 2)
img_out = cv2.line(img_out, (int(pt1[0]), int(pt1[1])), (int(pt2[0]) + cols1, int(pt2[1])), color,
line_thickness)
else:
img_out = np.zeros((rows1 + rows2, max([cols1, cols2]), 3), dtype='uint8')
# Place the first image to the left
img_out[:rows1, :cols1] = img1
# Place the next image to the right of it
img_out[rows1:, :cols2] = img2 # np.dstack([img2, img2, img2])
for idx in range(inliers.shape[0]):
# print("idx: ", inliers[idx])
# if idx % 10 > 0:
# continue
if inliers[idx]:
color = (0, 255, 0)
else:
if not plot_outlier:
continue
color = (0, 0, 255)
if confs is not None:
nr = int(radius * confs[idx])
else:
nr = radius
pt1 = pts1[idx]
pt2 = pts2[idx]
img_out = cv2.circle(img_out, (int(pt1[0]), int(pt1[1])), nr, color, 2)
img_out = cv2.circle(img_out, (int(pt2[0]), int(pt2[1]) + rows1), nr, color, 2)
img_out = cv2.line(img_out, (int(pt1[0]), int(pt1[1])), (int(pt2[0]), int(pt2[1]) + rows1), color,
line_thickness)
return img_out
def plot_kpts(img, kpts, radius=None, colors=None, r=3, color=(0, 0, 255), nh=-1, nw=-1, shape='o', show_text=None,
thickness=5):
img_out = deepcopy(img)
for i in range(kpts.shape[0]):
pt = kpts[i]
if radius is not None:
if shape == 'o':
img_out = cv2.circle(img_out, center=(int(pt[0]), int(pt[1])), radius=radius[i],
color=color if colors is None else colors[i],
thickness=thickness)
elif shape == '+':
img_out = cv2.line(img_out, pt1=(int(pt[0] - radius[i]), int(pt[1])),
pt2=(int(pt[0] + radius[i]), int(pt[1])),
color=color if colors is None else colors[i],
thickness=5)
img_out = cv2.line(img_out, pt1=(int(pt[0]), int(pt[1] - radius[i])),
pt2=(int(pt[0]), int(pt[1] + radius[i])), color=color,
thickness=thickness)
else:
if shape == 'o':
img_out = cv2.circle(img_out, center=(int(pt[0]), int(pt[1])), radius=r,
color=color if colors is None else colors[i],
thickness=thickness)
elif shape == '+':
img_out = cv2.line(img_out, pt1=(int(pt[0] - r), int(pt[1])),
pt2=(int(pt[0] + r), int(pt[1])), color=color if colors is None else colors[i],
thickness=thickness)
img_out = cv2.line(img_out, pt1=(int(pt[0]), int(pt[1] - r)),
pt2=(int(pt[0]), int(pt[1] + r)), color=color if colors is None else colors[i],
thickness=thickness)
if show_text is not None:
img_out = cv2.putText(img_out, show_text, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 2,
(0, 0, 255), 3)
if nh == -1 and nw == -1:
return img_out
if nh > 0:
return cv2.resize(img_out, dsize=(int(img.shape[1] / img.shape[0] * nh), nh))
if nw > 0:
return cv2.resize(img_out, dsize=(nw, int(img.shape[0] / img.shape[1] * nw)))