Как я могу найти новые координаты граничного блока повернутого изображения, чтобы изменить его XML-файл для увеличения данных Tensorflow? - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь создать больше наборов данных для обучения моей модели в Tensorflow для увеличения объема данных.Я добавил метки граничных рамок к исходному изображению.Я хочу повернуть изображение на 45 градусов и изменить файл XML для нового точного граничного прямоугольника (прямоугольника), чтобы пометить новое созданное изображение.Это изменение размера и выборка окна, чтобы не потерять что-либо на изображении.

Позвольте мне показать вам, как я стараюсь:

def rotateImage(mat, angle):
    height, width = mat.shape[:2]
    image_center = (width / 2, height / 2)

    rotation_mat = cv2.getRotationMatrix2D(image_center, angle, 1)

    radians = math.radians(angle)
    sin = math.sin(radians)
    cos = math.cos(radians)
    bound_w = int((height * abs(sin)) + (width * abs(cos)))
    bound_h = int((height * abs(cos)) + (width * abs(sin)))

    rotation_mat[0, 2] += ((bound_w / 2) - image_center[0])
    rotation_mat[1, 2] += ((bound_h / 2) - image_center[1])

    rotated_mat = cv2.warpAffine(mat, rotation_mat, (bound_w, bound_h))
    return rotated_mat


image = cv2.imread("test.jpg")

angle = 45

rotated_45_image = image.copy()

rotated_45_image = rotateImage(rotated_45_image, angle=45)

tree_for_45_rotated = ET.parse(file_name + ".xml")
root = tree_for_xml.getroot()

for object in root.iter("object"):
    xmin = object.find("bndbox").find("xmin")
    ymin = object.find("bndbox").find("ymin")
    xmax = object.find("bndbox").find("xmax")
    ymax = object.find("bndbox").find("ymax")
    print(xmin.text, ymin.text, xmax.text, ymax.text)
    print("new")
    new_xmin = math.cos(angle) * int(xmin.text) - math.sin(angle) * int(ymin.text)
    new_xmax = math.cos(angle) * int(xmax.text) - math.sin(angle) * int(ymin.text)
    new_ymin = math.sin(angle) * int(xmin.text) + math.cos(angle) * int(ymin.text)
    new_ymax = math.sin(angle) * int(xmin.text) + math.cos(angle) * int(ymax.text)
    print(new_xmin, new_ymin, new_xmax, new_ymax)

После поворота изображение выглядит так: Rotated 45

Кстати,Я использую Python и OpenCV.Я не могу рассчитать новые точные координаты, чтобы пометить изображение.

Спасибо

1 Ответ

0 голосов
/ 01 октября 2018

Я не могу добавить комментарий в пост выше, извините за пост.Все, что вам нужно, это распечатать после поворота значения из углов

img = cv2.imread("test.jpg")
rotated, corners = rotateImage(img, 30)
print(corners)

и, если вы хотите конкретное значение, просто используйте

print(corners[0])
print(corners[1])
print(corners[2])
print(corners[3])
...