From 498ec033488ccb1eff5a4d46fff0b83de8104df3 Mon Sep 17 00:00:00 2001 From: Fiber Date: Tue, 15 Oct 2024 09:59:39 +0800 Subject: [PATCH] 1015 --- src/esd_bleeding_view_tool/__init__.py | 66 ++++++++++++++++++++------ src/esd_bleeding_view_tool/core.py | 44 +++++++++++++++-- 2 files changed, 93 insertions(+), 17 deletions(-) diff --git a/src/esd_bleeding_view_tool/__init__.py b/src/esd_bleeding_view_tool/__init__.py index ef811b6..aa226b5 100644 --- a/src/esd_bleeding_view_tool/__init__.py +++ b/src/esd_bleeding_view_tool/__init__.py @@ -11,19 +11,16 @@ from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient, QIcon, QImage, QKeySequence, QLinearGradient, QPainter, QPalette, QPixmap, QRadialGradient, QTransform) -from PySide6.QtWidgets import (QApplication, QGraphicsView, QMainWindow, QMenu, - QMenuBar, QPushButton, QSizePolicy, QStatusBar, QGraphicsScene, +from PySide6.QtWidgets import (QApplication, QFileDialog,QGraphicsView, QMainWindow, QMenu, + QMenuBar, QPushButton, QSizePolicy, QStatusBar, QGraphicsScene, QComboBox, QTextBrowser, QWidget) -video_dir = "raw/video/王传林.mp4" -mark_dir = "raw/mark/ESD-Bleeding-标注.xlsx" - class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") - MainWindow.resize(1173, 712) + self.resize(1173, 750) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.pushButton = QPushButton(self.centralwidget) @@ -38,6 +35,15 @@ class Ui_MainWindow(object): self.textBrowser = QTextBrowser(self.centralwidget) self.textBrowser.setObjectName(u"textBrowser") self.textBrowser.setGeometry(QRect(880, 80, 281, 291)) + self.pushButton_3 = QPushButton(self.centralwidget) + self.pushButton_3.setObjectName(u"pushButton_3") + self.pushButton_3.setGeometry(QRect(880, 560, 141, 81)) + self.pushButton_4 = QPushButton(self.centralwidget) + self.pushButton_4.setObjectName(u"pushButton_4") + self.pushButton_4.setGeometry(QRect(1020, 560, 141, 81)) + self.comboBox = QComboBox(self.centralwidget) + self.comboBox.setObjectName(u"comboBox") + self.comboBox.setGeometry(QRect(1020, 530, 141, 31)) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") @@ -63,10 +69,13 @@ class Ui_MainWindow(object): MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) self.pushButton.setText(QCoreApplication.translate("MainWindow", u"Left", None)) self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"Right", None)) + self.pushButton_3.setText(QCoreApplication.translate("MainWindow", u"\u5bfc\u5165\u89c6\u9891", None)) + self.pushButton_4.setText(QCoreApplication.translate("MainWindow", u"\u5bfc\u5165\u6807\u7b7e", None)) self.menu.setTitle(QCoreApplication.translate("MainWindow", u"\u8f7d\u5165\u6570\u636e", None)) self.menu_2.setTitle(QCoreApplication.translate("MainWindow", u"\u6807\u7b7e\u68c0\u67e5", None)) # retranslateUi + class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super(MainWindow, self).__init__() @@ -74,20 +83,23 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.pushButton.clicked.connect(self.left_frame) self.pushButton_2.clicked.connect(self.right_frame) + self.pushButton_3.clicked.connect(self.load_video) + self.pushButton_4.clicked.connect(self.load_mark) + + self.comboBox.currentIndexChanged.connect(self.name_reset) self.scene = QGraphicsScene() self.graphicsView.setScene(self.scene) self.graphicsView.show() - self.video = Video(video_dir) - self.mark = Mark(mark_dir,"王传林") - self.max_mark = self.mark.max_frame() - - self.now = 0 - self.show_frame() + self.now = 2400 + self.is_video_set = 0 + self.is_label_set = 0 def show_frame(self): + if not self.is_video_set or not self.is_label_set: + return frame_num, method_raw = self.mark.read(self.now) img = self.video.read(frame_num) cvimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 把opencv 默认BGR转为通用的RGB @@ -96,8 +108,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.scene.clear() #先清空上次的残留 self.pix = QPixmap.fromImage(frame) self.scene.addPixmap(self.pix) - - text = "帧数:"+"{:06d}".format(frame_num)+"\n操作:" + + text = "帧数:"+"{:06d}".format(frame_num)+"\n"+"{:02d}".format(int(frame_num/30/60%60)) \ + +":"+"{:02d}".format(int(frame_num/30))+"\n操作:" method = self.mark.get_method(method_raw) for i in method: text += "\n" + i @@ -114,6 +127,31 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.now += 1 self.show_frame() + def load_video(self): + fname ,_ = QFileDialog.getOpenFileName(self, 'Open Video', '../', 'Video files (*.mp4 *.avi *.mp4 *.m4v *.mkv *.mkv)') + self.video = Video(fname) + self.is_video_set = 1 + self.show_frame() + + + def load_mark(self): + fname ,_ = QFileDialog.getOpenFileName(self, 'Open Excel Document', '../', 'Video files (*.xls *.xlsx)') + self.mark = Mark(fname) + self.max_mark = self.mark.max_frame() + + self.comboBox.clear() + self.comboBox.addItems(self.mark.sheet_list()) + + self.is_label_set = 1 + self.show_frame() + + def name_reset(self): + name = self.comboBox.currentText() + self.mark.change_name(name) + self.show_frame() + + + if __name__ == '__main__': app = QApplication(sys.argv) win = MainWindow() diff --git a/src/esd_bleeding_view_tool/core.py b/src/esd_bleeding_view_tool/core.py index ba1147d..a0d55af 100644 --- a/src/esd_bleeding_view_tool/core.py +++ b/src/esd_bleeding_view_tool/core.py @@ -2,10 +2,33 @@ import os import cv2 import pandas as pd import re +import numpy as np interval = 30 +def remove_the_blackborder(image): + + img = cv2.medianBlur(image, 7) #中值滤波,去除黑色边际中可能含有的噪声干扰 + b = cv2.threshold(img, 3, 255, cv2.THRESH_BINARY) #调整裁剪效果 + binary_image = b[1] #二值图--具有三通道 + binary_image = cv2.cvtColor(binary_image,cv2.COLOR_BGR2GRAY) + # print(binary_image.shape) #改为单通道 + + edges_y, edges_x = np.where(binary_image==255) ##h, w + bottom = min(edges_y) + top = max(edges_y) + height = top - bottom + + left = min(edges_x) + right = max(edges_x) + height = top - bottom + width = right - left + + res_image = image[bottom:bottom+height, left:left+width] + + return res_image + def convert_video(videoname): capture = cv2.VideoCapture(videoname) total_frames = int(capture.get(cv2.CAP_PROP_FRAME_COUNT)) @@ -37,15 +60,20 @@ class Video: cap = self.video cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num) ret, img=cap.read() + img = self.cut_border(img) if ret: return img else: return None - + def cut_border(self, img): + # img = remove_the_blackborder(img) + return img class Mark: - def __init__(self, mark_dir, sheet_name): - self.df = pd.read_excel(mark_dir, sheet_name=sheet_name) + def __init__(self, mark_dir): + self.df_source = pd.read_excel(mark_dir, sheet_name=None) + self.sheet = list(self.df_source.keys()) + self.df = self.df_source[self.sheet[0]] col_name = self.df.columns.tolist() self.method = col_name[1:] self.frame = self.df.loc[:,col_name[0]] @@ -62,6 +90,9 @@ class Mark: def max_frame(self): return self.total_frame + def sheet_list(self): + return self.sheet + def get_method(self, raw): method = [] NaN = pd.isnull(raw) @@ -69,6 +100,13 @@ class Mark: if not NaN.iloc[i]: method.append(self.method[i]) return method + + def change_name(self, name): + if name in self.sheet: + self.df = self.df_source[name] + col_name = self.df.columns.tolist() + self.frame = self.df.loc[:,col_name[0]] + self.total_frame = len(self.frame) if __name__ == "__main__":