Spaces:
Runtime error
Runtime error
File size: 3,614 Bytes
a3c3dff 80f59eb a3c3dff c1f7ac7 a3c3dff 80f59eb a3c3dff 80f59eb a3c3dff 80f59eb a3c3dff 80f59eb |
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
from flask import Flask, request, render_template, Response
import cv2
import numpy as np
import tensorflow as tf
import threading
# Load the TFLite model
interpreter = tf.lite.Interpreter(model_path=r'midas.tflite')
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
app = Flask(__name__)
# Function to preprocess the image
def preprocess_image(image):
image = cv2.resize(image, (256, 256)) # Resize to 256x256
image = image.astype(np.float32) / 255.0 # Normalize to [0,1]
image = np.expand_dims(image, axis=0) # Add batch dimension
return image
# Function to process the frame
def process_frame(frame):
input_image = preprocess_image(frame)
# Set the input tensor
interpreter.set_tensor(input_details[0]['index'], input_image)
# Run inference
interpreter.invoke()
# Get the output tensor
depth_map = interpreter.get_tensor(output_details[0]['index'])
# Process depth map
depth_map = np.squeeze(depth_map)
depth_map = (depth_map / np.max(depth_map) * 255).astype(np.uint8)
depth_map_gray = cv2.cvtColor(depth_map, cv2.COLOR_GRAY2BGR)
# Apply Canny edge detection on the original frame
edges = cv2.Canny(frame, threshold1=100, threshold2=200)
edges_colored = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)
# Resize edges_colored to match depth_map dimensions
edges_colored = cv2.resize(edges_colored, depth_map_gray.shape[1::-1])
# Create an overlay
alpha = 0.9
overlay = cv2.addWeighted(depth_map_gray, alpha, edges_colored, alpha, 0)
overlay_gray = cv2.cvtColor(overlay, cv2.COLOR_BGR2GRAY)
# Segment processing
height, width = overlay_gray.shape
segment_width = width // 7
avg_pixel_densities = []
for i in range(7):
start_x = i * segment_width
end_x = (i + 1) * segment_width if i < 6 else width
segment_pixels = overlay_gray[:, start_x:end_x]
avg_pixel_density = np.mean(segment_pixels)
avg_pixel_densities.append(avg_pixel_density)
# Draw vertical lines and pixel density values
for i in range(7):
x = i * segment_width
cv2.line(overlay_gray, (x, 0), (x, height), (255, 255, 255), 1)
cv2.putText(overlay_gray, f"{avg_pixel_densities[i]:.2f}", (x + 5, 40),
cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 255, 255), 1)
# Draw a dot and horizontal line
center_x = width // 2
bottom_y = height - 10
dot_position = (center_x, bottom_y)
cv2.circle(overlay_gray, dot_position, 5, (255, 255, 255), -1)
middle_y = height // 2
cv2.line(overlay_gray, (0, middle_y), (width, middle_y), (255, 255, 255), 1)
# Draw arrow
lowest_index = np.argmin(avg_pixel_densities)
lowest_x = lowest_index * segment_width + segment_width // 2
arrow_end = (lowest_x, height // 2)
cv2.arrowedLine(overlay_gray, dot_position, arrow_end, (255, 0, 0), 2, tipLength=0.1)
return overlay_gray
@app.route('/')
def index():
return render_template('depthmap.html')
@app.route('/video_feed', methods=['POST'])
def video_feed():
# Receive the frame from the client
frame_data = request.files['frame'].read()
nparr = np.frombuffer(frame_data, np.uint8)
frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# Process the frame
processed_frame = process_frame(frame)
# Encode the processed frame as JPEG
_, jpeg = cv2.imencode('.jpg', processed_frame)
return Response(jpeg.tobytes(), mimetype='image/jpeg')
if __name__ == '__main__':
app.run(debug=True, threaded=True)
|