【OpenPose-Windows】运行OpenposeDemo.exe 如何保存图像运行结果及关节点信息

本文介绍如何通过命令行和修改源代码的方式保存OpenPose运行结果,包括图像、关节点坐标及人数统计等数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跑过很多次openposeDemo了,不管是video、Webcam还是Images,都是运行结果一闪而过,然而我们所要的肯定不是只看一下运行结果就完事的,很多情况下,我们都希望能够把运行结果的图像、关节点坐标信息、人数统计等数据信息全部保存下来,以便于我们对openpose进行更加深入的分析和应用,那么这篇博客的作用就是告诉大家如何把这些运行结果保存下来。
openposeDemo的程序运行结果的保存,其实有两种方式,一种便是直接使用官方Githubopenpose demo的1.0.1的发布版本的命令行操作,另一种就是修改openposeDemo的源代码的方式,使得编译发布版本的程序直接可以保存运行结果。下面,笔者就两种方式做详细介绍。

一、命令行模式

根据官方Github quick-start文档,Windows上运行openposeDemo 1.0.1版本的程序如下,
这里写图片描述
这里写图片描述
这里写图片描述

根据以上命令,如果需要保存运行图片结果,亦或是保存关节点(特征点)的坐标信息,亦或是保存人数统计的信息内容,可运行如下命令
【PS】下述命令仅提供Images的命令,其他Video和Webcam的保存方式与Images的一致。

在examples/文件夹下创建与media文件夹并列的文件夹media_out,然后运行如下程序

保存图像

bin/OpenPose.exe --image_dir examples/media/ --write_images examples/media_out/

write_images:源代码给出的解释为”Directory to write rendered frames in write_images_format image format.examples”,即为存储运行结果图像的路径设置,其格式为 write_images_format ,默认为png格式。上面的命令默认将添加了骨骼的图像保存到 media_out文件夹下。

保存json文件

bin/OpenPose.exe --image_dir examples/media/ --write_keypoint_json examples/media_out/

write_keypoint_json:源代码给出的解释为”Directory to write the people body pose keypoint data. Set format with write_keypoint_format“,即为人体骨骼姿态的关节点数据文件,文件格式为 write_keypoint_format,默认为 json格式。上面的命令默认将添加了骨骼的图像保存到 media_out文件夹下。
下图表示一张人体骨骼关键点的json文件,笔者没有运行face和hand模型,因而只显示了pose关节点的数据信息。
这里写图片描述
“pose_keypoints”即为当前图像中人体18个关节点的数据信息,其具体的含义还有待深入的了解,这里笔者就不做深究了,至于如何看出是18个关节点,其实我们随便看一遍这个数据集,马上就能看出大概3个数据为一组,即表示一个关节点,刚好有18组信息。
【2017/8/6】看过官方Github提供的文档output.md才知道,原来一个关节点信息包括(x,y,score)三个信息,x和y即为图像中的坐标信息,取值范围为(0,image.size),而score则表示预测评分,做了归一化处理,取值范围(0,1),越接近1值表示预测的越准确,其关节点的还原度就越高,同时姿态的还原度也就越高。
以上关节点的坐标信息可以参考官方文档给出的模型,如下,进行研究
这里写图片描述
【PS】该模型提供的是COCO 18个关节点的骨骼模型。

保存yml文件

bin/OpenPose.exe --image_dir examples/media/ --write_keypoint examples/media_out/

write_keypoint:源代码给出的解释为”File extension and format for write_keypoint: json, xml, yaml & yml. Json not available for OpenCV < 3.0, use write_keypoint_json instead”,即为人体骨骼姿态的关节点数据文件,文件格式为 write_keypoint,默认为 yml格式。上面的命令默认将添加了骨骼的图像保存到 media_out文件夹下。
【PS】注意Opencv低于3.0版本的,不支持json格式的文本输出,当然,官方提供的Opencv是高于3.0的,大家一开始学习为了避免问题,尽可能使用官配版本。
下图表示一张人体骨骼关键点的yml文件,笔者没有运行face和hand模型,因而只显示了pose关节点的数据信息。
这里写图片描述
使用同样的办法可以生成xml文件,至于yml文件中具体的含义,这里笔者也不再详细介绍,因为笔者暂时也还没弄明白,欢迎已经弄清楚的小伙伴给笔者留言。
【2017/8/6】
关于yml文件
“%YAML:1.0”表示当前yaml使用版本为1.0;
“pose_0”表示当前处理图像的全部姿态信息,包括单人情况和多人情况;
“sizes”表示当前”data”为大小是1*18*3的矩阵,其中,”1”表示统计到人的数量,”18”表示使用的model应该检测到的关节点的数量,笔者使用的是COCO,故而是18,3表示一个关节点的坐标和score信息。
“dt”这个东东笔者还没弄清楚,怀疑是数据的格式为float,还有待验证。
“data”中具体数据的含义暂时还没搞懂。

二、源码修改编译发布模式

源码修改更是方便,现在让我们来看看openposeDemo的源代码内容,
这里写图片描述
其中有这样一段,这里我看明确的看到注释的“//Result Saving”信息,以上9个值字段便是为运行结果进行保存所准备的,具体的含义,笔者在这里就不再胡乱的翻译了,大家可以看右侧的字段解释,修改自己想要保存的结果以及保存结果的路径后,就可以执行openposeDemo的程序,生成可执行文件啦,其生成的内容参见命令行模式方案。

三、题外话—关于Ubuntu

笔者在帮助网友在Ubuntu上保存运行结果的过程中发现,其实Ubuntu和Windows上的命令是一致的,只要吧可执行的命令换成Ubuntu的,如下所示

./build/examples/openpose/openpose.bin --image_dir examples/media/ --write_images examples/media_out/

其他命令可以类比来进行修改。

【PS】以上内容为笔者探索openpose过程中的浅见,欢迎各位openpose爱好者指出问题和技术交流,如有不当之处,请留言给笔者。

### OpenPose与Darknet结合的安装、配置及使用教程 #### 安装依赖库 为了使OpenPose和Darknet能够顺利运行,需先安装必要的依赖项。对于Linux环境而言,可以利用包管理器完成此操作。 ```bash sudo apt-y build-essential cmake git wget unzip libopencv-dev python3-pip ``` 上述命令会更新软件源并安装编译工具链以及OpenCV开发库等必要组件[^1]。 #### 下载并构建Darknet 获取Darknet项目文件后按照官方说明进行编译: ```bash git clone https://github.com/AlexeyAB/darknet.git ~/darknet cd ~/darknet make ``` 这一步骤将克隆仓库至本地目录`~/darknet`下,并执行Makefile来编译程序[^2]。 #### 获取预训练模型权重 访问AlexeyAB/Darknet GitHub页面下载YOLOv4或其他版本对应的预训练参数文件(`.weights`),将其放置于`/darknet/cfg/`路径内以便后续调用。 #### 编译带有CUDA支持的OpenPose 前往CMU-Perceptual-Computing-Lab/openpose存储库拉取最新版代码,在根目录创建新的CMakeLists.txt文件之前确认已正确设置GPU选项;接着通过如下指令启动编译过程: ```bash git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git ~/openpose cd ~/openpose mkdir build && cd build cmake .. make -j$(nproc) ``` 此处假设读者已经预先完成了NVIDIA驱动及相关深度学习框架(如TensorFlow)的部署工作。 #### 配置环境变量 为了让系统识别到新安装的应用程序及其关联资源,建议编辑用户的shell profile脚本加入以下两行定义语句: ```bash export PATH=$PATH:~/darknet/:~/openpose/build/examples/tutorial_api_cpp/ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH source ~/.bashrc # 或者 .zshrc 如果您正在使用Z shell ``` 以上更改使得可以在任何地方直接输入命令名即可调用对应功能模块而无需指定完整路径。 #### 实现二者集成的方法之一——借助Python API接口 考虑到两种算法均提供了较为完善的编程语言绑定形式,因此可以通过编写一段简单的Python脚本来串联起目标检测同姿态估计的任务流程。下面给出一个基本示例供参考: ```python import cv2 as cv from darknet import performDetect, load_network_custom from openpose import pyopenpose as op def init_darknet(): netMain, metaMain = None, None configPath = "./cfg/yolov4.cfg" weightPath = "./yolo.weights" metaPath = "./data/coco.data" if not os.path.exists(configPath): raise ValueError("Invalid path {}".format(configPath)) global netMain, metaMain netMain, custom_image_bgr = load_network_custom(configPath=configPath, metaPath=metaPath, weightPath=weightPath) if __name__ == '__main__': try: init_darknet() params = dict(model_folder="./models/", number_people_max=-1) poseEstimator = op.WrapperPython() while True: ret, frame_read = cap.read() # 假设存在视频捕获对象cap detections = performDetect(image_path="temp.jpg", thresh=.25)[0] humans = [] for detection in detections: box = detection['bounding_box'] cropped_img = frame_read[int(box[1]):int(box[3]), int(box[0]):int(box[2])] datum = op.Datum() datum.cvInputData = cropped_img poseEstimator.emplaceAndPop([datum]) human_pose_keypoints = datum.poseKeypoints.tolist()[0] humans.append(human_pose_keypoints) draw_humans(frame_read, humans) # 自定义函数用于可视化结果 except Exception as e: print(e) finally: pass ``` 该片段展示了如何初始化Darknet网络结构加载权值数据集,随后实例化了一个基于默认参数设定好的OpenPose处理器对象。循环体内实现了连续帧读入处理逻辑:每当获得一帧图像时即刻运用YOLO V4定位其中的人物轮廓区域范围,再截取出相应子交给后者分析人体关节位置信息最终叠加显示出来形成完整的视觉效果。
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十四桥下一句

您的鼓励是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值