Video2MC / tools /videoThenAmination.py
Sapphire-356's picture
add: Video2MC
95f8bbc
raw
history blame
4.57 kB
'''
ๅ…ˆ็”Ÿๆˆๆ‰€ๆœ‰็š„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)