Help us understand the problem. What is going on with this article?

# OpenPoseでの関節の座標

OpenPoseでの関節の座標はどこで取得するのだろうと試行錯誤していたらようやく見つけました。

# 関節の座標取得

tf_pose/estimator.pyに以下のような記述があります。

estimator.py
```    @staticmethod
def draw_humans(npimg, humans, imgcopy=False):
if imgcopy:
npimg = np.copy(npimg)
image_h, image_w = npimg.shape[:2]
centers = {}
for human in humans:
# draw point
for i in range(common.CocoPart.Background.value):
if i not in human.body_parts.keys():
continue

body_part = human.body_parts[i]
center = (int(body_part.x * image_w + 0.5), int(body_part.y * image_h + 0.5))
centers[i] = center
cv2.circle(npimg, center, 3, common.CocoColors[i], thickness=3, lineType=8, shift=0)

# draw line
for pair_order, pair in enumerate(common.CocoPairsRender):
if pair[0] not in human.body_parts.keys() or pair[1] not in human.body_parts.keys():
continue

# npimg = cv2.line(npimg, centers[pair[0]], centers[pair[1]], common.CocoColors[pair_order], 3)
cv2.line(npimg, centers[pair[0]], centers[pair[1]], common.CocoColors[pair_order], 3)

return npimg
```

`#draw point` `#draw line` とあるようにここで体の骨格を描いています。
ここに、

estimator.py
```    @staticmethod
def draw_humans(npimg, humans, imgcopy=False):
if imgcopy:
npimg = np.copy(npimg)
image_h, image_w = npimg.shape[:2]
centers = {}
for human in humans:
# draw point
for i in range(common.CocoPart.Background.value):
if i not in human.body_parts.keys():
continue

body_part = human.body_parts[i]
center = (int(body_part.x * image_w + 0.5), int(body_part.y * image_h + 0.5))
centers[i] = center
print(center)        #追加
cv2.circle(npimg, center, 3, common.CocoColors[i], thickness=3, lineType=8, shift=0)

# draw line
for pair_order, pair in enumerate(common.CocoPairsRender):
if pair[0] not in human.body_parts.keys() or pair[1] not in human.body_parts.keys():
continue

# npimg = cv2.line(npimg, centers[pair[0]], centers[pair[1]], common.CocoColors[pair_order], 3)
cv2.line(npimg, centers[pair[0]], centers[pair[1]], common.CocoColors[pair_order], 3)

return npimg
```

と追加すると、体の関節位置の座標を取得することができます。

```{0: (1378, 176), 1: (1351, 352), 2: (1218, 307), 3: (1111, 470), 4: (1280, 385), 5: (1476, 398), 6: (1529, 554), 7: (1449, 443), 8: (1209, 743), 9: (1173, 1011), 11: (1387, 750), 12: (1324, 1057), 14: (1351, 150), 15: (1413, 163), 16: (1289, 170), 17: (1422, 333)}
```

０〜17までの数字はどの関節の座標であるかを指しています。調べたところ、
０：鼻、１：心臓、２：右肩、3：右肘、４：右手首、５：左肩、６：左肘、７：左手首、８：右腰、９：右膝、10：右足首、11：左腰、12：左膝、13：左足首、14：右目、15：左目、16：右耳、17：左耳
となっています。

また、x座標y座標をそれぞれ別に扱うことも可能です。

estimator.py
```    @staticmethod
def draw_humans(npimg, humans, imgcopy=False):
if imgcopy:
npimg = np.copy(npimg)
image_h, image_w = npimg.shape[:2]
x = {}     #追加
y = {}     #追加
centers = {}
for human in humans:
# draw point
for i in range(common.CocoPart.Background.value):
if i not in human.body_parts.keys():
continue

body_part = human.body_parts[i]
center = (int(body_part.x * image_w + 0.5), int(body_part.y * image_h + 0.5))
x[i] = int(body_part.x * image_w + 0.5)     #追加
y[i] = int(body_part.y * image_h + 0.5)     #追加
centers[i] = center
cv2.circle(npimg, center, 3, common.CocoColors[i], thickness=3, lineType=8, shift=0)

print(x[6])   #追加

# draw line
for pair_order, pair in enumerate(common.CocoPairsRender):
if pair[0] not in human.body_parts.keys() or pair[1] not in human.body_parts.keys():
continue

# npimg = cv2.line(npimg, centers[pair[0]], centers[pair[1]], common.CocoColors[pair_order], 3)
cv2.line(npimg, centers[pair[0]], centers[pair[1]], common.CocoColors[pair_order], 3)

return npimg
```

print文はfor文の中に入れないように注意してください。

Why do not you register as a user and use Qiita more conveniently?
1. We will deliver articles that match you
By following users and tags, you can catch up information on technical fields that you are interested in as a whole
2. you can read useful information later efficiently
By "stocking" the articles you like, you can search right away