gui:更新前端按钮+增加视频buffer和抽帧

This commit is contained in:
Fiber 2024-10-18 19:44:15 +08:00
parent 89b70a8fab
commit a9302f4836
2 changed files with 70 additions and 91 deletions

View File

@ -32,52 +32,39 @@ class Ui_MainWindow(object):
self.textBrowser.setObjectName(u"textBrowser") self.textBrowser.setObjectName(u"textBrowser")
self.pushButton_3 = QPushButton(self.centralwidget) self.pushButton_3 = QPushButton(self.centralwidget)
self.pushButton_3.setObjectName(u"pushButton_3") self.pushButton_3.setObjectName(u"pushButton_3")
self.pushButton_4 = QPushButton(self.centralwidget) # self.pushButton_4 = QPushButton(self.centralwidget)
self.pushButton_4.setObjectName(u"pushButton_4") # self.pushButton_4.setObjectName(u"pushButton_4")
self.comboBox = QComboBox(self.centralwidget) # self.comboBox = QComboBox(self.centralwidget)
self.comboBox.setObjectName(u"comboBox") # self.comboBox.setObjectName(u"comboBox")
MainWindow.setCentralWidget(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menu = QMenu(self.menubar)
self.menu.setObjectName(u"menu")
self.menu_2 = QMenu(self.menubar)
self.menu_2.setObjectName(u"menu_2")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow) self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar") self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar) MainWindow.setStatusBar(self.statusbar)
self.set_size() self.set_size()
self.menubar.addAction(self.menu.menuAction())
self.menubar.addAction(self.menu_2.menuAction())
self.retranslateUi(MainWindow) self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow) QMetaObject.connectSlotsByName(MainWindow)
# 自适应界面大小 # 自适应界面大小
def set_size(self, w=800, h=600): def set_size(self, w=400, h=300):
w = w+10 w = w+10
h = h+10 h = h+10
w_button = 110 w_button = 80
self.resize(w+250, h+100) self.resize(w+w_button*2+30, h+100)
self.pushButton.setGeometry(QRect(w+10, 400, w_button, 40))
self.pushButton_2.setGeometry(QRect(w+10+w_button+10, 400, w_button, 40))
self.graphicsView.setGeometry(QRect(0, 0, w, h)) self.graphicsView.setGeometry(QRect(0, 0, w, h))
self.textBrowser.setGeometry(QRect(w+10, 30, w_button*2+10, 350)) self.textBrowser.setGeometry(QRect(w+10, 30, w_button*2+10, 200))
self.pushButton_3.setGeometry(QRect(w+10, 560, w_button, 40)) self.pushButton.setGeometry(QRect(w+10, 240, w_button*2+10, 50))
self.pushButton_4.setGeometry(QRect(w+10+w_button+10, 560, w_button, 40)) self.pushButton_2.setGeometry(QRect(w+10, 300, w_button, 50))
self.comboBox.setGeometry(QRect(w+10+w_button+10, 530, w_button, 30)) self.pushButton_3.setGeometry(QRect(w+10+w_button+10, 300, w_button, 50))
self.menubar.setGeometry(QRect(0, 0, w+230, h+100)) # self.pushButton_4.setGeometry(QRect(w+10+w_button+10, 560, w_button, 40))
# self.comboBox.setGeometry(QRect(w+10+w_button+10, 530, w_button, 30))
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.pushButton.setText(QCoreApplication.translate("MainWindow", u"Left", None)) self.pushButton.setText(QCoreApplication.translate("MainWindow", u"model", None))
self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"Right", None)) self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"start", None))
self.pushButton_3.setText(QCoreApplication.translate("MainWindow", u"\u5bfc\u5165\u89c6\u9891", None)) self.pushButton_3.setText(QCoreApplication.translate("MainWindow", u"pause", None))
self.pushButton_4.setText(QCoreApplication.translate("MainWindow", u"\u5bfc\u5165\u6807\u7b7e", None)) # self.pushButton_4.setText(QCoreApplication.translate("MainWindow", u"no function", None))
self.menu.setTitle(QCoreApplication.translate("MainWindow", u"menu1", None))
self.menu_2.setTitle(QCoreApplication.translate("MainWindow", u"menu2", None))
# retranslateUi # retranslateUi
# ui逻辑控制 # ui逻辑控制
@ -86,18 +73,19 @@ class MainWindow(QMainWindow, Ui_MainWindow):
super(MainWindow, self).__init__() super(MainWindow, self).__init__()
self.setupUi(self) self.setupUi(self)
self.pushButton.clicked.connect(self.left_frame) self.pushButton.clicked.connect(self.load_model)
self.pushButton_2.clicked.connect(self.right_frame) self.pushButton_2.clicked.connect(self.start)
self.pushButton_3.clicked.connect(self.load_video) self.pushButton_3.clicked.connect(self.pause)
self.pushButton_4.clicked.connect(self.load_mark) # self.pushButton_4.clicked.connect(self.load_mark)
self.comboBox.currentIndexChanged.connect(self.name_reset) # self.comboBox.currentIndexChanged.connect(self.name_reset)
self.scene = QGraphicsScene() self.scene = QGraphicsScene()
self.graphicsView.setScene(self.scene) self.graphicsView.setScene(self.scene)
self.graphicsView.show() self.graphicsView.show()
self.now = 2400
self.txt = ""
def show_video(self): def show_video(self):
@ -118,22 +106,20 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.pix = QPixmap.fromImage(frame) self.pix = QPixmap.fromImage(frame)
self.scene.addPixmap(self.pix) self.scene.addPixmap(self.pix)
def show_text(self): def show_text(self, text="text to show", clear=0):
text = "显示的文字" if clear > 0 :
self.textBrowser.setText(text) self.txt = ""
self.txt += text
self.textBrowser.setText(self.txt)
self.textBrowser.show() self.textBrowser.show()
def left_frame(self): def start(self):
if self.now > 0: ## 调用start函数
self.now -= 1 self.show_text("started\n")
self.show_video()
self.show_text()
def right_frame(self): def pause(self):
if self.now < 1000 - 1: ## 调用pause函数
self.now += 1 self.show_text("paused\n")
self.show_video()
self.show_text()
def load_video(self): def load_video(self):
fname ,_ = QFileDialog.getOpenFileName(self, 'Open Video', '../', 'Video files (*.mp4 *.avi *.mp4 *.m4v *.mkv *.mkv)') fname ,_ = QFileDialog.getOpenFileName(self, 'Open Video', '../', 'Video files (*.mp4 *.avi *.mp4 *.m4v *.mkv *.mkv)')
@ -141,20 +127,17 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.show_video() self.show_video()
def load_mark(self): def load_model(self):
fname ,_ = QFileDialog.getOpenFileName(self, 'Open Excel Document', '../', 'Video files (*.xls *.xlsx)') fname ,_ = QFileDialog.getOpenFileName(self, 'Open Checkpoint Document', '../', 'Checkpoint files (*.ckpt *.pt *.pth)')
self.mark = Mark(fname) ##连接模型load文件的函数
self.max_mark = self.mark.max_frame() if fname == "":
return
self.comboBox.clear() self.show_text("loaded model "+fname+"\n")
self.comboBox.addItems(self.mark.sheet_list())
self.show_text() # def name_reset(self):
# name = self.comboBox.currentText()
def name_reset(self): # self.mark.change_name(name)
name = self.comboBox.currentText() # self.show_text()
self.mark.change_name(name)
self.show_text()

View File

@ -5,29 +5,7 @@ import re
import numpy as np import numpy as np
interval = 30 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): def convert_video(videoname):
capture = cv2.VideoCapture(videoname) capture = cv2.VideoCapture(videoname)
@ -48,7 +26,7 @@ def convert_video(videoname):
print('视频打开失败!') print('视频打开失败!')
class Video: class Video:
def __init__(self, video_dir): def __init__(self, video_dir, buffer_num_max = 3):
self.video_dir = video_dir self.video_dir = video_dir
capture = cv2.VideoCapture(video_dir) capture = cv2.VideoCapture(video_dir)
if capture.isOpened(): if capture.isOpened():
@ -56,18 +34,36 @@ class Video:
self.video = capture self.video = capture
else: else:
self.video = None self.video = None
def read(self, frame_num): self.frame_num = 0
#buffer init
self.buffer = [None for _ in range(3)]
self.buffer_num = 0
self.buffer_num_max = buffer_num_max
def read(self): ##测试用,从视频文件读取
cap = self.video cap = self.video
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num) cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_num)
ret, img=cap.read() ret, img=cap.read()
img = self.cut_border(img)
if ret: if ret:
self.update_buffer(img)
self.frame_num += 1
return img return img
else: else:
return None return None
def cut_border(self, img):
# img = remove_the_blackborder(img) def get_and_skip_frame(self, skip_num=29): #抽帧
img = self.read()
for _ in range(skip_num):
self.read()
return img return img
def update_buffer(self, img): #更新buffer
self.buffer[self.buffer_num] = img
self.buffer_num = (self.buffer_num + 1) % self.buffer_num_max
def get_buffer(self): #获取buffer内容
return self.buffer
class Mark: class Mark:
def __init__(self, mark_dir): def __init__(self, mark_dir):