File size: 2,363 Bytes
1e6afb9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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()