python实现批量Reconstruct、Lable以及fiterdata、solving、输出sovle骨骼脚本

在这里,我将介绍有关shogun post的一个python自动化脚本。

功能一:批量Reconstruct、Lable

功能二:批量fiterdata、solving、输出sovle骨骼

首先导入我们需要的库:ViconShogunPostSDK、os

import ViconShogunPostSDK
import os
import ViconShogunPostSDK.ViconShogunPost
shogun = ViconShogunPostSDK.ViconShogunPost()

定义一个存储的路径,如果不想设置为默认路径的话,可以通过input函数来进行输入路径,来进行自定义路径保存。
path = "D:/project_file/shougun/python/"

首先我们实现功能一:
定义一个函数:first_process

def first_process( name ) :
    
    if os.path.splitext(name)[1] == ".x2d": 
        
        shogun.Scene.New()  #加载一个新场景
        
        shogun.Scene.Load( os_x2d_name ) #加载.x2d文件
        
        shogun.Offline.Reconstruct() 
        
        shogun.Offline.AutoLabel() 
        
        file_name_vdf = os.path.splitext(name)[0] #分离.x2d文件名
        
        file_name_vdf = dirs + file_name_vdf + ".vdf" 
        
        shogun.Scene.Export(file_name_vdf)
        
    else:
        pass    

首先需要传入一个文件名,然后进行判断文件是否为.x2d文件,如果是,则在shogun post里新建一个场景,然后加载.x2d文件,接着执行Reconstruct、AutoLabel操作。接下来我们截取x2d的文件名,加上扩展名.vdf,最后输出保存vdf文件。
PS:在path目录下新建一个vdf的文件夹,python将输出的vdf文件保存在vdf文件夹中。至此,功能一实现。

其次定义第二个函数:Second_process

def Second_process( name ) :
    
    if os.path.splitext(name)[1] == ".vdf": 
        
        shogun.Scene.New()  #加载一个新场景
        
        shogun.Scene.Load( os_vdf_name ) #加载.vdf文件
        
        shogun.Offline.Solve()
        
        file_name_fbx = os.path.splitext(name)[0]
        
        file_name_fbx = path_fbx + file_name_fbx + ".fbx"
               
        export_solvebone(file_name_fbx)        
        
    else:
        pass

在第二个函数中,同样需要传入一个文件名,然后判断文件是否为vdf格式的,因为我们处理过vdf文件夹中的数据后,将其保存后一定为vdf格式的文件,所以,遍历vdf文件夹中的vdf格式的文件。进行solve处理,然后分离文件名。添加.fbx扩展名,然后调用我们第三个函数export_solvebone输出结算后的骨骼。
接下来是我们的第三个函数export_solvebone:

def export_solvebone(path1):
    
    shogun.Scene.DeselectAllObjects()
    
    object1 = "SolvingBone"
    
    shogun.Scene.SelectObjectsOfType(object1)
    
    HSL_String =  "saveFile -s "  + '\"' + path1 + '\"' + ";"

    
    Result = shogun.HSL(HSL_String) 

在输出骨骼之前,我们将进行不选择所有的object,接着选择SolvingBone,在Vicon给出的SDK中Export有一个参数不太明确,所以需要以后继续研究,在这里我们采用在python中调用HSL脚本来进行输出,将HSL的命令传入shogun.HSL中,至此我们选择了SolvingBone,我们的目的是为了输出SolvingBone,所以需要在FileExport中设置仅输出我们选择的object
至此功能二完成

功能三:filter data
因为在处理数据的时候有些时候回忘记平滑,所以最好也将filter data加入自动化执行的脚本中。所以添加了第四个函数:filter data

def filter_data():
    shogun.Scene.DeselectAllObjects()
    
    object1 = "Marker"
    
    shogun.Scene.SelectObjectsOfType(object1)
    
    shogun.Timeline.SelectAll()
    
    Result = shogun.HSL('filter 0.300000 15.000000;')

首先我们选择对marker进行filter data,接着我们在Timeline上选择所有的帧。接着使用Result = shogun.HSL(‘filter 0.300000 15.000000;’)来进行数据平滑。

接下来我们需要定义一个创建文件夹的函数:create_dir
判断vdf、fbx文件是否存在,如果不存在就创建。

def create_dir(path_dir):
    if os.path.exists(path_dir):
        pass
    else:
        os.mkdir( path_dir ) 

最后我们来看一下主程序:

model = input("please input your process : 1 is reconstrust and labled, 2 is solving : ")

dir_x2d = os.listdir(path)
print(dir_x2d)
dirs = path + "vdf/"
print(dirs)
create_dir(dirs)

path_fbx = path + "fbx/"
print(path_fbx)
dir_vdf = os.listdir(dirs)
print(dir_vdf)
create_dir(path_fbx)

if model == 1 :
    for file_name in dir_x2d:
        os_x2d_name = path + file_name
        print(os_x2d_name)
        first_process( file_name )
        
if model == 2 :
    for file_name in dir_vdf: 
        filter_data()
        os_vdf_name = dirs + file_name
        Second_process(file_name)     
    

开始的通过输入1和2进行模式选择,当然模式二实在模式一的正确运行的基础上才能运行的,

看!是不是很方便呢!
如您在使用过程中遇到问题或者发现错误请联系作者QQ:158416830

发布了56 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41363156/article/details/86563390