3D modeling has changed the presentation world of architecture designs. It's like pulling out the multi-dimensional images from your brain and painting them on a paper to see how it looks. The impact 3D modeling has, on presenting architectural services is undoubtedly the most transforming things to have happened.
A 3D Image can speak Thousand Words, unlike 2D We can visualize the architecture of the work in every possible aspect. We can get all the possible insights of the work from all possible angle and very cost efficient as compared to 2D.
Now A days 3D is becoming very popular because of its flexibility and availability. Currently we are using 3D simulation in various fields like augmented reality based gaming, Bioinformatics for watching the Interactions of genes, proteins etc. more closely and various angles and in many more fields.
So, Now our Work Simulation of 3D human image from Image is very useful for the 3D printing of Human Images and can be widely used in cinematic fields and medicine fields. So, Let’s Begin. First lets understand how a basic 3D works using motion of an electron around nucleus.
CODE:
#Importing required Libraries
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D
# ANIMATION FUNCTION
def func(num, dataSet, line, redDots):
# NOTE: there is no .set_data() for 3 dim data...
line.set_data(dataSet[0:2, :num])
line.set_3d_properties(dataSet[2, :num])
redDots.set_data(dataSet[0:2, :num])
redDots.set_3d_properties(dataSet[2, :num])
return line
# THE DATA POINTS
t = np.arange(0, 20, 0.2) # This would be the z-axis ('t' means time here) x = np.cos(t) - 1
y = 1 / 2 * (np.cos(2 * t) - 1)
dataSet = np.array([x, y, t])
numDataPoints = len(t)
# GET SOME MATPLOTLIB OBJECTS
fig = plt.figure()
ax = Axes3D(fig)
redDots = plt.plot(dataSet[0], dataSet[1], dataSet[2], lw=2, c='r', marker='o')[0] # For scatter plot
# NOTE: Can't pass empty arrays into 3d version of plot()
line = plt.plot(dataSet[0], dataSet[1], dataSet[2], lw=2, c='g')[0] # For line plot
# AXES PROPERTIES]
# ax.set_xlim3d([limit0, limit1])
ax.set_xlabel('X(t)')
ax.set_ylabel('Y(t)')
ax.set_zlabel('time')
ax.set_title('Trajectory of electron for E vector along [120]')
# Creating the Animation object
line_ani = animation.FuncAnimation(fig, func, frames=numDataPoints, fargs=(dataSet, line, redDots), interval=50,
blit=False)
# line_ani.save(r'Animation.mp4')
plt.show()
![](https://static.wixstatic.com/media/6e3b57_0e554f22fb2746449fc63bef959c1dd7~mv2.jpg/v1/fill/w_980,h_564,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/6e3b57_0e554f22fb2746449fc63bef959c1dd7~mv2.jpg)
Figure-1
Now Let’s go for our work.
We are going to use two technologies:
Python
Blender
Code For Capturing Human Face Video:
#Import Required Packages
import cv2
import numpy as np
# Load HAAR face classifier
face_classifier =
cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
Haarcascade_frontalface_default:
It is an Object Detection Algorithm used to identify faces in an image or a real time video. The algorithm uses edge or line detection features proposed by Viola and Jones in their research paper “Rapid Object Detection using a Boosted Cascade of Simple Features” published in 2001.
# Load functions
def face_extractor(img):
# Function detects faces and returns the cropped face
# If no face detected, it returns the input image
# gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_classifier.detectMultiScale(img, 1.3, 5)
if faces is ():
return None
# Crop all faces found
for (x, y, w, h) in faces:
x = x - 10
y = y - 10
cropped_face = img[y:y + h + 50, x:x + w + 50]
return cropped_face
# Initialize Webcam
cap = cv2.VideoCapture(0)
count = 0
# Collect 100 samples of your face from webcam input
while True:
ret, frame = cap.read()
if
face_extractor(frame) is not None:
count += 1
face = cv2.resize(face_extractor(frame), (400, 400))
file_name_path = './Amma/' + str(count) + '.jpg'
cv2.imwrite(file_name_path, face)
# Put count on images and display live count
cv2.putText(face, str(count), (50, 50), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 2)
cv2.imshow('Face Cropper', face)
else:
print("Face not found")
pass
if
cv2.waitKey(1) == 13 or count == 100: # 13 is the Enter Key
break
cap.release()
cv2.destroyAllWindows()
print("Collecting Samples Complete")
After Extracting 2D Images from Video Now Let’s Start Simulating 3D Model of our Image:
Step 1:
Generating .stl format files from 2D Images Using python
Code:
!pip3 install numpy-stl
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
mesh1 = 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],:])
mesh1.vectors[i][j] = vertices[f[j]]
# Write the mesh to file "cube.stl"
mesh1.save('mesh.stl')
Take an Input Image:
from PIL import Image
import matplotlib.pyplot as plt
im = Image.open("/content/IMG_20200905_201503.jpg")
plt.imshow(im)
Convert Image into greyscale:
grey_img = Image.open('/content/IMG_20200905_201503.jpg').convert('L') plt.imshow(grey_img)
Create 2D square surface with 2 triangles:
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]])
# Define the 12 triangles composing the cube
faces = np.array([\
[1,2,3],
[3,1,0]
])
# 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):
cube.vectors[i][j] = vertices[f[j],:]
# Write the mesh to file "cube.stl"
cube.save('surface.stl')
grey_img = Image.open('/content/IMG_20200905_201503.jpg').convert('L')
max_size=(500,500)
max_height=10
min_height=0
#height=0 for minPix
#height=maxHeight for maxPIx
grey_img.thumbnail(max_size)
imageNp = np.array(grey_img)
maxPix=imageNp.max()
minPix=imageNp.min()
print(imageNp)
(ncols,nrows)=grey_img.size
vertices=np.zeros((nrows,ncols,3))
for x in range(0, ncols):
for y in range(0, nrows):
pixelIntensity = imageNp[y][x]
z = (pixelIntensity * max_height) / maxPix
#print(imageNp[y][x])
vertices[y][x]=(x, y, z)
faces=[]
for x in range(0, ncols - 1):
for y in range(0, nrows - 1):
# create face 1
vertice1 = vertices[y][x]
vertice2 = vertices[y+1][x]
vertice3 = vertices[y+1][x+1]
face1 = np.array([vertice1,vertice2,vertice3])
# create face 2
vertice1 = vertices[y][x]
vertice2 = vertices[y][x+1]
vertice3 = vertices[y+1][x+1]
face2 = np.array([vertice1,vertice2,vertice3])
print(f"number of faces: {len(faces)}")
facesNp = np.array(faces)
# Create the mesh
surface = mesh.Mesh(np.zeros(facesNp.shape[0], dtype=mesh.Mesh.dtype))
for i, f in enumerate(faces):
for j in range(3):
surface.vectors[i][j] = facesNp[i][j]
# Write the mesh to file "cube.stl"
surface.save('surface.stl')
print(surface)
Surface.stl file in blender:
![](https://static.wixstatic.com/media/6e3b57_ef418568343a43849492ff7a9e2b4d3a~mv2.jpg/v1/fill/w_980,h_546,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/6e3b57_ef418568343a43849492ff7a9e2b4d3a~mv2.jpg)
Comentarios