add graphics scale
add rfmat dec
This commit is contained in:
parent
74ce48c7a4
commit
c0be9b687e
@ -1,7 +1,10 @@
|
||||
import sys
|
||||
import time
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
from PyQt6.QtCore import QByteArray, Qt
|
||||
from PyQt6.QtGui import QImage, QPixmap, QKeyEvent
|
||||
from PyQt6.QtGui import QImage, QPixmap, QKeyEvent, QWheelEvent
|
||||
from PyQt6.QtWidgets import QMainWindow, QApplication, QGraphicsPixmapItem, QGraphicsScene
|
||||
|
||||
from flandre.config import C
|
||||
@ -9,6 +12,7 @@ from flandre.nodes.Node import Node
|
||||
from flandre.pyqt.Image import Ui_MainWindow
|
||||
from flandre.pyqt.ZMQReceiver import ZMQReceiver
|
||||
from flandre.utils.Msg import KillMsg, Msg, BMMsg, RfMatMsg, KeyPressMsg
|
||||
from flandre.utils.RfMat import RfMat
|
||||
|
||||
|
||||
class Adv(QMainWindow, Ui_MainWindow):
|
||||
@ -23,9 +27,11 @@ class Adv(QMainWindow, Ui_MainWindow):
|
||||
self.s = QGraphicsScene()
|
||||
self.s.addItem(self.g)
|
||||
self.graphicsView.setScene(self.s)
|
||||
self.grey = True
|
||||
self.grey = False
|
||||
self.scale = False
|
||||
self.watermark = True
|
||||
self.zoom = 1.0
|
||||
self.need_fit = False
|
||||
|
||||
def keyPressEvent(self, a0: QKeyEvent):
|
||||
t = a0.text()
|
||||
@ -34,42 +40,58 @@ class Adv(QMainWindow, Ui_MainWindow):
|
||||
self.grey = not self.grey
|
||||
case 's':
|
||||
self.scale = not self.scale
|
||||
if not self.scale:
|
||||
self.need_fit = True
|
||||
case 't':
|
||||
self.watermark = not self.watermark
|
||||
|
||||
def wheelEvent(self, a0: QWheelEvent):
|
||||
if a0.angleDelta().y() > 0:
|
||||
self.zoom += 0.1
|
||||
if a0.angleDelta().y() < 0:
|
||||
self.zoom -= 0.1
|
||||
|
||||
def on_zmq_event(self, msg: QByteArray):
|
||||
t0 = time.time()
|
||||
msg = Msg.decode_msg(msg.data())
|
||||
t1 = time.time()
|
||||
print(t1 - t0)
|
||||
if isinstance(msg, KillMsg):
|
||||
if msg.name == '':
|
||||
self.close()
|
||||
elif isinstance(msg, RfMatMsg):
|
||||
w = msg.rfmat.m.shape[1]
|
||||
h = msg.rfmat.m.shape[0]
|
||||
w = msg.rfmat.w
|
||||
h = msg.rfmat.h
|
||||
d: RfMat = msg.rfmat
|
||||
|
||||
d2 = (d
|
||||
.pseudo_color(cond=not self.grey)
|
||||
.grey(cond=self.grey)
|
||||
.resize((int(w * self.zoom), int(h * self.zoom)))
|
||||
.watermark(cond=self.watermark)
|
||||
)
|
||||
w = d2.w
|
||||
h = d2.h
|
||||
if self.grey:
|
||||
d2 = msg.rfmat.grey()
|
||||
if self.watermark:
|
||||
d2 = d2.watermark()
|
||||
qImg = QImage(
|
||||
d2.__bytes__(),
|
||||
w, h, w,
|
||||
QImage.Format.Format_Grayscale8
|
||||
)
|
||||
else:
|
||||
d2 = msg.rfmat.pseudo_color()
|
||||
if self.watermark:
|
||||
d2 = d2.watermark()
|
||||
qImg = QImage(
|
||||
d2.__bytes__(),
|
||||
w, h, 3 * w,
|
||||
QImage.Format.Format_BGR888
|
||||
)
|
||||
|
||||
self.g.setPixmap(QPixmap(qImg))
|
||||
self.s.setSceneRect(0.0, 0.0, w, h)
|
||||
if self.scale:
|
||||
self.graphicsView.fitInView(self.s.sceneRect())
|
||||
else:
|
||||
self.graphicsView.fitInView(self.s.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio)
|
||||
if self.need_fit:
|
||||
self.graphicsView.fitInView(self.s.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio)
|
||||
self.need_fit = False
|
||||
|
||||
|
||||
class ImageQt(Node):
|
||||
|
||||
@ -17,7 +17,7 @@ class Ui_MainWindow(object):
|
||||
self.centralwidget.setObjectName("centralwidget")
|
||||
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
self.graphicsView = QtWidgets.QGraphicsView(parent=self.centralwidget)
|
||||
self.graphicsView = MyGraphicsView(parent=self.centralwidget)
|
||||
self.graphicsView.setDragMode(QtWidgets.QGraphicsView.DragMode.ScrollHandDrag)
|
||||
self.graphicsView.setResizeAnchor(QtWidgets.QGraphicsView.ViewportAnchor.AnchorUnderMouse)
|
||||
self.graphicsView.setObjectName("graphicsView")
|
||||
@ -37,3 +37,4 @@ class Ui_MainWindow(object):
|
||||
def retranslateUi(self, MainWindow):
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
|
||||
from flandre.pyqt.MyGraphicsView import MyGraphicsView
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QGraphicsView" name="graphicsView">
|
||||
<widget class="MyGraphicsView" name="graphicsView">
|
||||
<property name="dragMode">
|
||||
<enum>QGraphicsView::DragMode::ScrollHandDrag</enum>
|
||||
</property>
|
||||
@ -39,6 +39,13 @@
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>MyGraphicsView</class>
|
||||
<extends>QGraphicsView</extends>
|
||||
<header>flandre.pyqt.MyGraphicsView.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
||||
10
flandre/pyqt/MyGraphicsView.py
Normal file
10
flandre/pyqt/MyGraphicsView.py
Normal file
@ -0,0 +1,10 @@
|
||||
from PyQt6.QtWidgets import *
|
||||
|
||||
|
||||
class MyGraphicsView(QGraphicsView):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
|
||||
def wheelEvent(self, event):
|
||||
event.ignore()
|
||||
pass
|
||||
@ -1,3 +1,5 @@
|
||||
import inspect
|
||||
|
||||
import cupyx
|
||||
import cv2
|
||||
import matplotlib
|
||||
@ -18,19 +20,108 @@ from flandre.utils.RfFile import RfFrame, RfSequenceMeta
|
||||
from flandre.utils.RfMeta import RfFrameMeta
|
||||
|
||||
|
||||
def hsv_to_rgb(hsv):
|
||||
"""
|
||||
Convert HSV values to RGB.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hsv : (..., 3) array-like
|
||||
All values assumed to be in range [0, 1]
|
||||
|
||||
Returns
|
||||
-------
|
||||
(..., 3) `~numpy.ndarray`
|
||||
Colors converted to RGB values in range [0, 1]
|
||||
"""
|
||||
hsv = np.asarray(hsv)
|
||||
|
||||
# check length of the last dimension, should be _some_ sort of rgb
|
||||
if hsv.shape[-1] != 3:
|
||||
raise ValueError("Last dimension of input array must be 3; "
|
||||
f"shape {hsv.shape} was found.")
|
||||
|
||||
in_shape = hsv.shape
|
||||
hsv = np.array(
|
||||
hsv, copy=False,
|
||||
dtype=np.promote_types(hsv.dtype, np.float32), # Don't work on ints.
|
||||
ndmin=2, # In case input was 1D.
|
||||
)
|
||||
|
||||
h = hsv[..., 0]
|
||||
s = hsv[..., 1]
|
||||
v = hsv[..., 2]
|
||||
|
||||
r = np.empty_like(h)
|
||||
g = np.empty_like(h)
|
||||
b = np.empty_like(h)
|
||||
|
||||
i = (h * 6.0).astype(int)
|
||||
f = (h * 6.0) - i
|
||||
p = v * (1.0 - s)
|
||||
q = v * (1.0 - s * f)
|
||||
t = v * (1.0 - s * (1.0 - f))
|
||||
|
||||
idx = i % 6 == 0
|
||||
r[idx] = v[idx]
|
||||
g[idx] = t[idx]
|
||||
b[idx] = p[idx]
|
||||
# #
|
||||
idx = i == 1
|
||||
r[idx] = q[idx]
|
||||
g[idx] = v[idx]
|
||||
b[idx] = p[idx]
|
||||
#
|
||||
idx = i == 2
|
||||
r[idx] = p[idx]
|
||||
g[idx] = v[idx]
|
||||
b[idx] = t[idx]
|
||||
|
||||
idx = i == 3
|
||||
r[idx] = p[idx]
|
||||
g[idx] = q[idx]
|
||||
b[idx] = v[idx]
|
||||
|
||||
idx = i == 4
|
||||
r[idx] = t[idx]
|
||||
g[idx] = p[idx]
|
||||
b[idx] = v[idx]
|
||||
|
||||
idx = i == 5
|
||||
r[idx] = v[idx]
|
||||
g[idx] = p[idx]
|
||||
b[idx] = q[idx]
|
||||
|
||||
idx = s == 0
|
||||
r[idx] = v[idx]
|
||||
g[idx] = v[idx]
|
||||
b[idx] = v[idx]
|
||||
|
||||
rgb = np.stack([r, g, b], axis=-1)
|
||||
|
||||
return rgb.reshape(in_shape)
|
||||
|
||||
|
||||
def bypass(f):
|
||||
def wrapper(self, *args, **kwargs):
|
||||
if 'bypass' not in kwargs:
|
||||
if 'cond' not in kwargs:
|
||||
return f(self, *args, **kwargs)
|
||||
if kwargs['cond']:
|
||||
del kwargs['cond']
|
||||
return f(self, *args, **kwargs)
|
||||
if kwargs['bypass']:
|
||||
return self
|
||||
else:
|
||||
del kwargs['bypass']
|
||||
return f(self, *args, **kwargs)
|
||||
return self
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
def bypassClass(original_class):
|
||||
for name, f in inspect.getmembers(original_class, inspect.isfunction):
|
||||
setattr(original_class, name, bypass(f))
|
||||
return original_class
|
||||
|
||||
|
||||
@bypassClass
|
||||
class RfMat:
|
||||
def __init__(self,
|
||||
data: cp.ndarray,
|
||||
@ -64,6 +155,14 @@ class RfMat:
|
||||
def duration(self):
|
||||
return self.m.shape[1]
|
||||
|
||||
@property
|
||||
def w(self):
|
||||
return self.m.shape[1]
|
||||
|
||||
@property
|
||||
def h(self):
|
||||
return self.m.shape[0]
|
||||
|
||||
@property
|
||||
def p(self):
|
||||
if self.device == 'cpu':
|
||||
@ -98,9 +197,9 @@ class RfMat:
|
||||
v = p.zeros_like(h) + 1
|
||||
hsv = p.stack((h, s, v), axis=2)
|
||||
if p == cp:
|
||||
rgb = matplotlib.colors.hsv_to_rgb(hsv.get())
|
||||
rgb = hsv_to_rgb(hsv.get())
|
||||
else:
|
||||
rgb = matplotlib.colors.hsv_to_rgb(hsv)
|
||||
rgb = hsv_to_rgb(hsv)
|
||||
return self.copy((rgb * 255).astype(np.uint8))
|
||||
|
||||
def cpu(self):
|
||||
@ -125,12 +224,19 @@ class RfMat:
|
||||
line1 = self.frame_meta.name
|
||||
if self.seq_meta is not None:
|
||||
line2 = self.seq_meta.name
|
||||
if canvas.shape.__len__() == 2:
|
||||
color1 = (255,)
|
||||
color2 = (128,)
|
||||
elif canvas.shape[2] == 3:
|
||||
color1 = (255, 255, 255)
|
||||
color2 = (128, 128, 128)
|
||||
else:
|
||||
raise NotImplementedError()
|
||||
cv2.putText(canvas, line1, (0, 60), cv2.FONT_HERSHEY_PLAIN, 4, color1, 8)
|
||||
cv2.putText(canvas, line1, (0, 60), cv2.FONT_HERSHEY_PLAIN, 4, color2, 4)
|
||||
|
||||
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)
|
||||
cv2.putText(canvas, line2, (0, 120), cv2.FONT_HERSHEY_PLAIN, 4, color1, 8)
|
||||
cv2.putText(canvas, line2, (0, 120), cv2.FONT_HERSHEY_PLAIN, 4, color2, 4)
|
||||
|
||||
if canvas.shape.__len__() == 2:
|
||||
ccp.m[canvas == 255] = 255
|
||||
@ -159,7 +265,6 @@ class RfMat:
|
||||
print(self.seq_meta)
|
||||
return self
|
||||
|
||||
@bypass
|
||||
def resize(self, shape):
|
||||
if self.device == 'cpu':
|
||||
return self.copy(cv2.resize(self.m, shape))
|
||||
|
||||
@ -16,12 +16,63 @@ class ASD:
|
||||
def b(self):
|
||||
return self.aaa
|
||||
|
||||
|
||||
class EE(Enum):
|
||||
asd = ASD
|
||||
x=1
|
||||
x = 1
|
||||
|
||||
|
||||
def skip1(f):
|
||||
def wrapper(self, *args, **kwargs):
|
||||
if 'cond' not in kwargs:
|
||||
return f(self, *args, **kwargs)
|
||||
if kwargs['cond']:
|
||||
del kwargs['cond']
|
||||
return f(self, *args, **kwargs)
|
||||
else:
|
||||
return self
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
def skip(original_class):
|
||||
def f2(self, x):
|
||||
print(x)
|
||||
|
||||
for name, f in inspect.getmembers(original_class, inspect.isfunction):
|
||||
print(name, f)
|
||||
setattr(original_class, name, skip1(f))
|
||||
return original_class
|
||||
|
||||
|
||||
class Decorator(object):
|
||||
def __init__(self, arg):
|
||||
self.arg = arg
|
||||
|
||||
def __call__(self, cls):
|
||||
pass
|
||||
# def wrappedClass(*args):
|
||||
# return cls(*args)
|
||||
#
|
||||
# return type("TestClass", (cls,), dict(newMethod=self.newMethod, classattr=self.arg))
|
||||
|
||||
def newMethod(self, value):
|
||||
return value * 2
|
||||
|
||||
|
||||
@skip
|
||||
class DC:
|
||||
def __init__(self):
|
||||
pass
|
||||
def f1(self, arg):
|
||||
print('f1', arg)
|
||||
|
||||
def f2(self, arg):
|
||||
print('f2', arg)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(sys.argv)
|
||||
# print(sys.argv)
|
||||
# print(dir(ASD()))
|
||||
# print(ASD.__dict__)
|
||||
# print(inspect.getmembers(ASD))
|
||||
@ -46,4 +97,6 @@ if __name__ == '__main__':
|
||||
# print(3)
|
||||
# case _:
|
||||
# print(2)
|
||||
print()
|
||||
dc = DC()
|
||||
dc.f1(11,cond=False)
|
||||
dc.f2(22)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user