![](/img/trans.png)
[英]How to convert 2D bounding box pixel coordinates (x, y, w, h) into relative coordinates (Yolo format)?
[英]Finding the coordinates of tiles that are covered by a rectangle with x,y,w,h pixel coordinates
假設我有一個使用16x16像素的基於圖塊的系統。 您如何找出由浮點像素單位定義的矩形覆蓋的圖塊?
例如
rect(x=16.0,y=16.0, w=1.0, h=1.0) -> tile(x=1, y=1, w=1, h=1)
rect(x=16.0,y=16.0, w=16.0, h=16.0) -> tile(x=1, y=1, w=1, h=1) (still within same tile)
rect(x=24.0,y=24.0, w=8.0, y=8.0) -> (x=1,y=1,w=1,h=1) (still within same tile)
rect(x=24.0,y=24.0, w=8.1, y=8.1) -> (x=1,y=1,w=2,h=2)
我可靠地做到這一點的唯一方法是使用循環。 有沒有更好的辦法? 除以16會給我關於邊緣情況的錯誤答案。 這是我在python中使用的一些示例代碼:
#!/usr/bin/env python
import math
TILE_W = 16
TILE_H = 16
def get_tile(x,y,w,h):
t_x = int(x / TILE_W)
t_x2 = t_x
while t_x2*TILE_W < (x+w):
t_x2 += 1
t_w = t_x2-t_x
t_y = int( y / TILE_H)
t_y2 = t_y
while t_y2*TILE_H < (y+h):
t_y2 += 1
t_h = t_y2-t_y
return t_x,t_y,t_w,t_h
(x,y) = 16.0,16.0
(w,h) = 1.0, 1.0
assert get_tile(x,y,w,h) == (1,1,1,1)
(x,y) = 16.0,16.0
(w,h) = 15.0, 15.0
assert get_tile(x,y,w,h) == (1,1,1,1)
(x,y) = 16.0,16.0
(w,h) = 16.0, 16.0
assert get_tile(x,y,w,h) == (1,1,1,1)
(x,y) = 16.0,16.0
(w,h) = 16.1, 16.1
assert get_tile(x,y,w,h) == (1,1,2,2)
(x,y) = 24.0, 24.0
(w,h) = 1.0, 1.0
assert get_tile(x,y,w,h) == (1,1,1,1)
(x,y) = 24.0, 24.0
(w,h) = 8.0, 8.0
assert get_tile(x,y,w,h) == (1,1,1,1)
(x,y) = 24.0, 24.0
(w,h) = 8.1, 8.1
assert get_tile(x,y,w,h) == (1,1,2,2)
(x,y) = 24.0, 24.0
(w,h) = 9.0, 9.0
assert get_tile(x,y,w,h) == (1,1,2,2)
Matt的錯誤修復解決方案:
from __future__ import division
import math
TILE_W = TILE_H = 16
def get_tile(x,y,w,h):
x1 = int(math.floor(x/TILE_W))
x2 = int(math.ceil((x + w)/TILE_W))
y1 = int(math.floor(y/TILE_H))
y2 = int(math.ceil((y + h)/TILE_H))
return x1, y1, x2-x1, y2-y1
這是通過您的測試用例的,告訴我是否有邊緣情況
TILE_W = TILE_H = 16
from math import floor, ceil
def get_tile2(x,y,w,h):
x1 = int(x/TILE_W)
y1 = int(y/TILE_H)
x2 = int((x+w)/TILE_W)
y2 = int((y+h)/TILE_H)
if (x+w)%16 == 0: #edge case
x2-=1
if (y+h)%16 == 0: #edge case
y2-=1
tw = x2-x1 + 1
th = y2-y1 + 1
return x1, y1, tw, th
(x,y) = 16.0, 16.0
(w,h) = 1.0, 1.0
assert get_tile2(x,y,w,h) == (1,1,1,1)
(x,y) = 16.0, 16.0
(w,h) = 15.0, 15.0
assert get_tile2(x,y,w,h) == (1,1,1,1)
(x,y) = 16.0, 16.0
(w,h) = 16.0, 16.0
assert get_tile2(x,y,w,h) == (1,1,1,1)
(x,y) = 16.0, 16.0
(w,h) = 16.1, 16.1
assert get_tile2(x,y,w,h) == (1,1,2,2)
我現在正在明確檢查邊緣情況,但是請注意,有時浮點比較似乎並不明顯,並且結果可能不符合預期。
您可以先將像素坐標ot整數對齊,然后再除以圖塊寬度:
xlower = int(floor(x))
xupper = int(ceil(x + w))
這可能會更濃縮一些,但是在這里。
def get_tile(x,y,w,h):
x1 = int(x / TILE_W)
x2 = (x + w) / TILE_W
y1 = int(y / TILE_H)
y2 = (x + w) / TILE_H
if int(x2) == x2:
x2 = int(x2 - 1)
else:
x2 = int(x2)
if int(y2) == y2:
y2 = int(y2 - 1)
else:
y2 = int(y2)
tw = x2 - x1 + 1
th = y2 - y1 + 1
return x1, y1, tw, th
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.