import os import json import xml.etree.ElementTree as ET from PIL import Image import cv2

def read_coordinates(filepath, file_type): ''' 根据文件类型读取坐标信息 ''' if file_type == 'json': with open(filepath, 'r') as f: data = json.load(f) if 'coordinates' in data: return data['coordinates'] elif file_type == 'xml': root = ET.parse(filepath).getroot() coord_list = [] for obj in root.iter('object'): coords = obj.find('bndbox') coord_list.append([ int(coords.find('xmin').text), int(coords.find('ymin').text), int(coords.find('xmax').text), int(coords.find('ymax').text) ]) return coord_list elif file_type == 'txt': with open(filepath, 'r') as f: coords = f.readline().strip() coords = [int(coord) for coord in coords.split(',')] return coords else: raise ValueError('Unknown file type') return None

def capture_image(image_path, coords, var, save_path, method='cv2'): ''' 实现根据坐标截取图像 ''' if method == 'cv2': img = cv2.imread(image_path) xmin, ymin, xmax, ymax = coords xmin = max(0, xmin - var) ymin = max(0, ymin - var) xmax = min(img.shape[1], xmax + var) ymax = min(img.shape[0], ymax + var) img = img[ymin:ymax, xmin:xmax] cv2.imwrite(save_path, img) elif method == 'PIL': img = Image.open(image_path) xmin, ymin, xmax, ymax = coords xmin = max(0, xmin - var) ymin = max(0, ymin - var) xmax = min(img.width, xmax + var) ymax = min(img.height, ymax + var) xmin = min(xmin, xmax-var) ymin = min(ymin, ymax-var) img = img.crop((xmin, ymin, xmax, ymax)) img.save(save_path)

if name == 'main': image_dir = input('请输入图片文件夹路径:').strip() if not os.path.isdir(image_dir): print('无效的图片文件夹路径') exit(1) coord_dir = input('请输入坐标文件夹路径:').strip() if not os.path.isdir(coord_dir): print('无效的坐标文件夹路径') exit(1) var = int(input('请输入扩展截图范围的变量(默认为10):').strip() or '10') method = input('请选择截图工具(1:opencv,2:PIL,默认为opencv):').strip() method = 'cv2' if method != '2' else 'PIL' save_dir = input('请输入保存截图的文件夹路径:').strip() if not os.path.isdir(save_dir): print('无效的保存文件夹路径') exit(1)

for filename in os.listdir(image_dir):
    if filename.endswith(('jpg', 'jpeg', 'png', 'JPG', 'JPEG', 'PNG')):
        basename = os.path.splitext(filename)[0]
        coord_path = os.path.join(coord_dir, basename + '.xml')
        if not os.path.isfile(coord_path):
            coord_path = os.path.join(coord_dir, basename + '.json')
        if not os.path.isfile(coord_path):
            coord_path = os.path.join(coord_dir, basename + '.txt')
        if not os.path.isfile(coord_path):
            continue

        coords = read_coordinates(coord_path, os.path.splitext(coord_path)[-1][1:])
        if coords is None:
            continue

        img_path = os.path.join(image_dir, filename)
        img = Image.open(img_path)  # 在这里读取图片

        for i, coord in enumerate(coords):
            xmin = max(0, coord[0] - var)
            ymin = max(0, coord[1] - var)
            xmax = min(img.width, coord[2] + var)
            ymax = min(img.height, coord[3] + var)
            xmin = min(xmin, xmax-var)
            ymin = min(ymin, ymax-var)
            save_path = os.path.join(save_dir, '{}_{}_{}_{}_{}_{}.{}'.format(basename, xmin-coord[0], ymin-coord[1], xmax-coord[2], ymax-coord[3], i, filename.split('.')[-1]))
            capture_image(img_path, [xmin, ymin, xmax, ymax], var, save_path, method)
            print('保存截图:', save_path

原文地址: https://www.cveoy.top/t/topic/nnj2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录