PyQT基本语法和操作

环境配置与GUI绘制思路

UI和算法代码看作前端和再

UI与代码分离

用 Qt Designer 设计界面并保存为 mywidget.ui,在代码里动态加载 .ui 文件,用 uic 模块加载

比如一个按钮叫 pushButton,就可以用 self.pushButton 访问。

不用生成 Python 代码,方便快速修改 UI

1
2
3
4
5
6
7
from PyQt5 import uic
from PyQt5.QtWidgets import QWidget

class MyWidget(QWidget):
def __init__(self):
super().__init__()
uic.loadUi('mywidget.ui', self) # 直接加载ui文件,控件自动成为self的属性

UI设计完转化为py然后再补充算法代码

用 Qt Designer 设计全新界面,生成 .UI文件,然后用pyuic转化.

UI 改动后要重新用 pyuic5 生成

1
pyuic5 -o ui_mywidget.py mywidget.ui
1
2
3
4
5
6
7
8
from PyQt5.QtWidgets import QWidget
from ui_mywidget import Ui_Form # 这个名字看你的ui设计文件的类名

class MyWidget(QWidget, Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self) # 这个方法来自 Ui_Form,完成控件初始化
# 你可以在这里写逻辑,连接信号槽等

直接用py写UI和算法代码

QSS设置现代风格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

app = QApplication([])

window = QWidget()
window.setWindowTitle("现代化PyQt界面")
window.setStyleSheet("""
QWidget {
background-color: #f0f2f5;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
}
QPushButton {
background-color: #0078d7;
color: white;
border: none;
border-radius: 6px;
padding: 10px 20px;
font-size: 14px;
font-weight: 600;
transition: background-color 0.3s ease;
}
QPushButton:hover {
background-color: #005a9e;
}
""")

layout = QVBoxLayout()
btn = QPushButton("点击我")
layout.addWidget(btn)
window.setLayout(layout)

window.show()
app.exec()

PyQT运行深度学习算法 QThread + subprocess+cmd

PyQT打印print()和重定向算法进程输出

  • 如果没有其他操作,print会打印在终端,在pyinstaller导出的时候会打开exe同时创建一个终端并可以打印输出,也输出可能会丢失。最好创建一个输出控制台
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from PyQt5.QtWidgets import QTextEdit
import sys

class ConsoleOutput(QTextEdit):
def __init__(self):
super().__init__()
self.setReadOnly(True)

def write(self, text):
self.insertPlainText(text) # 在QTextEdit中显示文本
self.ensureCursorVisible() # 自动滚动到底部
def flush(self): # 需要实现flush方法以完全模拟sys.stdout
pass

# 在主窗口中添加
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
central = QWidget()
layout = QVBoxLayout()
self.console = ConsoleOutput()
layout.addWidget(self.console)
central.setLayout(layout)
self.setCentralWidget(central)

# 重定向标准输出
sys.stdout = self.console
sys.stderr = self.console
# 如果需要恢复原始终端输出
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
# 测试输出
print("=== 应用启动 ===")
print("标准输出和错误都会显示在这里")
print("\033[91m红色错误消息\033[0m") # 如果终端支持颜色
print("这条消息会显示在GUI中!") # 现在会显示在QTextEdit里
  • 但是子进程的输出需要定向到主pyQT才能输出

cv.imshow与pyQT冲突

  • 纯 headless + PyQt 显示
1
2
pip uninstall opencv-python 
pip install opencv-python-headless -y
  • 但是有时候这个方法不好,还是想写imshow,那就用qt重新编写imshow

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import cv2
    from PyQt5.QtWidgets import QApplication, QLabel
    from PyQt5.QtGui import QPixmap, QImage

    def custom_imshow(title, image):
    app = QApplication.instance()
    if app is None:
    app = QApplication([])

    label = QLabel()
    qimage = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888)
    pixmap = QPixmap.fromImage(qimage)
    label.setPixmap(pixmap)
    label.setWindowTitle(title)
    label.show()
    app.exec_()

    # 替换原版 cv2.imshow
    cv2.imshow = custom_imshow

使用PyInstaller打包conda环境和GUI及算法为exe

1
pip install pyinstaller
  • PyInstaller会通过分析你的Python脚本来自动检测依赖关系,对于SciPy这样的科学计算库,PyInstaller通常能够自动检测并包含它们。包括:

    • 直接import的库

    • 间接依赖的库

    • 动态加载的库

  • 直接使用命令行即可打包

1
2
3
4
pyinstaller --onefile --windowed app.py 
# 用`--onedir`而不是`--onefile`创建目录分布
# 如果某些库未被自动包含,用显式包含hidden-import
pyinstaller --onefile --hidden-import scipy --hidden-import numpy app.py
  • 但是由于深度学习模型通常有较大的依赖,建议创建一个spec文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# keypoint_detector.spec
block_cipher = None

a = Analysis(['app.py'],
pathex=['/path/to/your/project'],
binaries=[],
datas=[('demo.py', '.'), ('data', 'data')], # 包含你的模型文件和数据
hiddenimports=['cv2', 'numpy.core._dtype_ctypes'], # 显式包含一些库
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='KeypointDetector',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False) # 设置为False以隐藏控制台窗口
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='KeypointDetector')
1
pyinstaller keypoint_detector.spec
  • 在Ubuntu上使用PyInstaller打包的EXE文件无法直接在Windows系统上运行,需要在Windows重新打包

    • 二进制不兼容:Linux和Windows使用完全不同的可执行文件格式(ELF vs PE)
    • 依赖库差异:系统库和Python扩展模块(.so vs .dll)格式不同
    • 路径处理差异:Linux和Windows使用不同的路径分隔符(/ vs \)
    • CUDA工具链在Linux和Windows上是不同的
    • PyInstaller打包时绑定了特定平台的CUDA相关库
    • Python轮子(wheel)也是平台特定的(manylinux vs win32/win_amd64)
  • 使用UPX压缩解决打包后文件过大

1
pyinstaller --upx-dir=/path/to/upx ...

可视化平台制作GUI搭建过程

基于已有的图形处理库以及深度学习模型等,结合GUI编程,研制具有可视化操作界面的运动学数据提取与分析工具(简称“提取分析工具”),实现图像和视频中目标对象的运动学数据提取与统计分析,主要功能及技术指标要求如下:

a. 图像和视频显示与播放功能,能够打开1个或多个图像和视频进行显示与播放,支持多窗口同步显示与播放;

b. ~~运动学数据提取功能,能够选择视频起止时间,基于深度学习模型等提取该时间段内视频中的运动学数据,~~视频中目标对象有1个或2个;

c. 运动学数据显示功能,能够对提取的运动学数据进行三维可视化显示,如以棍棒骨架或三维模型等形式显示,能够和视频同步显示;

d. 运动学数据修正功能,主要包括:

(1) 选择某一时间点数据进行删除;

(2) 复制某一时间点的数据并插入到另一时间点之后;

(3) 修改某一时间点的1个或多个关节角度数据;

(4) 选择两个时间点,通过对两个时间点的数据进行插值计算生成新的数据,并覆盖两个时间点内原有的数据。

e. 运动学数据导出功能,能够将提取的运动学数据导出为BVH或EXCEL文件,文件中需要包含目标对象的骨架系统信息以及视频每一帧对应的目标对象的姿态角度数据等,骨架系统的定义标准由委托方提供;

f. 运动学数据分析功能,包括:

(1) 特征参数计算,针对提取的运动学数据,实现关节点速度、加速度、角位移等运动参数求解功能;

(2) 特征参数查看,以图表等形式查看特征参数计算结果,能够与运动学数据同步动态查看;

(3) 特征参数导出,将特征参数计算结果导出为EXCEL等格式的文件。

g. 模型训练与优化功能,提供可视化界面支持开展模型训练与优化,如通过手工标记的二维图像和视频对模型进行模型训练,支持新标记数据的增量式学习;

模块总框架

pyQT制作

深度学习脚本使用OS命令运行,不打包成库

PyInstaller打包为exe

但是需要在windows下重新打包才能使用

我需要用pyQT做一个可视化界面,用于人体位姿识别和结果导出以及可视化,具体操作流程如下:

  1. 单目视频人体关节检测(第一个大界面)
    1. 选择视频,点击摁纽打开文件浏览器,选中一个视频比如1.avi
    2. 选择使用的检测权重,点击摁纽打开文件浏览器,选择AlphaPose使用的权重权重,比如default.pth
    3. 执行检测:点击摁纽执行关键点检测,执行命令CUDA_VISIBLE_DEVICES=0 python demo_inference.py --cfg configs/coco22/resnet/a256x192_res152_lr1e-3_1x-duc.yaml --detector yolox-s --checkpoint 权重路径 --video 视频路径 --outdir 视频路径/AlphaposeResult+视频名称前缀 --pose_track --save_video --vis_fast,然后就会在输出路径创建一个AlphaposeResult+视频名称前缀保存识别结果视频和一个结果json文件,应有一个进度条表现当前检测运行进度
    4. 查看识别结果:点击摁纽播放检测结果视频,可以快进,有进度条,有播放/暂停摁建
    5. 查看每个关键点检测结果:可以拉一个下拉栏查看22个关节点的检测结果,根据json文件绘制一个曲线,x坐标是视频的总帧数,y轴是当前识别到的关键点的X坐标变化(归一化到0到10),表现当前识别结果,有则绘制上点,没,有则不绘制
    6. 插值功能,点击摁纽则对识别结果则运行脚本进行插值,对没有识别到的部分进行二维坐标插值
  2. 三维人体关节生成功能(第二个大界面)
    1. 经过人体关节检测之后可以把单目识别的二维关键点转化为三维关键点
    2. 选择单目模式或者多目模式:下拉框选择单目模式或者多目模式,如果选择单目模式则下面出现一个视频文件选择框,选择一个包含视频和alphapose识别结果json的文件夹,选择多目模式,则下面出现一个文件夹选择框和一个标定文件输入框,文件夹选择框可以选择一个文件夹输入文件夹下应包含多个视频比如1.avi 2.avi 3.avi,和对应的alphapose识别结果json文件的文件夹,标定文件输入框可以选择一个json标定文件输入
    3. 单目检测结果生成三维骨架:如果是单目模式下,点击摁纽则执行脚本python demo.py,脚本会在视频目录下保存一个MonoResult文件夹,里面包含一个识别结果视频和对应的SMPL的JSON文件,应有一个进度条表现当前检测运行进度
    4. 多目检测结果生成三维骨架:如果是多目模式下,点击摁纽则执行脚本python3 scripts/preprocess/extract_video.py {data} --handface和python3 apps/demo/mv1p.py {data} --out ${data}/output/smpl --vis_det --vis_repro --undis --sub_vis 1 7 13 19 --vis_smpl,执行脚本之后会在目录下保存识别结果视频和对应的SMPL的json文件,应有一个进度条表现当前检测运行进度
    5. SMPL重建结果查看功能:点击摁纽播放SMPL重建结果视频,可以快进,有进度条,有播放/暂停摁建
    6. 导出重建结果功能:可以选择导出CSV或者BVH,使用下拉框选择,然后点击导出摁纽弹出文件浏览器选择导出目录,然后就执行脚本 python export.py -dataFolder 导出到目录
  3. 重新训练功能(第三个大界面)
    1. 选择数据集目录:选择数据集目录该数据集包括train和valid文件夹,文件夹中包括labelme的json文件和同名的图片
    2. 选择预训练权重:点击摁纽打开文件浏览器,选中一个alphapose的权重比如default.pth
    3. 点击摁纽处理数据集:点击摁纽则处理数据集目录下的数据集,会运行python labelme2coco。py,该脚本会把数据集中的文件夹重新命名为数字并在同级目录创建一个annotation文件夹保存标注文件
    4. 点击摁纽进行训练,点击摁纽则运行CUDA_VISIBLE_DEVICES=2 ./scripts/train.sh ./configs/coco22/resnet/a256x192_res152_lr1e-3_1x-duc.yaml 0517res152num22 然后就会进行训练,需要根据终端输出在可视化界面查看训练进程

综上你需要设计一个软件内容如上,可视化界面有三个大子页面:单目视频人体关节检测,三维人体关节生成功能,重新训练功能,每个界面的子功能如

增量训练模块

数据集处理部分

经过select_dataset并选择了一个包含train2017和val2017的文件夹,并且每个文件夹里面包含了jpg图和对应的labelme标注文件,需要检查select_dataset选择的文件夹下面包不包含train2017和val2017,如果不是则不保存路径,并在log_output进行输出。然后点击preprocess_btn进行数据预处理,在run_preprocess函数中,需要调用其他python脚本进行数据处理,具体命令如下
其中self.dataset_path/是select_dataset已经获得的路径
python tools/convertjpg.py self.dataset_path/val2017
python tools/convertjpg.py self.dataset_path/train2017
python tools/labelme2cocoAll.py self.dataset_path/train2017 1 train
python tools/labelme2cocoAll.py self.dataset_path/val2017 800000 val
python tools/insertCOCOUrl.py self.dataset_path/annotationsFull/convertcoco_full_person_keypoints_train2017.json train2017 person_keypoints_train2017.json
python tools/insertCOCOUrl.py self.dataset_path/annotationsFull/convertcoco_full_person_keypoints_val2017.json val2017 person_keypoints_val2017.json
python tools/changeNameToNumber.py self.dataset_path/annotationsFull/person_keypoints_train2017.json self.dataset_path/train2017 1
python tools/changeNameToNumber.py self.dataset_path/annotationsFull/person_keypoints_val2017.json self.dataset_path/val2017 800000
然后把self.dataset_path/目录下的annotationsFull文件夹复制一份到self.dataset_path/目录下并重命名为annotation

训练部分

把a256x192_res152_lr1e-3_1x-duc.yaml保存到gui文件夹下

首先保存一个alphapose的目录,self.alphapose_path=…/alphapose,默认的pth权重是self.alphapose_path/exp/0607res152num22setdetsrepeatwight-a256x192_res152_lr1e-3_1x-duc.yaml/final.pth,经过select_weight函数并选择一个pth文件,在select_weight函数中需要检查是否是pth,如果是则更新self.weight_path。如果有了权重路径self.weight_path和处理完的数据集self.dataset_path,点击train_btn进入run_training函数,先检查权重路径和数据集路径是否存在,并检查数据集路径下是否包含annotations和train2017和val2017目录,如果包含的话检查在annotations下是否包含person_keypoints_train2017.json和person_keypoints_val2017.json。然后根据已经保存的变量更改当前config文件configs/coco22/a256x192_res152_lr1e-3_1x-duc.yaml,具体而言把DATASET:TRAIN:ROOT和DATASET:VAL:ROOT和DATASET:TEST:ROOT,这三个三级yaml条目更改为数据集目录self.dataset_path,比如’/home/houbosen/coco0606’。更改MODEL:TRY_LOAD:二级yaml条目为self.weight_path权重目录,比如 ‘pretrained_models/fast_421_res152_256x192.pth’。并删除alphapose目录下exp/json的文件。训练后的文件保存名称为self.trainID:“当前时间+train”

最后执行训练命令,训练命令如下,并把训练的输出打印到self.log_output:

python self.alphapose_path/scripts/trainRepeatweight.py --cfg ./configs/coco22/resnet/a256x192_res152_lr1e-3_1x-duc.yaml --detector yolox-s --exp-id self.trainID

检测模块

我需要用pyQT写一个Qwidgt模块,总体是加载单视角或者多视角的图片或者视频然后、使用alphapose进行检测,alphapose的目录为self.alphapose_path = os.path.join("…", “AlphaPose”),并把检测结果保存到图片的同级目录中:这个模块首先可以打开一个文件浏览器加载视频或者图片或者含有视频的文件夹:

  1. 如果打开的是一个图片,则进入图片模式,首先显示当前图片,注意把图片进行缩放使得图片按照适应当前显示屏幕大小展示,然后只有一个检测功能摁钮,运行python self.alphapose_path/demo_inference.py --cfg configs/coco/resnet/256x192_res50_lr1e-3_1x.yaml --checkpoint self.alphapose_path/exp/250420FirstTrain-256x192_res50_lr1e-3_1x.yaml/model_199.pth --image test.jpg --outdir 保存地址是test.jpg同级目录下创建同名文件夹 --pose_track --save_img --vis_fast,检测结果保存test.jpg同级目录下同名文件夹有一个AlphaPose_原文件名.jpg,在然后还有一个显示检测结果摁纽,点击则显示检测结果到刚才显示图片的位置
  2. 如果打开的是一个视频文件,则进入单视频模式,首先展示当前视频,注意把视频缩放到适应当前显示屏幕大小展示,然后有一个进度条,有暂停/播放摁建,进度条有两个进度块,拖动左边的可以设置起始帧,拖动又变的可以设置结束帧,然后需要把当前起始帧/结束帧/总帧数打印到进度条旁边。然后有一个检测功能摁纽,如果摁下则首先把视频按照起始帧和结束帧截取出目标视频段然后保存为一个新的视频文件,命名为视频原名称+cliped.mp4,保存到原视频的同名文件夹下,然后再运行python self.alphapose_pat/demo_inference.py --cfg configs/coco/resnet/256x192_res50_lr1e-3_1x.yaml --checkpoint self.alphapose_pat/exp/250420FirstTrain-256x192_res50_lr1e-3_1x.yaml/model_199.pth --video截取出来的视频的文件 --outdir 原视频的目录下创建的一个同名文件夹 --pose_track --save_video --vis_fast,检测结果保存在原视频的目录下的同名文件夹有一个AlphaPose_原文件名,然后还有一个显示检测结果摁纽,点击则显示检测结果则在原视频位置播放检测视频
  3. 如果打开的是一个文件夹,则进入多视频模式,首先会检测当前文件夹下所有视频文件,比如
    data包含202403270042_Miqus_2_28518.avi和202403270042_Miqus_5_28518.avi和202403270042_Miqus_9_28518.avi和202403270042_Miqus_13_28518.avi个视频,然后判断这几个视频文件是否帧数是相同的,如果不相同则弹出error说明该视频文件夹下所有视频帧数不同,无法进行多视频检测,如果帧数相同,则一次性展示所有视频,注意将多个视频进行缩放使得适应当前显示屏幕大小,一般来说,一行有四个视频即可,也有可能文件夹有三个或者两个,如果多于4个则再另起一行进行显示,注意只有一个播放进度条,有暂停/播放摁纽,同步播放或者暂停所有视频,进度条有两个进度块,拖动左边的可以设置起始帧,拖动又变的可以设置结束帧,然后需要把当前起始帧/结束帧/总帧数打印到进度条旁边。然后有一个检测功能摁纽,如果摁下则首先分别把每个视频按照起始帧和结束帧截取出目标视频段然后保存为一个新的视频文件,命名为视频原名称+cliped.mp4,保存到原视频的同名文件夹下,然后再分别运行python self.alphapose_pat/demo_inference.py --cfg configs/coco/resnet/256x192_res50_lr1e-3_1x.yaml --checkpoint self.alphapose_pat/exp/250420FirstTrain-256x192_res50_lr1e-3_1x.yaml/model_199.pth --video截取出来的视频的文件 --outdir 原视频的目录下创建的一个同名文件夹 --pose_track --save_video --vis_fast,检测结果保存在每个原视频的目录下的同名文件夹有一个AlphaPose_原文件名,然后还有一个显示检测结果摁纽,点击则显示检测结果则在每个原视频位置播放检测视频

修正编辑模块

有一个视频和视频中人的alphapose的识别结果,创建一个pyqt的QWidget,打开一个文件浏览器,输入一个视频,则再在视频同级文件夹下找到alphapose_result.json。alphapose识别结果是一个json文件,文件中是每一帧的人体22个关节坐标和置信度,现在我需要做一个播放功能,有一个进度条调整当前播放帧,可以暂停,播放和可以拖动,有一个label展示当前进度条在哪一帧,然后需要通过当前帧值找到alpahpose中对应帧的识别结果然后把置信度大于0.5关节点的绘制到画面上,但是需要画面上的关节点是可以拖动的,因为识别结果可能不对,然后拖动之后json文件中对应的关节坐标也会更新。还可以右键点击关节点删除该关节点。建立一个button,可以输入一个其他帧的帧值,把输入帧的关节坐标数据复制覆盖到当前帧上并更新json中对应帧的数据。再添加一个功能,输入两帧的帧值,通过插值生成覆盖数据,并更新json中对应帧的数据。我输入的json文件就是一个alphapose的识别结果。你需要通过pyQT实现

三维重建

视频名.avi/图片名.png

视频名/图片名包含alpahpose.json,Alphapose_视频名_cliped.avi或者AlphaPose_图片名.png

单目模式下

选择单目模式,选择视频或者图片之后,检测本地是否有同名的文件夹,如果是视频,检查文件夹中是否包含alphapose.json和Alphapose_视频名_cliped.avi,如果是图片,检查是否包含AlphaPose_图片名.png。如果是视频,则只取alphapose.json的每个图片的id为1的图,如果没有则创建一个66个0的json文件

我需要利用qyQT创建一个继承wight的界面,内容是输入单目或者多目视频利用他们的识别出来的Alphapose人体关节数据重建人体的SMPL模型并展示,这个界面可以选择进入单目重建模式或者多视角模式。

单目模式下,可打开文件浏览器,打开一个视频或者一个图片

如果是单目模式并且输入是一个视频videoname.avi,在视频同级目录应包含一个同名文件夹videoname,并且同名文件夹中应包含一个alphapose-result.jsonAlphaPose_videoname_cliped.avi,videoname_cliped.avi三个文件,如果没有同名文件夹或者文件则弹出错误对话框“请先执行检测并保证检测结果按照以下格式命名”,如果都存在,则首先在打开目录摁钮下面播放视频AlphaPose_videoname_cliped.avi,视频下面有播放/停止摁钮和拖动条,如果检测结果都存在允许摁下“单目重建”摁钮进行单目重建,运行python …/key2mesh/fitmono.py --input_dir videoname文件夹,然后就会在videoname文件夹下保存了一个monoreconstruction目录,里面保存了视频所有帧的重建结果图片,图片命名格式为000000.jpg,在播放视频下面有一个“展示重建结果”摁钮,摁下则原先播放视频的位置会播放monoreconstruction目录下所有的重建图片,也有播放/停止摁钮和进度拖动条。 在播放视频框下面有一个log_output的text位置,会把该软件的输出以及python子脚本输出一起打印出来

在单目模式并且输入是一个图片imgname.png,在图片同级目录应包含一个同名文件夹imgname,并且同名文件夹中应包含一个alphapose-result.json,AlphaPose_imgname.png,imgname.png三个文件,如果没有同名文件夹或者文件则弹出错误对话框“请先执行检测并保证检测结果按照以下格式命名”,如果都存在,则首先在打开目录摁钮下面展示图片AlphaPose_imgname.png,图片输入时候播放/停止摁钮和拖动条不可点击,如果检测结果都存在允许摁下摁钮进行单目重建,运行python …/key2mesh/fitmono.py --input_dir imgname文件夹,然后就会在imgname文件夹下保存了一个monoreconstruction目录,里面保存了视频所有帧的重建结果图片,图片命名格式为000000.jpg,在播放视频下面有一个“展示重建结果”摁钮,摁下则原先播放视频的位置会播放monoreconstruction目录下所有的重建图片,也有播放/停止摁钮和进度拖动条。

如果是多目模式下,点击文件浏览器,打开必须是一个文件夹,文件夹下应包含多个视频(videoname1.avi,videoname2.avi,videoname3.avi)和同名的文件夹(videoname1,videoname2,videoname3),每个文件夹包含alphpose-result.json和AlphaPose_videoname1_cliped.avi,videoname1_cliped.avi,如果视频只有一个或者每个视频缺少对应的文件夹和文件夹下面的文件,则弹出报错“视频数目过少”“缺少检测结果:”,然后如果都存在则可以点击下面的“加载标定数据”然后需要输入一个json文件,然后会运行“python convertjson2yml.py json文件目录”,运行完之后会保存一个yml文件到当前文件夹下并读取yml文件中的相机的数据(有1,2,3,4等13个)并弹出一个框,框中左边是每个视频名称videoname1,2,3列排列,每个videoname的右边有一个下拉选项框,可以选择对应的相机数据序号(1,2,3,4等13个),需要给每个相机videoname都选择完,然后就可以在底部摁下“多目重建”,摁下则执行“python …/eastmocap/demo_interface.py --input_dir 当前工作文件夹” 注意所有模式下最底部有一个text_output可以输出软件的输出和所有运行的python脚本的输出

在播放过程中,每个图片或视频帧要锁定纵横比缩放并padding到1920*1088

继续补充弹出yml匹配每个视频对应的匹配相机id,首先利用camera_idx = python readyml.py --input_path,camera_idx = [1,2,3,4,9,6],然后比如读取到多目文件夹下保存了videoname1.avi videoname2.avi videoname3.avi videoname4.avi则弹出的提示框左边是一个下拉框,下拉框的内容是camera_idx的每个id,需要选择每个视频对应的id,如果id都选择了可以点击弹出框的“确认”摁钮,则下拉框关闭,并保存每个视频对应的相机id到一个self.camera_map