Signed-off-by: sairate <sairate@sina.cn>
This commit is contained in:
parent
0318fb048b
commit
2af3b74b42
|
@ -6,22 +6,6 @@
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<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$/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" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/match_log.txt" beforeDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/requirements.txt" beforeDir="false" afterPath="$PROJECT_DIR$/requirements.txt" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/scanf_face.py" beforeDir="false" afterPath="$PROJECT_DIR$/scanf_face.py" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/templates/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/index.html" 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" />
|
||||||
|
@ -224,7 +208,7 @@
|
||||||
<workItem from="1724487238846" duration="322000" />
|
<workItem from="1724487238846" duration="322000" />
|
||||||
<workItem from="1724546711749" duration="3708000" />
|
<workItem from="1724546711749" duration="3708000" />
|
||||||
<workItem from="1724557160088" duration="579000" />
|
<workItem from="1724557160088" duration="579000" />
|
||||||
<workItem from="1724557783554" duration="4073000" />
|
<workItem from="1724557783554" duration="5158000" />
|
||||||
</task>
|
</task>
|
||||||
<task id="LOCAL-00001" summary="sairate">
|
<task id="LOCAL-00001" summary="sairate">
|
||||||
<option name="closed" value="true" />
|
<option name="closed" value="true" />
|
||||||
|
@ -281,8 +265,8 @@
|
||||||
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
||||||
<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="1724561714860" 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="1724563184328" 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="1724563001115" 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="1724563123312" 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>
|
||||||
</project>
|
</project>
|
101
README.md
101
README.md
|
@ -1,25 +1,102 @@
|
||||||
# 人脸识别匹配
|
以下是一个关于你项目结构和启动多个程序的详细文档:
|
||||||
|
|
||||||
## 1.实现步骤
|
---
|
||||||
|
|
||||||
- 首先初始化摄像头然后,识别人脸,并抓拍十张照片
|
# 项目文档
|
||||||
|
|
||||||
- 如果没有可以创建数据库,如果数据库已经存在,会调用已经存在数据库
|
## 项目结构
|
||||||
|
|
||||||
- 抓拍的十张照片一次匹配,返回结果
|
### 目录结构
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── .venv # Python 虚拟环境
|
||||||
|
├── captured_faces # 用于保存捕获的人脸照片
|
||||||
|
├── db_image # 数据库添加的测试照片
|
||||||
|
├── templates # 存放 HTML 模板文件
|
||||||
|
├── app.py # Flask 应用主程序
|
||||||
|
├── face_database.db # SQLite 数据库文件
|
||||||
|
├── match_log.txt # 匹配记录日志文件
|
||||||
|
├── requirements.txt # 项目依赖的 Python 包
|
||||||
|
├── scanf_face.py # 人脸捕捉与匹配脚本
|
||||||
|
└── run_programs.py # 启动多个程序的脚本
|
||||||
|
```
|
||||||
|
|
||||||
## 2.环境部署
|
## 主要组件
|
||||||
|
|
||||||
- 1.直接使用提供的虚拟环境.venv
|
### 1. `.venv`
|
||||||
|
包含项目所需的 Python 虚拟环境。确保在激活虚拟环境后运行项目,以便使用正确的依赖包。
|
||||||
|
|
||||||
- 2.独自安装软件包
|
### 2. `captured_faces`
|
||||||
|
用于存储捕获到的人脸图像。这些图像将用于与数据库中的人脸进行匹配。
|
||||||
|
|
||||||
``` bash
|
### 3. `db_image`
|
||||||
|
包含用于数据库测试的人脸照片。用于初始化数据库中的人脸记录。
|
||||||
|
|
||||||
|
### 4. `templates`
|
||||||
|
包含 HTML 模板文件。用于 Flask 应用的网页渲染。
|
||||||
|
|
||||||
|
### 5. `app.py`
|
||||||
|
Flask 应用的主程序,提供 Web 界面来展示匹配记录。它还使用 Socket.IO 实时更新数据。
|
||||||
|
|
||||||
|
### 6. `face_database.db`
|
||||||
|
SQLite 数据库文件,存储人脸编码和匹配记录。该数据库用于存储已知的人脸信息和匹配日志。
|
||||||
|
|
||||||
|
### 7. `match_log.txt`
|
||||||
|
记录人脸匹配的日志文件。每当检测到匹配时,将记录匹配信息到该文件中。
|
||||||
|
|
||||||
|
### 8. `requirements.txt`
|
||||||
|
列出项目的所有 Python 依赖包。可以使用 `pip install -r requirements.txt` 安装所需的库。
|
||||||
|
|
||||||
|
### 9. `scanf_face.py`
|
||||||
|
人脸捕捉和匹配脚本。通过摄像头捕捉人脸图像,并与数据库中的人脸进行匹配。
|
||||||
|
|
||||||
|
### 10. `run_programs.py`
|
||||||
|
脚本用于同时启动 `app.py` 和 `scanf_face.py` 两个程序。通过该脚本可以方便地管理多个程序的启动。
|
||||||
|
|
||||||
|
## 启动项目
|
||||||
|
|
||||||
|
### 1. 安装依赖
|
||||||
|
确保你已经安装了项目所需的依赖包。可以使用以下命令:
|
||||||
|
```bash
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
## 3.运行
|
### 2. 启动程序
|
||||||
|
使用 `run_programs.py` 脚本同时启动 Flask 应用和人脸捕捉脚本:
|
||||||
|
```bash
|
||||||
|
python run_programs.py
|
||||||
|
```
|
||||||
|
|
||||||
- 直接运行scanf_face.py文件即可
|
### 3. 访问 Web 应用
|
||||||
|
在浏览器中访问 `http://localhost:5000` 查看 Flask 应用,监控匹配记录。
|
||||||
|
|
||||||
- 添加人脸数据到数据库已经在scanf_face.py实现,调用即可
|
### 4. 捕捉和匹配人脸
|
||||||
|
`scanf_face.py` 脚本会持续通过摄像头捕捉人脸图像,并与数据库中的人脸进行匹配。当检测到匹配时,会更新数据库和日志文件。
|
||||||
|
|
||||||
|
## 代码概述
|
||||||
|
|
||||||
|
### `app.py`
|
||||||
|
- **功能**:提供 Web 界面显示匹配记录,使用 Socket.IO 实时更新数据。
|
||||||
|
- **主要路由**:`/` - 显示匹配记录。
|
||||||
|
|
||||||
|
### `scanf_face.py`
|
||||||
|
- **功能**:通过摄像头捕捉人脸,生成编码并与数据库中的人脸进行匹配。
|
||||||
|
- **主要功能**:
|
||||||
|
- 捕捉图像并保存到 `captured_faces` 目录。
|
||||||
|
- 与数据库中的人脸编码进行匹配。
|
||||||
|
- 记录匹配结果到 `match_log.txt` 和数据库。
|
||||||
|
|
||||||
|
### `run_programs.py`
|
||||||
|
- **功能**:同时启动 `app.py` 和 `scanf_face.py` 两个程序。
|
||||||
|
- **主要功能**:
|
||||||
|
- 使用 `subprocess` 模块启动并管理多个进程。
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
- 确保虚拟环境已激活并安装了所有依赖。
|
||||||
|
- 确保摄像头正常工作且能够捕捉到图像。
|
||||||
|
- 数据库和日志文件将会随着时间不断增加,请定期检查和维护这些文件。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
联系我 :sairate@sina.cn
|
|
@ -0,0 +1,22 @@
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
|
||||||
|
def start_program(program_name):
|
||||||
|
return subprocess.Popen(['python', program_name])
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# 启动两个程序
|
||||||
|
process1 = start_program('app.py')
|
||||||
|
process2 = start_program('scanf_face.py')
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 等待程序结束(在此示例中,程序会一直运行,因此不会到达这一步)
|
||||||
|
process1.wait()
|
||||||
|
process2.wait()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
# 捕获 Ctrl+C 来终止程序
|
||||||
|
print("Terminating processes...")
|
||||||
|
process1.terminate()
|
||||||
|
process2.terminate()
|
||||||
|
process1.wait()
|
||||||
|
process2.wait()
|
Loading…
Reference in New Issue