1015
This commit is contained in:
parent
42a5b65af8
commit
498ec03348
@ -11,19 +11,16 @@ from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
|
|||||||
QIcon, QImage, QKeySequence, QLinearGradient,
|
QIcon, QImage, QKeySequence, QLinearGradient,
|
||||||
QPainter, QPalette, QPixmap, QRadialGradient,
|
QPainter, QPalette, QPixmap, QRadialGradient,
|
||||||
QTransform)
|
QTransform)
|
||||||
from PySide6.QtWidgets import (QApplication, QGraphicsView, QMainWindow, QMenu,
|
from PySide6.QtWidgets import (QApplication, QFileDialog,QGraphicsView, QMainWindow, QMenu,
|
||||||
QMenuBar, QPushButton, QSizePolicy, QStatusBar, QGraphicsScene,
|
QMenuBar, QPushButton, QSizePolicy, QStatusBar, QGraphicsScene, QComboBox,
|
||||||
QTextBrowser, QWidget)
|
QTextBrowser, QWidget)
|
||||||
|
|
||||||
video_dir = "raw/video/王传林.mp4"
|
|
||||||
mark_dir = "raw/mark/ESD-Bleeding-标注.xlsx"
|
|
||||||
|
|
||||||
|
|
||||||
class Ui_MainWindow(object):
|
class Ui_MainWindow(object):
|
||||||
def setupUi(self, MainWindow):
|
def setupUi(self, MainWindow):
|
||||||
if not MainWindow.objectName():
|
if not MainWindow.objectName():
|
||||||
MainWindow.setObjectName(u"MainWindow")
|
MainWindow.setObjectName(u"MainWindow")
|
||||||
MainWindow.resize(1173, 712)
|
self.resize(1173, 750)
|
||||||
self.centralwidget = QWidget(MainWindow)
|
self.centralwidget = QWidget(MainWindow)
|
||||||
self.centralwidget.setObjectName(u"centralwidget")
|
self.centralwidget.setObjectName(u"centralwidget")
|
||||||
self.pushButton = QPushButton(self.centralwidget)
|
self.pushButton = QPushButton(self.centralwidget)
|
||||||
@ -38,6 +35,15 @@ class Ui_MainWindow(object):
|
|||||||
self.textBrowser = QTextBrowser(self.centralwidget)
|
self.textBrowser = QTextBrowser(self.centralwidget)
|
||||||
self.textBrowser.setObjectName(u"textBrowser")
|
self.textBrowser.setObjectName(u"textBrowser")
|
||||||
self.textBrowser.setGeometry(QRect(880, 80, 281, 291))
|
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)
|
MainWindow.setCentralWidget(self.centralwidget)
|
||||||
self.menubar = QMenuBar(MainWindow)
|
self.menubar = QMenuBar(MainWindow)
|
||||||
self.menubar.setObjectName(u"menubar")
|
self.menubar.setObjectName(u"menubar")
|
||||||
@ -63,10 +69,13 @@ class Ui_MainWindow(object):
|
|||||||
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"Left", None))
|
||||||
self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"Right", 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.setTitle(QCoreApplication.translate("MainWindow", u"\u8f7d\u5165\u6570\u636e", None))
|
||||||
self.menu_2.setTitle(QCoreApplication.translate("MainWindow", u"\u6807\u7b7e\u68c0\u67e5", None))
|
self.menu_2.setTitle(QCoreApplication.translate("MainWindow", u"\u6807\u7b7e\u68c0\u67e5", None))
|
||||||
# retranslateUi
|
# retranslateUi
|
||||||
|
|
||||||
|
|
||||||
class MainWindow(QMainWindow, Ui_MainWindow):
|
class MainWindow(QMainWindow, Ui_MainWindow):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(MainWindow, self).__init__()
|
super(MainWindow, self).__init__()
|
||||||
@ -74,20 +83,23 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
self.pushButton.clicked.connect(self.left_frame)
|
self.pushButton.clicked.connect(self.left_frame)
|
||||||
self.pushButton_2.clicked.connect(self.right_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.scene = QGraphicsScene()
|
||||||
self.graphicsView.setScene(self.scene)
|
self.graphicsView.setScene(self.scene)
|
||||||
self.graphicsView.show()
|
self.graphicsView.show()
|
||||||
|
|
||||||
self.video = Video(video_dir)
|
self.now = 2400
|
||||||
self.mark = Mark(mark_dir,"王传林")
|
self.is_video_set = 0
|
||||||
self.max_mark = self.mark.max_frame()
|
self.is_label_set = 0
|
||||||
|
|
||||||
self.now = 0
|
|
||||||
self.show_frame()
|
|
||||||
|
|
||||||
|
|
||||||
def show_frame(self):
|
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)
|
frame_num, method_raw = self.mark.read(self.now)
|
||||||
img = self.video.read(frame_num)
|
img = self.video.read(frame_num)
|
||||||
cvimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 把opencv 默认BGR转为通用的RGB
|
cvimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 把opencv 默认BGR转为通用的RGB
|
||||||
@ -97,7 +109,8 @@ 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)
|
||||||
|
|
||||||
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)
|
method = self.mark.get_method(method_raw)
|
||||||
for i in method:
|
for i in method:
|
||||||
text += "\n" + i
|
text += "\n" + i
|
||||||
@ -114,6 +127,31 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|||||||
self.now += 1
|
self.now += 1
|
||||||
self.show_frame()
|
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__':
|
if __name__ == '__main__':
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
win = MainWindow()
|
win = MainWindow()
|
||||||
|
@ -2,10 +2,33 @@ import os
|
|||||||
import cv2
|
import cv2
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import re
|
import re
|
||||||
|
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)
|
||||||
total_frames = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
|
total_frames = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
|
||||||
@ -37,15 +60,20 @@ class Video:
|
|||||||
cap = self.video
|
cap = self.video
|
||||||
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num)
|
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num)
|
||||||
ret, img=cap.read()
|
ret, img=cap.read()
|
||||||
|
img = self.cut_border(img)
|
||||||
if ret:
|
if ret:
|
||||||
return img
|
return img
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
def cut_border(self, img):
|
||||||
|
# img = remove_the_blackborder(img)
|
||||||
|
return img
|
||||||
|
|
||||||
class Mark:
|
class Mark:
|
||||||
def __init__(self, mark_dir, sheet_name):
|
def __init__(self, mark_dir):
|
||||||
self.df = pd.read_excel(mark_dir, sheet_name=sheet_name)
|
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()
|
col_name = self.df.columns.tolist()
|
||||||
self.method = col_name[1:]
|
self.method = col_name[1:]
|
||||||
self.frame = self.df.loc[:,col_name[0]]
|
self.frame = self.df.loc[:,col_name[0]]
|
||||||
@ -62,6 +90,9 @@ class Mark:
|
|||||||
def max_frame(self):
|
def max_frame(self):
|
||||||
return self.total_frame
|
return self.total_frame
|
||||||
|
|
||||||
|
def sheet_list(self):
|
||||||
|
return self.sheet
|
||||||
|
|
||||||
def get_method(self, raw):
|
def get_method(self, raw):
|
||||||
method = []
|
method = []
|
||||||
NaN = pd.isnull(raw)
|
NaN = pd.isnull(raw)
|
||||||
@ -70,6 +101,13 @@ class Mark:
|
|||||||
method.append(self.method[i])
|
method.append(self.method[i])
|
||||||
return method
|
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__":
|
if __name__ == "__main__":
|
||||||
video_dir = "raw/video/王传林.mp4"
|
video_dir = "raw/video/王传林.mp4"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user