flandre/src/utils/RfMat.py

145 lines
3.9 KiB
Python
Raw Normal View History

2025-01-16 15:14:53 +08:00
import cv2
import numpy as np
import cupy as cp
from utils.RfFile import RfFrame, RfSequenceMeta
2025-02-11 23:24:49 +08:00
from utils.RfMeta import RfFrameMeta
2025-01-16 15:14:53 +08:00
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,
2025-02-11 23:24:49 +08:00
frame_meta: RfFrameMeta = None,
2025-01-16 15:14:53 +08:00
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-20 13:03:02 +08:00
def crop(self, t_start: int, t_end: int):
return self.copy(self.m[:, t_start:t_end])
2025-01-19 18:27:26 +08:00
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))
2025-02-18 23:31:44 +08:00
if __name__ == '__main__':
cp.zeros((1, 2, 3)) + 1