Signed-off-by: sairate <sairate@sina.cn>

This commit is contained in:
sairate 2024-08-28 15:56:13 +08:00
parent 56b405bef0
commit 486e7ac37d
3 changed files with 42 additions and 34 deletions

View File

@ -7,18 +7,7 @@
<list default="true" id="c512d54a-7f5f-4cfb-af24-29d5821a33bf" name="更改" comment="Signed-off-by: sairate &lt;sairate@sina.cn&gt;"> <list default="true" id="c512d54a-7f5f-4cfb-af24-29d5821a33bf" name="更改" comment="Signed-off-by: sairate &lt;sairate@sina.cn&gt;">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/app.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/app.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/captured_faces/face_1.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/captured_faces/face_1.jpg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/captured_faces/face_10.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/captured_faces/face_10.jpg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/captured_faces/face_2.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/captured_faces/face_2.jpg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/captured_faces/face_3.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/captured_faces/face_3.jpg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/captured_faces/face_4.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/captured_faces/face_4.jpg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/captured_faces/face_5.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/captured_faces/face_5.jpg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/captured_faces/face_6.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/captured_faces/face_6.jpg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/captured_faces/face_7.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/captured_faces/face_7.jpg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/captured_faces/face_8.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/captured_faces/face_8.jpg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/captured_faces/face_9.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/captured_faces/face_9.jpg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/face_database.db" beforeDir="false" afterPath="$PROJECT_DIR$/face_database.db" afterDir="false" /> <change beforePath="$PROJECT_DIR$/face_database.db" beforeDir="false" afterPath="$PROJECT_DIR$/face_database.db" afterDir="false" />
<change beforePath="$PROJECT_DIR$/scanf_face.py" beforeDir="false" afterPath="$PROJECT_DIR$/scanf_face.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -237,7 +226,7 @@
<workItem from="1724821991134" duration="19000" /> <workItem from="1724821991134" duration="19000" />
<workItem from="1724822043361" duration="2584000" /> <workItem from="1724822043361" duration="2584000" />
<workItem from="1724825008350" duration="405000" /> <workItem from="1724825008350" duration="405000" />
<workItem from="1724828238928" duration="2438000" /> <workItem from="1724828238928" duration="3286000" />
</task> </task>
<task id="LOCAL-00001" summary="sairate"> <task id="LOCAL-00001" summary="sairate">
<option name="closed" value="true" /> <option name="closed" value="true" />
@ -295,7 +284,7 @@
<SUITE FILE_PATH="coverage/face$run_programs.coverage" NAME="run_programs 覆盖结果" MODIFIED="1724830389566" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/face$run_programs.coverage" NAME="run_programs 覆盖结果" MODIFIED="1724830389566" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/face$sqlite.coverage" NAME="sqlite 覆盖结果" MODIFIED="1724310603865" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/face$sqlite.coverage" NAME="sqlite 覆盖结果" MODIFIED="1724310603865" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/face$match_face.coverage" NAME="match_face 覆盖结果" MODIFIED="1724314395402" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/face$match_face.coverage" NAME="match_face 覆盖结果" MODIFIED="1724314395402" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/face$app.coverage" NAME="app 覆盖结果" MODIFIED="1724830677403" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/face$app.coverage" NAME="app 覆盖结果" MODIFIED="1724831495130" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/face$scanf_face.coverage" NAME="scanf_face 覆盖结果" MODIFIED="1724830382139" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/face$scanf_face.coverage" NAME="scanf_face 覆盖结果" MODIFIED="1724830382139" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/face$add_face.coverage" NAME="add_face 覆盖结果" MODIFIED="1724311005030" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/face$add_face.coverage" NAME="add_face 覆盖结果" MODIFIED="1724311005030" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
</component> </component>

61
app.py
View File

@ -1,4 +1,4 @@
from flask import Flask, render_template, request, redirect, url_for from flask import Flask, render_template, request, redirect, url_for, flash
from flask_socketio import SocketIO, emit from flask_socketio import SocketIO, emit
import sqlite3 import sqlite3
import os import os
@ -7,7 +7,9 @@ import face_recognition
import numpy as np import numpy as np
app = Flask(__name__) app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = './static/db_image/' # 设置文件上传路径 app.config['UPLOAD_FOLDER'] = './static/db_image' # 设置文件上传路径
app.secret_key = 'TG1pSXF40uyHMu0OVrVt4ZsaLLqGekElefvewbI1hzD9UZLV71efR60trjAtsRXg' # Set the secret key for session management
socketio = SocketIO(app, async_mode='eventlet') socketio = SocketIO(app, async_mode='eventlet')
def create_face_database(db_name="face_database.db"): def create_face_database(db_name="face_database.db"):
@ -68,7 +70,6 @@ def info_person():
c = conn.cursor() c = conn.cursor()
if request.method == 'POST': if request.method == 'POST':
# 添加新人员
if 'add' in request.form: if 'add' in request.form:
name = request.form['name'] name = request.form['name']
identity = request.form['identity'] identity = request.form['identity']
@ -77,10 +78,14 @@ def info_person():
if image: if image:
image_path = os.path.join(app.config['UPLOAD_FOLDER'], image.filename) image_path = os.path.join(app.config['UPLOAD_FOLDER'], image.filename)
image.save(image_path) image.save(image_path)
add_face_to_database(name, identity, image_path)
try:
add_face_to_database(name, identity, image_path)
flash('Face added successfully!')
except Exception as e:
flash(f'Error adding face: {e}')
return redirect(url_for('info_person')) return redirect(url_for('info_person'))
# 更新人员信息
elif 'update' in request.form: elif 'update' in request.form:
id = request.form['id'] id = request.form['id']
name = request.form['name'] name = request.form['name']
@ -88,38 +93,52 @@ def info_person():
image = request.files.get('image_path') image = request.files.get('image_path')
if image: if image:
image_path = os.path.join(app.config['UPLOAD_FOLDER'], image.filename) # Generate new image path
image.save(image_path) new_image_path = os.path.join(app.config['UPLOAD_FOLDER'], image.filename)
image.save(new_image_path)
# 使用face_recognition生成新的面部编码 # Load the new image and generate new face encoding
loaded_image = face_recognition.load_image_file(image_path) try:
face_encodings = face_recognition.face_encodings(loaded_image) loaded_image = face_recognition.load_image_file(new_image_path)
face_encodings = face_recognition.face_encodings(loaded_image)
if face_encodings:
encoding = np.array(face_encodings[0]).tobytes()
new_image_path = "db_image/" + image.filename # Relative path for DB
else:
flash("No face detected in the uploaded image.")
return redirect(url_for('info_person'))
except Exception as e:
flash(f'Error processing image: {e}')
return redirect(url_for('info_person'))
# Update record in the database
c.execute("UPDATE faces SET name=?, identity=?, image_path=?, encoding=? WHERE id=?",
(name, identity, new_image_path, encoding, id))
flash('Face updated successfully!')
if face_encodings:
encoding = np.array(face_encodings[0]).tobytes()
else:
return "No face detected in the uploaded image."
else: else:
image_path = request.form['current_image_path'] # If no new image is uploaded, keep existing image path and encoding
encoding = request.form['encoding'] c.execute("UPDATE faces SET name=?, identity=? WHERE id=?",
(name, identity, id))
flash('Information updated successfully!')
c.execute("UPDATE faces SET name=?, identity=?, image_path=?, encoding=? WHERE id=?",
(name, identity, image_path, encoding, id))
# 删除人员信息
elif 'delete' in request.form: elif 'delete' in request.form:
id = request.form['id'] id = request.form['id']
c.execute("DELETE FROM faces WHERE id=?", (id,)) c.execute("DELETE FROM faces WHERE id=?", (id,))
flash('Face deleted successfully!')
conn.commit() conn.commit()
# 获取所有人员记录 # Fetch all records to display
c.execute("SELECT * FROM faces") c.execute("SELECT * FROM faces")
persons = c.fetchall() persons = c.fetchall()
conn.close() conn.close()
return render_template('info_person.html', persons=persons) return render_template('info_person.html', persons=persons)
@socketio.on('connect') @socketio.on('connect')
def handle_connect(): def handle_connect():
print('Client connected') print('Client connected')

Binary file not shown.