create_dataset

## create_dataset.py

    import openpyxl
    import cv2
    import numpy as np
    import os
    from PIL import Image, ImageDraw, ImageFont
    import platform
    import subprocess
    from pdf2image import convert_from_path
    import tempfile
    
    def create_ellipse_dataset(excel_path, sheet_name, output_dir, num_images, ellipse_size, area):
        """
        Excelシートのカテゴリーエリア内に楕円を描画し、画像を生成する。
    
        Args:
            excel_path (str): Excelファイルのパス。
            sheet_name (str): シート名。
            output_dir (str): 画像を保存するディレクトリ。
            num_images (int): 生成する画像の枚数。
            ellipse_size (tuple): 楕円のサイズ (長軸, 短軸)。
            area (tuple): 楕円を描画する座標範囲 (x1, y1, x2, y2)。
        """
        os.makedirs(output_dir, exist_ok=True)
        
        # LibreOfficeを使用してPDFに変換
        pdf_path = os.path.splitext(excel_path)[0] + '.pdf'
        try:
            subprocess.run([
                'soffice',
                '--headless',
                '--convert-to', 'pdf:calc_pdf_Export:{' +
                '"SinglePageSheets":{"type":"boolean","value":"true"},' +  # 1ページに収める
                '"Scale":{"type":"long","value":80},' +  # スケールを80%に縮小
                '"ScaleToPages":{"type":"long","value":1},' +  # 1ページに収める
                '"PageRange":{"type":"string","value":"1-1"},' +  # 1ページ目のみ
                '"IsSkipEmptyPages":{"type":"boolean","value":"false"},' +  # 空白ページをスキップしない
                '"HorizontalAlignment":{"type":"long","value":1},' +  # 水平方向の配置（中央）
                '"VerticalAlignment":{"type":"long","value":1},' +  # 垂直方向の配置（中央）
                '"IsAddStream":{"type":"boolean","value":"false"},' +  # ストリームを追加しない
                '"IsReduceImageResolution":{"type":"boolean","value":"false"},' +  # 画像解像度を下げない
                '"MaxImageResolution":{"type":"long","value":300},' +  # 最大解像度
                '"Margin_Top":{"type":"long","value":10},' +  # 上マージン
                '"Margin_Bottom":{"type":"long","value":10},' +  # 下マージン
                '"Margin_Left":{"type":"long","value":30},' +  # 左マージンを増やす
                '"Margin_Right":{"type":"long","value":10}' +  # 右マージン
                '}',
                '--outdir', os.path.dirname(pdf_path),
                excel_path
            ], check=True)
            
            # PDFを高解像度で画像に変換
            # images = convert_from_path(
            #     pdf_path,
            #     dpi=300,
            #     use_cropbox=True,
            #     fmt='PNG'
            # )
            # base_image = images[0]
            
            # # 画像の生成
            # for i in range(num_images):
            #     img = base_image.copy()
            #     draw = ImageDraw.Draw(img)
                
            #     area_x1, area_y1, area_x2, area_y2 = area
            #     center_x = np.random.randint(area_x1, area_x2)
            #     center_y = np.random.randint(area_y1, area_y2)
            #     draw.ellipse((center_x - ellipse_size[0], center_y - ellipse_size[1], 
            #                  center_x + ellipse_size[0], center_y + ellipse_size[1]), 
            #                 outline=(0, 0, 0))
                
            #     output_path = os.path.join(output_dir, f"ellipse_{i}.png")
            #     img.save(output_path)
            #     print(f"画像 {i+1}/{num_images} を保存: {output_path}")
        
        finally:
            # if os.path.exists(pdf_path):
            #     os.remove(pdf_path)
            pass
    
    if __name__ == '__main__':
        excel_path = 'DisasterReport.xlsx'  # Excelファイルのパス
        sheet_name = 'Sheet1'  # シート名
        output_dir = 'test/dataset/test_position'  # 画像を保存するディレクトリ
        num_images = 100  # 生成する画像の枚数
        ellipse_size = (50, 30)  # 楕円のサイズ (長軸, 短軸)
        area = 1720, 400, 1870, 500 # 楕円を描画する座標範囲 (x1, y1, x2, y2)
    
        create_ellipse_dataset(excel_path, sheet_name, output_dir, num_images, ellipse_size, area)