任意の矩形から、矩形内に点がいるかどうかの判定

カメラに写っている人物の服装の特徴量を取得しようとしている。
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

無事、胴体部分の座標取得に成功。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

%d人のブロガーが「いいね」をつけました。