labelImgで出力される座標の正体は何ですか?
Q&A
Closed
labelimgで出力される座標の正体は何ですか?
環境
Windows11
Python
labelImgで出力形式をYOLOにしてラベリングすると座標記載のテキストファイルが出力されます
(以下がその中身で余分なものは省いています)
※ 座標はそれぞれ、左上x座標 左上y座標 x方向のサイズ y方向のサイズ
この時、知りたいことは以下2点です。
1. この座標が何なのか
2. 整数座標?に変換するにはどうしたらよいか?
そもそもやりたいことは座標をもとに,画像切り出しになります
変換なんかしなくても切り出せる方法があればそちらを教えていただきたいです。
調べている中で、
UV座標というワードが以下のサイトで出てきました
https://qiita.com/forfeit/items/460b155ed7c2b4953e21
とりあえず公式に当てはめて処理させるも思わしくない結果が出て、また別物なのかなと思いました。
実際にあてはめたコードは以下です
# 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
もしプログラムが間違っているだけであればご指摘下さい...。