-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtwiceDetect.py
120 lines (100 loc) · 4.26 KB
/
twiceDetect.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import os
import sys
from sys import platform
import cv2
import numpy as np
# import pyopenpose:
# platform这句也可以不写,因为自己的电脑已经确定是windows系统的了
# 获取当前该文件所在文件夹的绝对路径
file_path = os.path.dirname(os.path.realpath(__file__))
if platform == 'win32':
# 我已经将openpose相关的库和环境都放在该文件目录下的Release和bin/x64中了,接下来获取它们的路径:
lib_dir = 'Release'
bin_dir = 'bin'
x64_dir = 'x64'
lib_path = os.path.join(file_path, lib_dir)
bin_path = os.path.join(file_path, bin_dir)
x64_path = os.path.join(file_path,
x64_dir) # 注意这里需要加入环境变量的是x64文件下的Release文件夹
# 测试区
# print(file_path)
# print(lib_path)
# print(bin_path)
# print(x64_path)
# 将以上的路径添加到环境变量中:
sys.path.append(lib_path) # 系统变量
# 环境变量:
os.environ[
'PATH'] += ';' + bin_path + ';' + x64_path + '\Release;'
# print(os.environ['PATH'])
try:
# 导入pyopenpose:
import pyopenpose as op
except ImportError as e:
print("fail to import pyopenpose!")
raise e
else:
print(f"当前电脑环境:\n{platform}\n")
sys.exit(-1)
# 模型导入
params = dict()
# 这里的models用的是我们当前工程下的models文件夹
params['model_folder'] = file_path + r'\models' # 模型地址
# params[
# "net_resolution"] = '1280x720' # 分辨率,需要是16的倍数,降低这个参数可以以准确率为代价显著提升处理速度。
params[
"net_resolution"] = '320x240'
params["number_people_max"] = 1
params["body"] = 1 # 0禁用身体检测,1启用
params["disable_blending"] = False # 如果为True,只显示骨骼关键点,背景为黑
params[
"model_pose"] = "BODY_25" # 参数设置"BODY_25“表示使用25点的检测模式,CUDA
# 版本中最快最准的模式。此外设置"COCO"使用18
# 点的检测模式,设置"MPI"使用15点的检测模式,最不精确,但在CPU上最快。设置"MPI_4_layers"使用15点的检测模式,甚至比上一种更快,但不够准确。
params[
"keypoint_scale"] = 0 # 最终姿态数据数组(x,y)坐标的缩放,即(x,y)的缩放。"将以' write_json '和'
# write_keypoint '标记保存的坐标。"选择“0”将其缩放到原始源分辨率;' 1 '将其缩放到净输出" "大小(用'
# net_resolution '设置);' 2 '将其缩放到最终的输出大小(设置为" " '分辨率');' 3 '将其缩放到[0,1]的范围内,其中(
# 0,0)将是图像左上角的“”角,(1,1)是右下角的“”角;4表示范围[-1,1],其中" "(-1,-1)是图像的左上角,(1,
# 1)是右下角。与“scale_number”和“scale_gap”相关的非。
def detect(imgPath, isShow=False):
# 启动pyopenpose:
opWrapper = op.WrapperPython()
opWrapper.configure(params)
opWrapper.start()
# 传入一张图片
datum = op.Datum()
imageToProcess = cv2.imread(imgPath, cv2.IMREAD_ANYCOLOR)
datum.cvInputData = imageToProcess
opWrapper.emplaceAndPop(op.VectorDatum([datum]))
pose = datum.poseKeypoints
# print(hand)
if isShow:
try:
# print(type(pose))
# print(datum.cvOutputData)
# print("Body keypoints: \n" + str(pose))
print(pose.shape)
for jg in pose:
print('pose[4]:' + str(jg[4]))
print("pose[3]:" + str(jg[3]))
print('pose[6]:' + str(jg[6]))
print('pose[7]:' + str(jg[7]))
print()
# print(pose[0][4][0])
except AttributeError:
print("没有检测出人体")
with open('pose.csv', 'w') as file:
for b1 in pose:
np.savetxt(file, b1, delimiter=",")
# b,g,r = cv2.split(datum.cvOutputData)#分别提取B、G、R通道
# img= cv2.merge([r,g,b]) #重新组合为R、G、B
# plt.imshow(img)
# plt.axis('off')
# plt.show()
cv2.namedWindow('opStudy', 0)
cv2.resizeWindow("opStudy", 600, 600)
cv2.moveWindow("opStudy", 100, 100)
cv2.imshow("opStudy", datum.cvOutputData)
cv2.waitKey(0)
return pose, datum.cvOutputData