openpose之使用摄像头检测并输出到json文件

2024-01-19 14:36

本文主要是介绍openpose之使用摄像头检测并输出到json文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编程如画,我是panda!


前言

之前给大家分享了如何搭建openpose环境,并进行了测试案例,但是如果要使用摄像头的话,还需要修改一下运行文件,并且这次会教大家如何输出到json文件 。

如果环境还没有搭建好,请参见我的博客:openpose环境搭建

一、了解输出格式

输出:

如果你使用一张图片进行测试,会得到一个n*25*3的矩阵, n代表检测到了几个人,25代表25个节点,3代表了(x坐标,y坐标,置信度)。

25个节点分别为:

// const std::map<unsigned int, std::string> POSE_BODY_25_BODY_PARTS {
//     {0,  "Nose"},
//     {1,  "Neck"},
//     {2,  "RShoulder"},
//     {3,  "RElbow"},
//     {4,  "RWrist"},
//     {5,  "LShoulder"},
//     {6,  "LElbow"},
//     {7,  "LWrist"},
//     {8,  "MidHip"},
//     {9,  "RHip"},
//     {10, "RKnee"},
//     {11, "RAnkle"},
//     {12, "LHip"},
//     {13, "LKnee"},
//     {14, "LAnkle"},
//     {15, "REye"},
//     {16, "LEye"},
//     {17, "REar"},
//     {18, "LEar"},
//     {19, "LBigToe"},
//     {20, "LSmallToe"},
//     {21, "LHeel"},
//     {22, "RBigToe"},
//     {23, "RSmallToe"},
//     {24, "RHeel"},
//     {25, "Background"}
// };

二、使用摄像头

openpose中有很多参数,可以使用参数来控制是否使用摄像头:

import os
import sys
import cv2
from sys import platform
import argparse
import numpy as npdir_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append(dir_path)
os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/bin;'
import pyopenpose as opprint(op)
print("成功引入pyopenpose")parser = argparse.ArgumentParser()
parser.add_argument("--camera", default=0, help="Camera index for capturing video. Default is 0.")
args = parser.parse_known_args()# Custom Params
params = dict()
params["model_folder"] = "models/"
params["net_resolution"] = "368x256"# Starting OpenPose
opWrapper = op.WrapperPython()
opWrapper.configure(params)
opWrapper.start()# Start capturing from the camera
cap = cv2.VideoCapture(int(args[0].camera))while True:# Read a frame from the cameraret, frame = cap.read()if not ret:break# Process the framedatum = op.Datum()datum.cvInputData = frameopWrapper.emplaceAndPop(op.VectorDatum([datum]))# Display the resultprint("Body keypoints: \n" + str(datum.poseKeypoints))cv2.imshow("OpenPose 1.7.0 - Tutorial Python API", datum.cvOutputData)# Break the loop when 'q' is pressedif cv2.waitKey(1) & 0xFF == ord('q'):break# Release resources
cap.release()
cv2.destroyAllWindows()
opWrapper.stop()

如果你想输出到json文件,可以设置参数:

params["write_json"] = "json_output/"  # 指定保存 JSON 文件的目录

完整代码如下:

import os
import sys
import cv2
from sys import platform
import argparse
import json  # 添加 json 模块dir_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append(dir_path)
os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/bin;'
import pyopenpose as opprint(op)
print("成功引入pyopenpose")parser = argparse.ArgumentParser()
parser.add_argument("--camera", default=0, help="Camera index for capturing video. Default is 0.")
args = parser.parse_known_args()# Custom Params
params = dict()
params["model_folder"] = "models/"
params["net_resolution"] = "368x256"
params["write_json"] = "json_output/"  # 指定保存 JSON 文件的目录# Starting OpenPose
opWrapper = op.WrapperPython()
opWrapper.configure(params)
opWrapper.start()# Start capturing from the camera
cap = cv2.VideoCapture(int(args[0].camera))while True:# Read a frame from the cameraret, frame = cap.read()if not ret:break# Process the framedatum = op.Datum()datum.cvInputData = frameopWrapper.emplaceAndPop(op.VectorDatum([datum]))# Display the resultprint("Body keypoints: \n" + str(datum.poseKeypoints))# Check if JSON file exists and read keypoints from JSONjson_path = os.path.join(params["write_json"], f"{str(args[0].camera)}.json")if os.path.exists(json_path):with open(json_path, 'r') as json_file:json_data = json.load(json_file)keypoints = json_data["people"][0]["pose_keypoints_2d"]print("Body keypoints from JSON: \n", keypoints)cv2.imshow("OpenPose 1.7.0 - Tutorial Python API", datum.cvOutputData)# Break the loop when 'q' is pressedif cv2.waitKey(1) & 0xFF == ord('q'):break# Release resources
cap.release()
cv2.destroyAllWindows()
opWrapper.stop()

结果:(要把摄像头打开哈,我就不打开了(●'◡'●))

然后会得到json文件夹:

 

这篇关于openpose之使用摄像头检测并输出到json文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622730

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

c# checked和unchecked关键字的使用

《c#checked和unchecked关键字的使用》C#中的checked关键字用于启用整数运算的溢出检查,可以捕获并抛出System.OverflowException异常,而unchecked... 目录在 C# 中,checked 关键字用于启用整数运算的溢出检查。默认情况下,C# 的整数运算不会自

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W