Spaces:
Running
Running
import streamlit as st | |
import cv2 | |
import numpy as np | |
from PIL import Image | |
import os | |
from image_processor import ImageProcessor | |
from model_generator import ModelGenerator | |
from utils import create_output_directory, allowed_file | |
def main(): | |
st.title("Image to 3D Converter") | |
st.write("Upload an image to convert it to a 3D model") | |
# Initialize processors | |
image_processor = ImageProcessor() | |
model_generator = ModelGenerator() | |
# File uploader | |
uploaded_file = st.file_uploader("Choose an image file", type=['png', 'jpg', 'jpeg']) | |
if uploaded_file is not None: | |
if allowed_file(uploaded_file.name): | |
# Read and display the uploaded image | |
image = Image.open(uploaded_file) | |
st.image(image, caption="Uploaded Image", use_column_width=True) | |
# Convert PIL Image to numpy array | |
image_np = np.array(image) | |
# Process button | |
if st.button("Convert to 3D"): | |
with st.spinner("Processing..."): | |
# Generate depth map | |
depth_map = image_processor.generate_depth_map(image_np) | |
# Display depth map | |
st.image(depth_map, caption="Generated Depth Map", use_column_width=True) | |
# Generate 3D model | |
points = model_generator.depth_to_points(depth_map, scale=50.0) | |
mesh = model_generator.generate_mesh(points) | |
# Create output directory | |
output_dir = create_output_directory() | |
output_file = os.path.join(output_dir, "output_model.obj") | |
# Save the mesh | |
model_generator.save_mesh(mesh, output_file) | |
# Provide download link | |
with open(output_file, "rb") as file: | |
st.download_button( | |
label="Download 3D Model", | |
data=file, | |
file_name="3d_model.obj", | |
mime="application/octet-stream" | |
) | |
st.success("3D model generated successfully!") | |
else: | |
st.error("Please upload an image file (PNG, JPG, or JPEG)") | |
if __name__ == "__main__": | |
main() | |