-1

我正在制作一个身体跟踪应用程序,如果用户选择跟踪他们的身体动作,我想在其中运行 Open Pose。OpenPose 二进制文件可以像这样运行:

bin\OpenPoseDemo.exe --write_json 'path\to\dump\output'

因此,在我的 Python 脚本中,我希望有一行代码可以运行 Open Pose,而不必通过打开单独的命令行窗口来要求用户手动运行 OpenPose。为此,我尝试过:

import os
os.popen(r"C:\path\to\bin\OpenPoseDemo.exe --write_json 'C:\path\to\dump\output'")

但这会产生以下错误:

Error:
Could not create directory: 'C:\Users\Admin\Documents\Openpose\. Status error = -1. Does the parent folder exist and/or do you have writing access to that path?

我猜这意味着 OpenPose 只能通过进入子目录所在的openpose目录来打开。bin所以,我写了一个包含这一行的 shell 脚本:

bin\OpenPoseDemo.exe --write_json 'C:\path\to\dump\output'

并将其保存run_openpose_binary.shopenpose目录中(即所在的同一目录bin)。

然后我尝试从我的 Python 脚本中运行这个 shell 脚本,如下所示:

import subprocess
subprocess.call(['sh', r'C:\path\to\openpose\run_openpose_binary.sh'])

这给出了以下错误:

FileNotFoundError: [WinError 2] The system cannot find the file specified

我还尝试了以下方法:

os.popen(r"C:\path\to\openpose\run_openpose_binary.sh")

os.system(r"C:\path\to\openpose\run_openpose_binary.sh")

这些不会产生任何错误,而是会弹出一个空白窗口并关闭。

所以,我的问题是,如何从我的 Python 脚本中运行 OpenPoseDemo.exe?

4

2 回答 2

0

对于您的最后一种方法,您缺少来自 os.popen 的返回值,它是一个管道。所以,你需要的是这样的:

# untested as I don't have access to a Windows system
import os


with os.popen(r"/full/path/to/sh C:/path/to/openpose/run_openpose_binary.sh") as p:
    # pipes work like files
    output_of_command = p.read().strip() # this is a string

或者,如果您想证明自己的未来,另一种选择是:

# untested as I don't have access to a Windows system
popen = subprocess.Popen([r'/full/path/to/sh.exe', r'/full/path/to/run_openpose_binary.sh')],  stdin=subprocess.PIPE, stdout=subprocess.PIPE,encoding='utf-8')
stdout, stderr = popen.communicate(input='')

如果您有进一步的困难,请发表评论。

于 2020-07-30T11:10:40.790 回答
0

我不得不多次打这场仗,我找到了解决办法。这可能不是最优雅的解决方案,但它确实有效,我将使用如何在视频上运行 OpenPose 的示例来解释它。您已经获得了 openpose 下载路径和视频路径,并且从那里它是一个 3 行解决方案。首先,将当前工作目录更改为该 openpose 文件夹,然后创建您的命令,然后调用 subprocess.run (我尝试使用 subprocess.call 并没有工作。我没有尝试 shell=False 但我听说它更安全方法。我会留给你。)

import os
import subprocess

openpose_path = "C:\\Users\\me\\Desktop\\openpose-1.7.0-binaries-win64-gpu-python3.7-flir-3d_recommended\\openpose\\"
video_path = "C:\\Users\\me\\Desktop\\myvideo.mp4"
os.chdir(openpose_path)
command = "".join(["bin\\OpenPoseDemo.exe", " -video ", video_path])
subprocess.run(command, shell=True)
于 2022-01-24T19:53:55.963 回答