如下圖, 我有train檔案和其ROI的標註圖像。
好现在我有了ROI版本的label对吧?
那我接下来会有两个动作:
1.用openCV划出框住白色圈圈的bounding box, 并回传其坐标。
**2.将那些坐标变成“yolo 标注格式”, 并且每一张ROI's bounding box label对应一个txt文件输出到另一个空文件夹。 **
请给我一个 function code去执行这两个步骤, 感谢。
如下圖, 我有train檔案和其ROI的標註圖像。
好现在我有了ROI版本的label对吧?
那我接下来会有两个动作:
1.用openCV划出框住白色圈圈的bounding box, 并回传其坐标。
**2.将那些坐标变成“yolo 标注格式”, 并且每一张ROI's bounding box label对应一个txt文件输出到另一个空文件夹。 **
请给我一个 function code去执行这两个步骤, 感谢。
下面是一个Python函数的示例代码,可以实现你所需的两个步骤:
import cv2
import os
def process_images(input_folder, output_folder):
# 读取训练图像和其ROI的标注图像
train_img = cv2.imread(os.path.join(input_folder, "train.png"))
roi_img = cv2.imread(os.path.join(input_folder, "roi.png"), cv2.IMREAD_GRAYSCALE)
# 使用OpenCV找到ROI的轮廓,并划出包围它们的矩形框
contours, _ = cv2.findContours(roi_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
bounding_boxes = []
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
bounding_boxes.append((x, y, w, h))
cv2.rectangle(train_img, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 将bounding boxes的坐标转换成YOLO格式,并保存到txt文件中
img_h, img_w, _ = train_img.shape
for i, bbox in enumerate(bounding_boxes):
x, y, w, h = bbox
x_center = (x + w / 2) / img_w
y_center = (y + h / 2) / img_h
width = w / img_w
height = h / img_h
with open(os.path.join(output_folder, f"label_{i}.txt"), "w") as f:
f.write(f"0 {x_center} {y_center} {width} {height}")
# 保存带有bounding boxes的训练图像
cv2.imwrite(os.path.join(output_folder, "train_bbox.png"), train_img)
函数的输入是包含训练图像和ROI标注图像的文件夹路径,和用于保存输出文件的文件夹路径。输出是一个包含YOLO格式标注文件和带有bounding boxes的训练图像的文件夹。
请注意,此示例代码假定只有一个对象需要标注。如果有多个对象,则需要对每个对象重复执行这个过程,并使用不同的标签(例如0, 1, 2等)来标识它们。