CoolFace
Apppublic

TruthLens/ai3d

sourceHugging Faceapache-2.0updated 2y agoView on Hugging Face
0likes
app.py97 linesDownload Raw Back to root
1import os2import numpy as np3from PIL import Image4from stl import mesh5from flask import Flask, render_template_string, request, send_file6from werkzeug.utils import secure_filename7import cv28 9app = Flask(__name__)10 11UPLOAD_FOLDER = 'uploads'12OUTPUT_FOLDER = 'outputs'13os.makedirs(UPLOAD_FOLDER, exist_ok=True)14os.makedirs(OUTPUT_FOLDER, exist_ok=True)15app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER16app.config['OUTPUT_FOLDER'] = OUTPUT_FOLDER17 18HTML_TEMPLATE = """19<!DOCTYPE html>20<html lang="en">21<head>22    <meta charset="UTF-8">23    <title>3D Printing Model Generator</title>24</head>25<body>26    <h1>Upload Image to Generate 3D Printable Model</h1>27    <form action="/upload" method="post" enctype="multipart/form-data">28        <label>Image:</label><input type="file" name="image" required><br><br>29        <input type="submit" value="Upload & Generate 3D Model">30    </form>31    {% if download_link %}32    <h2>3D Model Ready:</h2>33    <a href="{{ download_link }}" download>Download STL File</a>34    {% endif %}35</body>36</html>37"""38 39def image_to_height_map(image_path, size=(256, 256)):40    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)41    resized = cv2.resize(image, size)42    normalized = resized / 255.043    return normalized44 45def height_map_to_stl(height_map, output_path, scale=10.0):46    rows, cols = height_map.shape47    vertices = []48    faces = []49 50    for i in range(rows):51        for j in range(cols):52            z = height_map[i, j] * scale53            vertices.append([j, i, z])54 55    vertices = np.array(vertices).reshape((rows, cols, 3))56    face_list = []57 58    for i in range(rows - 1):59        for j in range(cols - 1):60            face_list.append([vertices[i, j], vertices[i + 1, j], vertices[i, j + 1]])61            face_list.append([vertices[i + 1, j], vertices[i + 1, j + 1], vertices[i, j + 1]])62 63    faces_np = np.array(face_list)64    model = mesh.Mesh(np.zeros(faces_np.shape[0], dtype=mesh.Mesh.dtype))65 66    for i, f in enumerate(faces_np):67        model.vectors[i] = f68 69    model.save(output_path)70 71def create_3d_model(image_path):72    height_map = image_to_height_map(image_path)73    output_path = os.path.join(app.config['OUTPUT_FOLDER'], 'model.stl')74    height_map_to_stl(height_map, output_path)75    return output_path76 77@app.route('/', methods=['GET'])78def index():79    return render_template_string(HTML_TEMPLATE, download_link=None)80 81@app.route('/upload', methods=['POST'])82def upload():83    uploaded_file = request.files['image']84    if uploaded_file:85        filename = secure_filename(uploaded_file.filename)86        image_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)87        uploaded_file.save(image_path)88 89        stl_path = create_3d_model(image_path)90        return render_template_string(HTML_TEMPLATE, download_link=f'/download/{os.path.basename(stl_path)}')91    return render_template_string(HTML_TEMPLATE, download_link=None)92 93@app.route('/download/<filename>', methods=['GET'])94def download_file(filename):95    return send_file(os.path.join(app.config['OUTPUT_FOLDER'], filename), as_attachment=True)96 97