欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 姿态估计(一)——过程记录与问题记录

姿态估计(一)——过程记录与问题记录

2024/10/24 1:59:19 来源:https://blog.csdn.net/qq_58739767/article/details/143000369  浏览:    关键词:姿态估计(一)——过程记录与问题记录

首先是一些源码。在本文中,主要有三个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文件中打开。 运行结果:

865a645edec74f46afd32c8d72d81665.png

使用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

在此链接中,找到2f3a5d97b52f432296f955a51938ca8b.png

下载下来,并解压。将此路径: 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。这是我最开始引入的模块。

 实时检测的运行结果与视频的运行结果就不再展示。最终结果只是图像结果的动态。

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com