编程如画,我是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 np 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 op print(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 camera ret, frame = cap.read() if not ret: break # Process the frame datum = op.Datum() datum.cvInputData = frame opWrapper.emplaceAndPop(op.VectorDatum([datum])) # Display the result print("Body keypoints: \n" + str(datum.poseKeypoints)) cv2.imshow("OpenPose 1.7.0 - Tutorial Python API", datum.cvOutputData) # Break the loop when 'q' is pressed if 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 op print(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 camera ret, frame = cap.read() if not ret: break # Process the frame datum = op.Datum() datum.cvInputData = frame opWrapper.emplaceAndPop(op.VectorDatum([datum])) # Display the result print("Body keypoints: \n" + str(datum.poseKeypoints)) # Check if JSON file exists and read keypoints from JSON json_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 pressed if cv2.waitKey(1) & 0xFF == ord('q'): break # Release resources cap.release() cv2.destroyAllWindows() opWrapper.stop()
复制
结果:(要把摄像头打开哈,我就不打开了(●'◡'●))
然后会得到json文件夹: