カメラに写っている人物の服装の特徴量を取得しようとしている。
PoseNetというモデルを使って人物の骨格をカメラから推定、人物の胴体部分と、腕の色情報をとる方法を残しておく。
腕の部分のポジション取得方法
腕は手首と肩の関節から、直線を算出、直線が通過するポイントをリストに保存するようにしている。
def get_line_point(point1, point2):
x1, y1 = point1.astype(np.int)
x2, y2 = point2.astype(np.int)
points = []
## x1 > x2だった時 point1 と point2を入れ替える処理 記述省略
## x1 = x2 だった時(傾きが発散する時) 縦の直線のポイントを返す 記述省略
gradient = ( y2 - y1) / (x1 - x2)
for x in range(x1 ,x2):
y = round(gradient*(x1-x2)+y1)
pints.append([x,y])
return points
これで腕の部分は範囲を指定できるようになる。
胴体部分のポジション取得方法
胴体部分は、両方、両腰の座標から、矩形の中の範囲を全部取得する。
このアルゴリズムが面白かったので残しておこうと思った!
画像の上から、横に直線を引く
直線を矩形に向けて下ろしていく
矩形の辺と直線が偶数回当たるときはその間矩形内部にいる。
コードはこちら
def get_body_points(rect,width,height):
a = rect[0]
b = rect[1]
c = rect[2]
d = rect[3]
rect_points = []
rect_points.extend(get_line_pints[a,b])
##4点全てラインを取得する 記述省略
for y in range(width):
count = 0
area_x = []
for rect_point in rect_points:
if y == rect_point[1]:
coun += 1
area_x.append(rect_point[1])
if count == 2:
x_1 = area_x[0]
x_2 = area_x[1]
## x_1 > x_2 の時それぞれを入れ替える処理 記述省略
for x in range(x_1, x_2):
rect_points.append([x,y])
return rect_points
無事、胴体部分の座標取得に成功。