poko_amu
@poko_amu (poko amu)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

labelImgで出力される座標の正体は何ですか?

labelimgで出力される座標の正体は何ですか?

環境

Windows11
Python


labelImgで出力形式をYOLOにしてラベリングすると座標記載のテキストファイルが出力されます
(以下がその中身で余分なものは省いています)
image.png
※ 座標はそれぞれ、左上x座標 左上y座標 x方向のサイズ y方向のサイズ

この時、知りたいことは以下2点です。

1. この座標が何なのか
2. 整数座標?に変換するにはどうしたらよいか?

そもそもやりたいことは座標をもとに,画像切り出しになります

変換なんかしなくても切り出せる方法があればそちらを教えていただきたいです。


調べている中で、
UV座標というワードが以下のサイトで出てきました
https://qiita.com/forfeit/items/460b155ed7c2b4953e21

image.png
image.png
とりあえず公式に当てはめて処理させるも思わしくない結果が出て、また別物なのかなと思いました。

実際にあてはめたコードは以下です

# UV座標から整数座標に変換
# points→[変換前のx座標,変換前のy座標]
# wigth→画像の横幅(4016)
# height→画像の縦幅(6016)
def Convert_point(points, wigth, height):
    uv_x = float(points[0]) # UVのx座標側
    uv_y = float(points[1]) # UVのy座標側

    # 公式に当てはめて変換
    x = uv_x*wigth - 0.5
    y = (1-uv_y)*height - 0.5
    return round(x), round(y)

# 画像取得
imgpaths = glob(f"{ImgPath}/*.JPG")
for path in imgpaths:
    # 保存用のパスを作る
    filename = os.path.splitext(os.path.basename(path))[0]

    # 画像の読み出し
    img = cv2.imread(path)
    width, height, _ = img.shape

    # 座標情報取得
    pointfilepath = f"{LabelPath}/{filename}.txt"
    with open(pointfilepath)as file:
        datas = file.readlines()
        cut_num = 0
        for data in datas:
            x_point, y_point, x_size, y_size = data.split()[1:]
            # 座標を切り出し用に変換
            left_point, upper_point = Convert_point([x_point,y_point],width,height)
            convert_x_size, convert_y_size = Convert_point([x_size,y_size],width,height)
            right_point = left_point + convert_x_size
            bottom_point = upper_point + convert_y_size

            # カット
            # 左上y:右下y, 左上x:右下x
            # [Xはこの範囲で切り抜く:Yはこの範囲] 的な考え方
            cutimg = img[left_point:right_point, upper_point:bottom_point]

            # 画像保存
            cv2.imwrite(f"{OutputBasePath}/{filename}_{str(cut_num)}.png",cutimg)
            cut_num+=1

もしプログラムが間違っているだけであればご指摘下さい...。

0

1Answer

↑このサイトの情報によると、

認識する物体の矩形領域の座標(x,y)、およびサイズ(w,h)は、画像全体との比で表現し、値は0以上1以下の範囲となります。

画像全体のサイズをwidth x heightピクセルとしたとき、
xとwはwidthを掛けて、yとhはheightを掛けて、小数以下を処理(切り捨て、四捨五入など)すれば、整数座標が得られると思います。

引用されていた、uv座標とはまったく関係無いと思われます。

0Like

Comments

  1. @poko_amu

    Questioner

    回答頂きありがとうございます!
    確かに教えて頂いた通りな気がしてきました

    実際に画像サイズを掛けてみたところやりたいことができました!
    大変助かりました、ありがとうございます。

    矩形領域の中心点を表しているという部分をすっ飛ばして読んだせいで無駄に
    時間が掛かってしまい、結果方向が遅れました。

    ちゃんと読まないとですね。。

    ありがとうございました

Your answer might help someone💌