Signed-off-by: sairate <sairate@sina.cn>
This commit is contained in:
parent
56b405bef0
commit
486e7ac37d
|
@ -7,18 +7,7 @@
|
||||||
<list default="true" id="c512d54a-7f5f-4cfb-af24-29d5821a33bf" name="更改" comment="Signed-off-by: sairate <sairate@sina.cn>">
|
<list default="true" id="c512d54a-7f5f-4cfb-af24-29d5821a33bf" name="更改" comment="Signed-off-by: sairate <sairate@sina.cn>">
|
||||||
<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
61
app.py
|
@ -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')
|
||||||
|
|
BIN
face_database.db
BIN
face_database.db
Binary file not shown.
Loading…
Reference in New Issue