我正在使用人臉識別登錄網站數字銀行。我創建了一個名為 gen_frame() 的函式,其中我使用了名為“name”的變數。我想在函式外使用這個變數,以便我可以使用路由在 HTML 頁面上顯示它。我使用了燒瓶框架。
這是我的 app.py 檔案
# Initialize some variables
face_locations = []
face_encodings = []
face_names = []
process_this_frame = True
def gen_frames():
while True:
success, frame = camera.read() # read the camera frame
if not success:
break
else:
# Resize frame of video to 1/4 size for faster face recognition processing
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
# Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
rgb_small_frame = small_frame[:, :, ::-1]
# Only process every other frame of video to save time
# Find all the faces and face encodings in the current frame of video
face_locations = face_recognition.face_locations(rgb_small_frame)
face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
face_names = []
for face_encoding in face_encodings:
# See if the face is a match for the known face(s)
matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
name = "Unknown"
# Or instead, use the known face with the smallest distance to the new face
face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
best_match_index = np.argmin(face_distances)
if matches[best_match_index]:
name = known_face_names[best_match_index]
face_names.append(name)
# Display the results
for (top, right, bottom, left), name in zip(face_locations, face_names):
# Scale back up face locations since the frame we detected in was scaled to 1/4 size
top *= 4
right *= 4
bottom *= 4
left *= 4
# Draw a box around the face
cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
# Draw a label with a name below the face
cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 255, 0), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (left 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
ret, buffer = cv2.imencode('.jpg', frame)
frame = buffer.tobytes()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' frame b'\r\n')
data = name
@app.route('/')
def index():
return render_template('Index.html',data = data)
@app.route('/video_feed')
def video_feed():
return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__=='__main__':
app.run(debug=True)
我創建了資料變數 data = name
并使用路由將資料發送到 html
@app.route('/')
def index():
return render_template('Index.html',data = data)
這是我的 HTML 檔案代碼片段
<div class="container">
<div class="row justify-content-center">
<div class="col-sm-3" style="margin-top: 20px;box-shadow: 9px 9px 27px 2px hsl(250, 66%, 55%); border-radius: 70px; margin-right: 50px; text-align: center;">
<h4 style="text-align: center; color:hsl(250, 69%, 61%);" >Name:
<p>{{data}}</p>
</h4>
</div>
</div>
</div>
uj5u.com熱心網友回復:
嘗試將變數全域放在函式的開頭:
全域變數名
uj5u.com熱心網友回復:
在程式中創建全域變數的最快方法是在頂部創建變數。
# Initialize some variables
...
name = ''
這不是最佳實踐,當您在訪問的多個客戶端/瀏覽器上使用該程式時/video_feed,名稱的參考將使用相同的記憶體實體。有時,您不會得到預期的結果,正如 Ahmed Mohamed AEK 在評論中提到的那樣。
如果您創建影像處理頁面來觸發 API,并使用該觸發器發送名稱會更好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380533.html
