This commit is contained in:
Fiber 2024-10-15 09:59:39 +08:00
parent 42a5b65af8
commit 498ec03348
2 changed files with 93 additions and 17 deletions

View File

@ -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()

View File

@ -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__":