Model 3d dari gambar 2d python

Untuk pemrograman ini, saya mengandalkan library Numpy STL yang dapat membuat model 3D menggunakan array Numpy yang “sederhana”.

Mengapa saya melakukannya

Saya adalah penggemar Pencetakan 3D, jadi saya membuat tantangan untuk menggunakan pustaka ini untuk membuat model 3D dari foto yang, jika dicetak dalam warna putih tembus pandang, disebut Litofan. Ada beberapa alat yang tersedia untuk melakukan ini tanpa pengkodean apa pun. Tapi di mana kesenangannya?

Saya ingin menginspirasi Anda

Hanya untuk memperjelas, saya tidak membuat seri ini untuk menunjukkan kepada Anda solusi luar biasa untuk membuat model 3D atau untuk mengesankan Anda dengan keterampilan matematika saya yang berkarat, atau bahkan geometri dasar saya atau bahkan keterampilan pemrograman Python Numpy saya yang belum sempurna. Mereka semua kurang, saya tahu. Tapi itulah intinya

Saya membuat seri ini untuk menginspirasi siapa saja yang ingin melakukan pengembangan perangkat lunak, bahwa segala sesuatu mungkin terjadi jika Anda mencobanya. Saya juga ingin bagaimana pengembangan perangkat lunak benar-benar dilakukan. Tidak ada hiasan dan tidak ada pengulangan. Anda juga tidak perlu tahu segalanya dari awal

Bagaimana saya berencana membuat model 3D dari sebuah Foto

Cara saya berencana membuat model foto 3D sangat sederhana. Saya akan memuat gambar dan mengubahnya dari warna menjadi skala abu-abu. Kemudian saya akan mengubah ukuran gambar menjadi ukuran model 3D yang ingin saya buat

Kemudian saya akan menggunakan intensitas piksel dari gambar grayscale yang diubah ukurannya untuk menentukan ketebalan setiap titik dalam model 3D, sehingga menciptakan model 3D dari sebuah foto. Sederhana bukan?

Alat yang akan Anda butuhkan

  • Otak (ukuran apa pun akan dilakukan)
  • Komputer dengan browser
  • Blender untuk memvisualisasikan model 3D(Atau perangkat lunak apa pun yang dapat memvisualisasikan file STL)
  • Serial YouTube saya

Video pertama dari seri saya tersedia di bagian atas halaman.

Seluruh solusi tersedia di https. //github. com/armindocachada/create-3d-model-using-python

Tapi saya sarankan Anda mulai dari awal. Saya akan menganggap Anda ingin melakukan yang terakhir

Saat Anda siap untuk memulai, buka Google Colab. Buat buku catatan kosong dan bersiaplah

Instal Blender

Hal pertama yang harus Anda lakukan jika Anda tidak memiliki cara untuk menampilkan file STL adalah mengunduh Blender dan menginstalnya di komputer Anda

Blender adalah perangkat lunak Pemodelan 3D yang sangat populer dan sepenuhnya gratis yang juga digunakan untuk membuat animasi 2D/3D yang menakjubkan dan di antara banyak hal lainnya, pengembangan game. Blender juga memiliki juru bahasa Python bawaan yang memberi Anda akses ke fungsi pemodelan 3D Blender. Tapi, kami tidak akan menggunakan salah satu dari fungsi tersebut. Setidaknya tidak hari ini

Instal Numpy-STL

Google Colab sudah menginstal Numpy. Yang perlu Anda tambahkan hanyalah Numpy STL

!pip3 install numpy-stl

Mencoba Contoh Quickstart Numpy

Langkah pertama adalah mencoba contoh paling sederhana dalam dokumentasi Numpy STL. Dengan mencoba an kode contoh, saya memiliki titik awal, dari sesuatu yang sudah berfungsi, dan itulah yang akan saya gunakan sebagai cara untuk memahami dasar-dasar pustaka STL Numpy dan sebagai titik jangkar

import numpy as np
from stl import mesh

# Define the 8 vertices of the cube
vertices = np.array([\
[-1, -1, -1],
[+1, -1, -1],
[+1, +1, -1],
[-1, +1, -1],
[-1, -1, +1],
[+1, -1, +1],
[+1, +1, +1],
[-1, +1, +1]])
# Define the 12 triangles composing the cube
faces = np.array([\
[0,3,1],
[1,3,2],
[0,4,7],
[0,7,3],
[4,5,6],
[4,6,7],
[5,1,2],
[5,2,6],
[2,3,6],
[3,7,6],
[0,1,5],
[0,5,4]])

# Create the mesh
cube = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
for i, f in enumerate(faces):
for j in range(3):
print(vertices[f[j],:])
cube.vectors[i][j] = vertices[f[j]]

# Write the mesh to file "cube.stl"
cube.save('cube.stl')
_

Saat menjalankan cuplikan kode di Google Colab, kami mendapatkan file STL bernama cube. stl dengan objek 3D berikut

Model 3d dari gambar 2d python

Ini adalah kubus dengan 12 wajah. Setiap wajah adalah segitiga

Untuk memahami apa yang dilakukan kode, ada baiknya jika kita mencari definisi di Geometri untuk setiap konsep

Verteks/simpul

Titik sudut adalah sudut, atau lebih tepatnya, titik di mana dua garis berpotongan

Model 3d dari gambar 2d python

Wajah

Wajah adalah permukaan datar individu, bagian dari benda padat. Kubus contoh kita memiliki 12 wajah individual. Dan setiap wajah adalah segitiga. Namun, jangan berpikir bahwa segitiga adalah satu-satunya jenis wajah yang bisa Anda gunakan. Anda bisa memiliki wajah segiempat atau bahkan wajah dengan lebih dari 4 sisi

Saya tidak tahu tentang Anda, tetapi bagi saya, itu sudah cukup rumit dengan 3 sisi. Jadi saya akan tetap dengan segitiga

Model 3d dari gambar 2d python
Wajah Segitiga

Tepian

Kode di atas tidak secara eksplisit menyebutkan edge, namun menurut saya penting untuk menyebutkannya demi kelengkapan. Garis tepi adalah garis yang menghubungkan dua simpul. Sederhana bukan?

Model 3d dari gambar 2d python

Puncak Normal

Vertex Normal adalah vektor yang menunjuk ke arah yang ditunjuk oleh wajah

Model 3d dari gambar 2d python

Jala

Sekarang mari kita definisikan apa itu mesh

Jaring adalah kumpulan simpul, tepi, dan muka yang menggambarkan bentuk objek 3D. Seperti yang sudah dijelaskan sebelumnya wajah bisa memiliki bentuk yang berbeda-beda, namun selama latihan kita hanya akan menggunakan wajah segitiga

Model 3d dari gambar 2d python

Sekarang setelah kita menyingkirkan definisinya, cuplikan kode menjadi lebih masuk akal

Kami pertama-tama membuat daftar simpul kubus yang berbeda sebagai larik Numpy dari koordinat [X, Y, Z].

vertices = np.array([\
[-1, -1, -1],
[+1, -1, -1],
[+1, +1, -1],
[-1, +1, -1],
[-1, -1, +1],
[+1, -1, +1],
[+1, +1, +1],
[-1, +1, +1]])

Kemudian kita membuat array Numpy lain dengan wajah menggunakan indeks dari setiap simpul yang telah ditentukan sebelumnya

faces = np.array([\
[0,3,1],
[1,3,2],
[0,4,7],
[0,7,3],
[4,5,6],
[4,6,7],
[5,1,2],
[5,2,6],
[2,3,6],
[3,7,6],
[0,1,5],
[0,5,4]])

Array Numpy ini sebenarnya hanyalah struktur data perantara yang kemudian digunakan untuk membuat Mesh

# Create the mesh
cube = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
for i, f in enumerate(faces):
for j in range(3):
print(vertices[f[j],:])
cube.vectors[i][j] = vertices[f[j]]
_

Setiap elemen di Mesh. daftar vektor berisi tiga simpul, yang, ketika dihubungkan, menentukan wajah

Memahami stl. Jala. dtype

Ketika saya pertama kali menemukan stl. Jala. dtype, ketika mempelajari dokumentasi Numpy STL saya jelas menemukan definisi ini. Dan inilah alasannya

dtype = dtype([('normals', '<f4', (3,)), ('vectors', '<f4', (3, 3)), ('attr', '<u2', (1,))])

Kecuali jika Anda seorang ahli Python/Numpy yang berpengalaman, Anda mungkin akan meludahkan kopi saat melihat definisi di atas. Ketika saya pertama kali melihat ini, saya melakukan apa yang biasanya dilakukan oleh kebanyakan pengembang perangkat lunak. Mencoba memahami, mengabaikan dan melanjutkan

Tetapi sekarang setelah saya menulis artikel ini, saya pikir saya siap untuk menguraikannya

Apa itu Dtype?

Untuk menjawab pertanyaan ini saya akan mengutip langsung dari dokumentasi Numpy

Objek jenis data (instance dari kelas numpy.dtype) menjelaskan bagaimana byte dalam blok memori berukuran tetap yang sesuai dengan item larik harus ditafsirkan. Ini menjelaskan aspek-aspek berikut dari data

1. Jenis data (integer, float, objek Python, dll. )

2. Ukuran data (berapa byte dalam e. g. bilangan bulat)

3. Urutan byte data ( atau )

4. Jika jenis datanya adalah, gabungan dari jenis data lainnya, (mis. g. , mendeskripsikan item array yang terdiri dari integer dan float),
– apa nama dari “” struktur, yang dengannya mereka dapat ,
– apa jenis data dari masing-masing , dan
– bagian mana dari blok memori yang diambil setiap bidang
– Jika tipe datanya adalah sub-array, apa bentuk dan tipe datanya

Dalam definisi tipe untuk tipe Mesh, kita mendefinisikan normal sebagai

('normals', '<f4', (3,))
_

'normals' adalah nama bidangnya, tidak banyak bicara

'

  • itu adalah angka floating-point
  • itu adalah angka floating-point 32-bit (f4)
  • Ada dalam representasi Little Endian ('<')

Little-Endian apa? . Ini ada hubungannya dengan cara kita menyimpan angka, di memori. Di Little-endian, byte yang paling tidak signifikan disimpan terlebih dahulu, mis. e. di alamat memori yang lebih rendah. Big Endian adalah kebalikannya
Masih tidak mengerti? . Ada banyak

Bagian terakhir dari teka-teki adalah (3,) ini menunjukkan bahwa normal memiliki subarray dari 3 bidang. Setiap bidang memiliki tipe '

Sederhana bukan?

Anda dapat melihat bahwa sisa dari definisi dtype dengan cara yang hampir sama. Contohnya '