首先是一些源码。在本文中,主要有三个python模块,包括了摄像头采集图像,对图像实时处理,提取姿态。第二个是,静态一帧图像的姿态估计,第三个是输入视频,提取姿态。
代码部分:
图像提取姿态:
import cv2
import matplotlib.pyplot as plt
import copy
import numpy as npfrom src import model
from src import util
from src.body import Body
from src.hand import Hand
# 初始化模型,
body_estimation = Body('model/body_pose_model.pth')
hand_estimation = Hand('model/hand_pose_model.pth')#从指定路径读取一张测试图像,并存储在oriImg变量中。图像以 B(蓝色)、G(绿色)、R(红色)的顺序存储。
test_image = 'images/demo.jpg'
oriImg = cv2.imread(test_image) # B,G,R order
#使用body_estimation模型对输入图像进行人体姿态估计,
# 得到候选关键点candidate和连接信息subset。然后创建一个原始图像的副本canvas,
# 并使用util.draw_bodypose函数在canvas上绘制人体姿态。
candidate, subset = body_estimation(oriImg)
canvas = copy.deepcopy(oriImg)
canvas = util.draw_bodypose(canvas, candidate, subset)
# detect hand
# 使用util.handDetect函数根据人体姿态估计的结果检测手部区域,
# 得到手部区域的列表hands_list,其中每个元素包含手部区域的左上角坐标(x, y)、
# 宽度w以及是否为左手的标志is_left。
hands_list = util.handDetect(candidate, subset, oriImg)
# 创建一个空列表all_hand_peaks用于存储所有手部关键点
all_hand_peaks = []
for x, y, w, is_left in hands_list:# cv2.rectangle(canvas, (x, y), (x+w, y+w), (0, 255, 0), 2, lineType=cv2.LINE_AA)# cv2.putText(canvas, 'left' if is_left else 'right', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)# if is_left:# plt.imshow(oriImg[y:y+w, x:x+w, :][:, :, [2, 1, 0]])# plt.show()# 使用hand_estimation模型对手部区域图像进行手部姿态估计,得到关键点peaks。# 对于关键点的横坐标,如果为 0,则保持为 0,# 否则加上手部区域左上角的横坐标x,对纵坐标进行类似处理,这样将局部坐标转换为全局坐标peaks = hand_estimation(oriImg[y:y+w, x:x+w, :])peaks[:, 0] = np.where(peaks[:, 0]==0, peaks[:, 0], peaks[:, 0]+x)peaks[:, 1] = np.where(peaks[:, 1]==0, peaks[:, 1], peaks[:, 1]+y)# else:# peaks = hand_estimation(cv2.flip(oriImg[y:y+w, x:x+w, :], 1))# peaks[:, 0] = np.where(peaks[:, 0]==0, peaks[:, 0], w-peaks[:, 0]-1+x)# peaks[:, 1] = np.where(peaks[:, 1]==0, peaks[:, 1], peaks[:, 1]+y)# print(peaks)all_hand_peaks.append(peaks)canvas = util.draw_handpose(canvas, all_hand_peaks)plt.imshow(canvas[:, :, [2, 1, 0]])
plt.axis('off')
plt.show()
这个py文件可以直接在pyCharm文件中打开。 运行结果:
使用cmd运行py文件:
# 进入D盘
(base) C:\Users\HONOR>D:
# 激活虚拟环境
(base) D:\>conda activate pytorch-openpose
# 打开py文件所在位置
(pytorch-openpose) D:\>cd D:\pytorch_openpose\pytorch-openpose-master
# 打开所需处理的视频文件
(pytorch-openpose) D:\pytorch_openpose\pytorch-openpose-master>python demo_video.py D:\pytorch_openpose\pytorch-openpose-master\video\cop.mp4
在这个视频代码中,我在执行到第四步的时候,总是报:
hp, ht, pid, tid = _winapi.CreateProcess [WinError 2] 系统找不到指定的文件。
这样的一句代码,我首先,直接在CMD中,使用cd命令,可以找到该视频文件,并成功打开。我又再次在pycharm中运行video文件,但是视频文件是被封装在主函数中的,无法直接将视频路径加入到代码中,运行。一运行就会报:
usage: demo_video.py [-h] [--no_hands] [--no_body] file
demo_video.py: error: the following arguments are required: file
于是查找相关的问题,找到的原因是:没装ffmpeg 或者 ffmpeg没添加到系统环境变量。
Builds - CODEX FFMPEG @ gyan.dev
在此链接中,找到
下载下来,并解压。将此路径: D:\pytorch_openpose\ffmpeg-7.1-essentials_build\bin添加到环境变量中(直接搜环境变量,找到path,编辑,新建(粘贴进去)确定。
再次执行运行py文件。
这里在写一下,我为了解决这个问题还有做的另一办法,但是没有成功:从运行结果中,可以知道这句代码有问题:
device_name = subprocess.check_output([_ADB, "-s", device_id, "shell", "getprop", "ro.product.model"])
其中ADB变量的值为adb,这句话的意思是,在cmd中执行adb -s shell {device_id} getprop ro.product.model并返回执行结果,这里返回的结果是系统找不到指定文件,说abd命令没有加入环境变量,将其加入环境变量。当我加入后,我还在cmd中执行了abd version表示安装成功。但是当我再次执行最开始的四句代码时,却表示我没有安装模块cv2。这是我最开始引入的模块。
实时检测的运行结果与视频的运行结果就不再展示。最终结果只是图像结果的动态。