写一个图片旋转YOLO标签转换的程序
时间: 2023-12-10 10:02:35 浏览: 111
以下是一个 Python 程序,可以将图片旋转指定角度后,相应地调整 YOLO 标签中的坐标。
```python
import cv2
import math
# 旋转图片并调整 YOLO 标签
def rotate_image_and_labels(img_path, label_path, angle):
# 读取图片
img = cv2.imread(img_path)
# 计算旋转后的图片大小和中心点
height, width = img.shape[:2]
center_x, center_y = width / 2, height / 2
new_width = int(abs(width * math.cos(angle)) + abs(height * math.sin(angle)))
new_height = int(abs(width * math.sin(angle)) + abs(height * math.cos(angle)))
# 旋转图片
M = cv2.getRotationMatrix2D((center_x, center_y), angle, 1.0)
rotated_img = cv2.warpAffine(img, M, (new_width, new_height))
# 保存旋转后的图片
cv2.imwrite('rotated.jpg', rotated_img)
# 读取标签文件并调整坐标
with open(label_path, 'r') as f:
labels = f.readlines()
new_labels = []
for label in labels:
label = label.strip().split(' ')
x, y, w, h = float(label[1]), float(label[2]), float(label[3]), float(label[4])
# 计算坐标变换后的新坐标
new_x = (x - center_x) * math.cos(angle) + (y - center_y) * math.sin(angle) + new_width / 2
new_y = -(x - center_x) * math.sin(angle) + (y - center_y) * math.cos(angle) + new_height / 2
new_w = w * math.cos(angle) + h * math.sin(angle)
new_h = h * math.cos(angle) + w * math.sin(angle)
# 将新坐标保存到新标签列表中
new_label = label[0] + ' ' + str(new_x) + ' ' + str(new_y) + ' ' + str(new_w) + ' ' + str(new_h) + '\n'
new_labels.append(new_label)
# 保存新标签文件
with open('rotated.txt', 'w') as f:
f.writelines(new_labels)
```
该程序接受三个参数:原始图片路径、YOLO 标签文件路径和旋转角度。程序会先将图片旋转指定角度,然后读取标签文件中的坐标,并根据图片旋转后的变换公式计算出新的坐标,最后保存旋转后的图片和新的标签文件。
阅读全文