Signed-off-by: sairate <sairate@sina.cn>
|
@ -0,0 +1,8 @@
|
|||
# 默认忽略的文件
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# 基于编辑器的 HTTP 客户端请求
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
|
@ -0,0 +1,25 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="PyCompatibilityInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ourVersions">
|
||||
<value>
|
||||
<list size="3">
|
||||
<item index="0" class="java.lang.String" itemvalue="2.7" />
|
||||
<item index="1" class="java.lang.String" itemvalue="3.13" />
|
||||
<item index="2" class="java.lang.String" itemvalue="3.5" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ignoredPackages">
|
||||
<value>
|
||||
<list size="1">
|
||||
<item index="0" class="java.lang.String" itemvalue="cv2" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
|
@ -0,0 +1,6 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.9 (face)" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (face)" project-jdk-type="Python SDK" />
|
||||
</project>
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/face.iml" filepath="$PROJECT_DIR$/.idea/face.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,35 @@
|
|||
import cv2
|
||||
import face_recognition
|
||||
import sqlite3
|
||||
import numpy as np
|
||||
|
||||
from match_face import save_face_encoding
|
||||
|
||||
|
||||
def add_new_face(name):
|
||||
cap = cv2.VideoCapture(0)
|
||||
|
||||
while True:
|
||||
ret, frame = cap.read()
|
||||
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
|
||||
|
||||
face_locations = face_recognition.face_locations(rgb_frame)
|
||||
face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
|
||||
|
||||
if face_encodings:
|
||||
# 假设只处理第一张检测到的人脸
|
||||
encoding = face_encodings[0]
|
||||
save_face_encoding(name, encoding)
|
||||
print(f"Face of {name} saved!")
|
||||
break
|
||||
|
||||
cv2.imshow('Capture New Face', frame)
|
||||
if cv2.waitKey(1) & 0xFF == ord('q'):
|
||||
break
|
||||
|
||||
cap.release()
|
||||
cv2.destroyAllWindows()
|
||||
|
||||
|
||||
# 示例用法
|
||||
add_new_face("John Doe")
|
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,112 @@
|
|||
import cv2
|
||||
import face_recognition
|
||||
import os
|
||||
import sqlite3
|
||||
import numpy as np
|
||||
|
||||
# 初始化摄像头
|
||||
cap = cv2.VideoCapture(0)
|
||||
photo_count = 0
|
||||
max_photos = 10
|
||||
captured_images = []
|
||||
|
||||
# 创建目录以保存照片
|
||||
save_path = "captured_faces"
|
||||
os.makedirs(save_path, exist_ok=True)
|
||||
|
||||
while photo_count < max_photos:
|
||||
ret, frame = cap.read()
|
||||
if not ret:
|
||||
break
|
||||
|
||||
# 将图像转换为RGB颜色
|
||||
rgb_frame = frame[:, :, ::-1]
|
||||
|
||||
# 检测人脸
|
||||
face_locations = face_recognition.face_locations(rgb_frame)
|
||||
|
||||
for face_location in face_locations:
|
||||
top, right, bottom, left = face_location
|
||||
face_image = frame[top:bottom, left:right]
|
||||
|
||||
# 保存抓拍的照片
|
||||
image_path = os.path.join(save_path, f"face_{photo_count + 1}.jpg")
|
||||
cv2.imwrite(image_path, face_image)
|
||||
captured_images.append(image_path)
|
||||
|
||||
photo_count += 1
|
||||
if photo_count >= max_photos:
|
||||
break
|
||||
|
||||
# 显示结果
|
||||
cv2.imshow("Capturing Faces", frame)
|
||||
if cv2.waitKey(1) & 0xFF == ord('q'):
|
||||
break
|
||||
|
||||
cap.release()
|
||||
cv2.destroyAllWindows()
|
||||
|
||||
print(f"Captured {photo_count} images.")
|
||||
|
||||
|
||||
def create_face_database(db_name="face_database.db"):
|
||||
conn = sqlite3.connect(db_name)
|
||||
c = conn.cursor()
|
||||
c.execute('''CREATE TABLE IF NOT EXISTS faces
|
||||
(id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
encoding BLOB NOT NULL)''')
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
|
||||
def add_face_to_database(name, image_path, db_name="face_database.db"):
|
||||
conn = sqlite3.connect(db_name)
|
||||
c = conn.cursor()
|
||||
|
||||
# 加载图片并生成编码
|
||||
image = face_recognition.load_image_file(image_path)
|
||||
face_encodings = face_recognition.face_encodings(image)
|
||||
|
||||
if face_encodings:
|
||||
face_encoding = face_encodings[0]
|
||||
# 将编码转换为可以存储的格式
|
||||
encoding_blob = np.array(face_encoding).tobytes()
|
||||
c.execute("INSERT INTO faces (name, encoding) VALUES (?, ?)",
|
||||
(name, encoding_blob))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
|
||||
def match_faces(image_path, db_name="face_database.db"):
|
||||
conn = sqlite3.connect(db_name)
|
||||
c = conn.cursor()
|
||||
|
||||
# 加载待匹配图片并生成编码
|
||||
unknown_image = face_recognition.load_image_file(image_path)
|
||||
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
|
||||
|
||||
c.execute("SELECT name, encoding FROM faces")
|
||||
matches = []
|
||||
for row in c.fetchall():
|
||||
name, encoding_blob = row
|
||||
known_encoding = np.frombuffer(encoding_blob, dtype=np.float64)
|
||||
match = face_recognition.compare_faces([known_encoding], unknown_encoding)
|
||||
matches.append((name, match))
|
||||
|
||||
conn.close()
|
||||
return matches
|
||||
|
||||
|
||||
# 创建人脸数据库
|
||||
create_face_database()
|
||||
|
||||
# 向数据库中添加人脸
|
||||
add_face_to_database("Alice", "captured_faces/face_1.jpg")
|
||||
|
||||
# 匹配人脸
|
||||
for captured_image in captured_images:
|
||||
matches = match_faces(captured_image)
|
||||
for name, match in matches:
|
||||
if match[0]:
|
||||
print(f"Match found: {name} in image {captured_image}")
|