Spaces:
Running
Running
File size: 4,566 Bytes
95f8bbc |
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
'''
先生成所有的2D坐标
再生成3D坐标,
再绘图,不是实时的
'''
import sys
import time
from argparse import ArgumentParser
import cv2
import pyqtgraph as pg
import pyqtgraph.opengl as gl
from pyqtgraph.Qt import QtCore, QtGui
from pyqtgraph.opengl import *
from tqdm import tqdm
from joints_detectors.openpose.main import load_model as Model2Dload
model2D = Model2Dload()
from joints_detectors.openpose.main import generate_frame_kpt as OpenPoseInterface
interface2D = OpenPoseInterface
from tools.utils import videopose_model_load as Model3Dload
model3D = Model3Dload()
from tools.utils import interface as VideoPoseInterface
interface3D = VideoPoseInterface
from tools.utils import draw_2Dimg, videoInfo, resize_img, common
common = common()
# 先得到所有视频的2D坐标,再统一生成3D坐标
def VideoPoseJoints(VideoName):
cap, cap_length = videoInfo(VideoName)
kpt2Ds = []
for i in tqdm(range(cap_length)):
_, frame = cap.read()
frame, W, H = resize_img(frame)
try:
joint2D = interface2D(frame, model2D)
except Exception as e:
print(e)
continue
draw_2Dimg(frame, joint2D, 1)
kpt2Ds.append(joint2D)
joint3D = interface3D(model3D, np.array(kpt2Ds), W, H)
return joint3D
item = 0
pos_init = np.zeros(shape=(17, 3))
class Visualizer(object):
def __init__(self, skeletons_3d):
self.traces = dict()
self.app = QtGui.QApplication(sys.argv)
self.w = gl.GLViewWidget()
self.w.opts['distance'] = 45.0 ## distance of camera from center
self.w.opts['fov'] = 60 ## horizontal field of view in degrees
self.w.opts['elevation'] = 10 ## camera's angle of elevation in degrees 仰俯角
self.w.opts['azimuth'] = 90 ## camera's azimuthal angle in degrees 方位角
self.w.setWindowTitle('pyqtgraph example: GLLinePlotItem')
self.w.setGeometry(450, 700, 980, 700) # 原点在左上角
self.w.show()
# create the background grids
gx = gl.GLGridItem()
gx.rotate(90, 0, 1, 0)
gx.translate(-10, 0, 0)
self.w.addItem(gx)
gy = gl.GLGridItem()
gy.rotate(90, 1, 0, 0)
gy.translate(0, -10, 0)
self.w.addItem(gy)
gz = gl.GLGridItem()
gz.translate(0, 0, -10)
self.w.addItem(gz)
# special setting
pos = pos_init
self.skeleton_parents = common.skeleton_parents
self.skeletons_3d = skeletons_3d
for j, j_parent in enumerate(self.skeleton_parents):
if j_parent == -1:
continue
x = np.array([pos[j, 0], pos[j_parent, 0]]) * 10
y = np.array([pos[j, 1], pos[j_parent, 1]]) * 10
z = np.array([pos[j, 2], pos[j_parent, 2]]) * 10 - 10
pos_total = np.vstack([x, y, z]).transpose()
self.traces[j] = gl.GLLinePlotItem(pos=pos_total, color=pg.glColor((j, 10)), width=6, antialias=True)
self.w.addItem(self.traces[j])
def start(self):
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
def set_plotdata(self, name, points, color, width):
self.traces[name].setData(pos=points, color=color, width=width)
def update(self):
time.sleep(0.03)
global item
pos = self.skeletons_3d[item]
print(item, ' ')
item += 1
for j, j_parent in enumerate(self.skeleton_parents):
if j_parent == -1:
continue
x = np.array([pos[j, 0], pos[j_parent, 0]]) * 10
y = np.array([pos[j, 1], pos[j_parent, 1]]) * 10
z = np.array([pos[j, 2], pos[j_parent, 2]]) * 10 - 10
pos_total = np.vstack([x, y, z]).transpose()
self.set_plotdata(
name=j, points=pos_total,
color=pg.glColor((j, 10)),
width=6)
def animation(self):
timer = QtCore.QTimer()
timer.timeout.connect(self.update)
timer.start(1)
self.start()
def main(VideoName):
print(VideoName)
joint3D = VideoPoseJoints(VideoName)
v = Visualizer(joint3D)
v.animation()
cv2.destroyAllWindows()
if __name__ == '__main__':
parser = ArgumentParser()
parser.add_argument("-video", "--video_input", help="input video file name", default="/home/xyliu/Videos/sports/dance.mp4")
args = parser.parse_args()
VideoName = args.video_input
main(VideoName)
|