2025-01-16 15:14:53 +08:00
|
|
|
import cv2
|
|
|
|
|
import numpy as np
|
|
|
|
|
import cupy as cp
|
|
|
|
|
|
|
|
|
|
from utils.RfFile import RfFrame, RfSequenceMeta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def bypass(f):
|
|
|
|
|
def wrapper(self, *args, **kwargs):
|
|
|
|
|
if 'bypass' not in kwargs:
|
|
|
|
|
return f(self, *args, **kwargs)
|
|
|
|
|
if kwargs['bypass']:
|
|
|
|
|
return self
|
|
|
|
|
else:
|
|
|
|
|
del kwargs['bypass']
|
|
|
|
|
return f(self, *args, **kwargs)
|
|
|
|
|
|
|
|
|
|
return wrapper
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RfMat:
|
|
|
|
|
def __init__(self,
|
|
|
|
|
data: cp.ndarray,
|
|
|
|
|
frame_meta: RfFrame.RfFrameMeta = None,
|
|
|
|
|
seq_meta: RfSequenceMeta = None,
|
|
|
|
|
):
|
|
|
|
|
self.m = data
|
|
|
|
|
self.cv = False
|
|
|
|
|
self.frame_meta = frame_meta
|
|
|
|
|
self.seq_meta = seq_meta
|
|
|
|
|
if isinstance(data, np.ndarray):
|
|
|
|
|
self.device = 'cpu'
|
|
|
|
|
elif isinstance(data, cp.ndarray):
|
|
|
|
|
self.device = 'gpu'
|
|
|
|
|
else:
|
|
|
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
|
|
def call(self, f, *args, **kwargs):
|
|
|
|
|
return self.copy(f(self.m, *args, **kwargs))
|
|
|
|
|
|
|
|
|
|
def apply(self, f, *args, **kwargs):
|
|
|
|
|
f(self.m, *args, **kwargs)
|
|
|
|
|
return self
|
|
|
|
|
|
|
|
|
|
def copy(self, data=None):
|
|
|
|
|
if data is None:
|
|
|
|
|
return RfMat(self.m.copy(), self.frame_meta, self.seq_meta)
|
|
|
|
|
return RfMat(data, self.frame_meta, self.seq_meta)
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def p(self):
|
|
|
|
|
if self.device == 'cpu':
|
|
|
|
|
return np
|
|
|
|
|
return cp
|
|
|
|
|
|
2025-01-19 18:27:26 +08:00
|
|
|
def __bytes__(self):
|
|
|
|
|
return self.m.tobytes()
|
|
|
|
|
|
2025-01-16 15:14:53 +08:00
|
|
|
def init_cv(self):
|
|
|
|
|
cv2.namedWindow('image')
|
|
|
|
|
self.cv = True
|
|
|
|
|
|
|
|
|
|
def norm(self):
|
|
|
|
|
m = self.m.astype(self.p.float32)
|
|
|
|
|
m -= m.min()
|
|
|
|
|
mmax = m.max()
|
|
|
|
|
if mmax == 0:
|
|
|
|
|
return self.copy(self.p.zeros_like(m))
|
|
|
|
|
m /= mmax
|
|
|
|
|
return self.copy(m)
|
|
|
|
|
|
|
|
|
|
def grey(self):
|
|
|
|
|
m = self.norm().m
|
|
|
|
|
return self.copy((m * 255).astype(self.p.uint8))
|
|
|
|
|
|
|
|
|
|
def cpu(self):
|
|
|
|
|
if self.device == 'cpu':
|
|
|
|
|
return self
|
|
|
|
|
return self.copy(self.m.get())
|
|
|
|
|
|
2025-01-19 18:27:26 +08:00
|
|
|
def crop1(self, v1):
|
|
|
|
|
return self.copy(self.m[:, :v1])
|
|
|
|
|
|
2025-01-16 15:14:53 +08:00
|
|
|
def watermark(self, watermark=None):
|
|
|
|
|
assert self.m.dtype == np.uint8
|
|
|
|
|
canvas = np.zeros(self.m.shape, dtype=np.uint8)
|
|
|
|
|
ccp = self.copy()
|
|
|
|
|
|
|
|
|
|
line1 = ''
|
|
|
|
|
line2 = ''
|
|
|
|
|
if watermark is not None:
|
|
|
|
|
line1 = watermark
|
|
|
|
|
else:
|
|
|
|
|
if self.frame_meta is not None:
|
|
|
|
|
line1 = self.frame_meta.name
|
|
|
|
|
if self.seq_meta is not None:
|
|
|
|
|
line2 = self.seq_meta.name
|
|
|
|
|
|
|
|
|
|
cv2.putText(canvas, line1, (0, 60), cv2.FONT_HERSHEY_PLAIN, 4, (255,), 8)
|
|
|
|
|
cv2.putText(canvas, line1, (0, 60), cv2.FONT_HERSHEY_PLAIN, 4, (128,), 4)
|
|
|
|
|
|
|
|
|
|
cv2.putText(canvas, line2, (0, 120), cv2.FONT_HERSHEY_PLAIN, 4, (255,), 8)
|
|
|
|
|
cv2.putText(canvas, line2, (0, 120), cv2.FONT_HERSHEY_PLAIN, 4, (128,), 4)
|
|
|
|
|
|
|
|
|
|
if canvas.shape.__len__() == 2:
|
|
|
|
|
ccp.m[canvas == 255] = 255
|
|
|
|
|
ccp.m[canvas == 128] = 0
|
|
|
|
|
elif canvas.shape[2] == 3:
|
|
|
|
|
ccp.m[canvas[:, :] == 255] = 255
|
|
|
|
|
ccp.m[canvas[:, :] == 128] = 0
|
|
|
|
|
else:
|
|
|
|
|
raise NotImplementedError()
|
|
|
|
|
return ccp
|
|
|
|
|
|
|
|
|
|
def show(self, shape=None, watermark=None):
|
|
|
|
|
if not self.cv:
|
|
|
|
|
self.init_cv()
|
|
|
|
|
cv2.imshow('image', self
|
|
|
|
|
.grey()
|
|
|
|
|
.cpu()
|
|
|
|
|
.resize(shape, bypass=shape is None)
|
|
|
|
|
.watermark(watermark).m
|
|
|
|
|
)
|
|
|
|
|
return cv2.waitKey(0)
|
|
|
|
|
|
|
|
|
|
def info(self):
|
|
|
|
|
print(f'shape: {self.m.shape},device: {self.device}')
|
|
|
|
|
print(self.frame_meta)
|
|
|
|
|
print(self.seq_meta)
|
|
|
|
|
return self
|
|
|
|
|
|
|
|
|
|
@bypass
|
|
|
|
|
def resize(self, shape):
|
|
|
|
|
if self.device == 'cpu':
|
|
|
|
|
return self.copy(cv2.resize(self.m, shape))
|
|
|
|
|
raise NotImplementedError()
|
|
|
|
|
|
|
|
|
|
def rotate90(self):
|
|
|
|
|
return self.copy(self.p.rot90(self.m, k=3))
|