import sqlite3
FACE_SQL_NAME = "face.db"
SQL_CREATE_TABLE = \
'''
CREATE TABLE FACE_INFO(
ID integer PRIMARY KEY autoincrement NOT NULL,
NAME TEXT NOT NULL,
IMAGE_PATH TEXT
);'''
SQL_INSERT_DATA = [
"INSERT INTO FACE_INFO (ID,NAME,IMAGE_PATH) VALUES (1, 'Paul',null )",
"INSERT INTO FACE_INFO (ID,NAME,IMAGE_PATH) VALUES (2, 'Allen',null )",
"INSERT INTO FACE_INFO (ID,NAME,IMAGE_PATH) VALUES (3, 'Teddy',null )",
"INSERT INTO FACE_INFO (ID,NAME,IMAGE_PATH) VALUES (4, 'Mark',null )"
]
SQL_QUERY_DATA = "SELECT id, name FROM FACE_INFO"
SQL_UPDATE_DATA = "UPDATE FACE_INFO set IMAGE_PATH = null where ID=1"
SQL_DELETE_DATA = "DELETE from FACE_INFO where ID=2;"
def create_sqlite3(sql_name):
'''
根据数据库名字 创造 或者 连接 数据库
:param sql_name:要创造或者连接的数据库名
:return:conn 返回的是这个数据库的对象
'''
conn = sqlite3.connect(sql_name)
return conn
def sqlite_exec_sql(conn, sql):
'''
执行指定的SQL语句
:param conn: 数据库的对象(他是哪个数据库)
:param sql: 需要执行的语句时什么
:return: cursor 返回受影响的行数
'''
# cursor用来执行命令的方法
c = conn.cursor()
# 执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
cursor = c.execute(sql)
return cursor
def create_table(conn, sql):
'''
向 该数据库创建一个表
:param conn: 需要操作的表
:param sql: 需要执行的语句
:return: 创建成功返回true, 失败返回false
'''
sqlite_exec_sql(conn, sql)
return True
import numpy as np
import os
import cv2
PATH1 = "./dog.jpg"
PATH2 = "C:/Users/yl177/Pictures/Camera Roll/4b91f4e8f3f658aeb78dd35c79e4c3bc.jpg"
img_file = list()
def load_face_image_data(path):
'''
通过指定路径,获得该图片,将其转化为数据
:param path: 文件路径
:return: 图片的数据
'''
img_data = cv2.imread(path)
return img_data
def move_face_image(image_path, offset_x, offset_y):
'''
对人脸图片进行平移操作(向右移25像素,向上移15像素),返回新图片的数据
:param image: 需要平移的图片路径
:param offset_x: x坐标平移的量(正 -- 向向右, 负 -- 表示向左)
:param offset_y: y坐标平移的量 (正 -- 向向下, 负 -- 表示向上)
:return:
'''
img = load_face_image_data(image_path)
rows = img.shape[0]
cols = img.shape[1]
M = np.float32([[1, 0, offset_x], [0, 1, offset_y]])
image_new_data = cv2.warpAffine(img, M, dsize=(cols, rows))
print(image_new_data)
return image_new_data
def scan_dir(path):
'''
扫描指定路径下的目录
:param path:
:return:
'''
if os.path.isfile(path):
return
file_list = os.listdir(path)
# print(file_list)
for item in file_list:
temp_path = os.path.join(path, item)
# print(temp_path)
if os.path.isfile(temp_path):
if temp_path.endswith("jpg") or temp_path.endswith("png"):
img_file.append(temp_path)
continue
if os.path.isdir(temp_path):
scan_dir(temp_path)
def show_image(img):
cv2.imshow('show_img', img)
cv2.waitKey(0)
# cv2.destroyAllWindows()
if __name__ == '__main__':
# old_img = load_face_image_data(PATH2)
# new_img = move_face_image(PATH, 15, -15)
# show_image(old_img)
# show_image(new_img)
scan_dir("./")
# print(img_file)
# print(img_file[0])
# img = load_face_image_data(img_file[1])
# show_image(img)
import sqlite3
import sql as sql_op
import img_op
def sql_con():
'''
建立数据库的连接
:return: 返回给数据库的对象
'''
return sql_op.create_sqlite3(sql_op.FACE_SQL_NAME)
def face_query(conn, face_name):
'''
根据姓名查询此人的人脸图片
:param conn: 该数据库的对象
:param face_name:需要查询的人名
:return: cursor:返回的是收到影响的行
'''
sql = "select ID,NAME,IMAGE_PATH from FACE_INFO where NAME='" + face_name + "'"
cursor = sql_op.sqlite_exec_sql(conn, sql)
return cursor
def face_query_by_id(conn, id):
'''
根据id查询此人相关信息
:param coon: 需要连接的数据库名
:param id: 需要查询的id
:return: 查到数据返回cursor,受影响的哪一行
'''
sql = "select ID,NAME,IMAGE_PATH from FACE_INFO where ID='" +str(id) + "'"
cursor = sql_op.sqlite_exec_sql(conn, sql)
return cursor
def face_query_all(conn):
'''
查询所有数据库
:param conn:需要连接数据库的对象
:return:查到数据返回cursor,受影响的哪一行
'''
sql = "select * from FACE_INFO"
cursor = sql_op.sqlite_exec_sql(conn, sql)
return cursor
def face_del(conn, face_name):
'''
根据图片名字删除指定的人脸数据
:param conn: 数据库
:param face_name:需要删除的图片的名字
:return:如果删除成功返回True
'''
sql = "DELETE from FACE_INFO where NAME='" + face_name + "'"
cursor = sql_op.sqlite_exec_sql(conn, sql)
conn.commit()
def face_del_by_id(conn, id):
'''
根据id删除指定的人脸数据
:param conn: 数据库
:param index: 需要删除的id索引
:return:如果删除成功返回True
'''
sql = "DELETE from FACE_INFO where ID='" + str(id) + "'"
cursor = sql_op.sqlite_exec_sql(conn, sql)
conn.commit()
def face_insert(conn, name, img_path):
'''
将人的相关信息(id,name,人脸图片)插入到数据库之中去
:param conn: 该数据库的对象
:param id: 唯一id
:param name: 人脸的姓名
:param img_path: 人脸的图片路径
:return:True数据插入成功,Talse数据插入失败
'''
sql = "INSERT INTO FACE_INFO (NAME,IMAGE_PATH) VALUES (" + "'" + name + "','" + img_path + "')"
try:
sql_op.sqlite_exec_sql(conn, sql)
except sqlite3.IntegrityError as result:
print("数据插入失败,原因:", result)
return False
else:
conn.commit()
return True
def face_recognition():
"""
实现人脸识别算法(打桩)
:return: 返回此人的姓名
"""
return 'Aaron_Eckhart_0001'
def test_1():
'''
根据id查询信息的测试
:return:
'''
conn = sql_con()
b = face_query(conn, "小红")
# print(b.fetchone())
for pid, name, path in b:
print(name)
print(pid)
print(path)
pass
conn.close()
def test_2():
'''
删除测试
:return:
'''
conn = sql_con()
face_del_by_id(conn, 5)
conn.close()
def test_3():
'''
如果插入重复的数据,则报错误(使用异常)
:return:
'''
coon = sql_con()
flag = face_insert(coon, "小红", img_op.PATH2)
if flag == True:
print("插入成功")
else:
print("插入失败")
def test_4():
'''
查询所有数据库的名字
:return:
'''
conn = sql_con()
cursor = face_query_all(conn)
for id, name, path in cursor:
print(id)
print(name)
print(path)
if __name__ == '__main__':
# test_1()
# test_2()
# test_3()
test_4()
使用python中的OpenCV进行人脸识别和监测,大致都需要进行这么几个步骤:
首先,读取人脸图像文件,之后对图像进行灰度转换。
其次,对图像的尺寸进行修改,如果要被监测的图像尺寸比较大的话,那就要将尺寸缩小
再次,就是重点步骤了,检测人脸,之后再检测到的人脸位置,绘制一个矩阵,要注意的是,opencv2中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示)
代码示例
import cv2
# 加载图像
img = cv2.imread('test.jpg')
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载Haar级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 在灰度图像中检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
# 对人脸进行标记
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 展示或保存结果图像
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
OK 帮你看看
没看懂,你都用了别人做好的软件了,咋就还需要Open CV呢?
你要是需要一个用Python3写的人脸识别程序的话可以参考我这篇文章,用的是CMake和OpenCV
【Python】用不到100行代码实现简单的人脸专注度检测计算功能(含完整代码)_a辰龙a的博客-CSDN博客
根据您提供的信息,我看到您正在描述一个实训题目,涉及人工智能中的人脸识别技术,使用Python编程语言和OpenCV库。您还提到了使用ctypes调用C/C++ DLL动态链接库,数据格式转换以及使用虹软人脸识别引擎实现离线人脸识别功能。
根据您提供的代码片段,我看到其中定义了几个函数,但是部分代码存在格式问题。我将重新整理一下您提供的代码,并为您提供一些补充说明。
import ctypes
# 调用C/C++ DLL动态链接库
dll = ctypes.CDLL("your_dll_file.dll")
# 数据格式转换函数
def convert_data(data):
# 数据格式转换代码
converted_data = # 转换后的数据
return converted_data
# 人脸位置标注函数
def annotate_face_position(image):
# 人脸位置标注代码
annotated_image = # 标注后的图像
return annotated_image
# 人脸信息标注函数
def annotate_face_info(face_info):
# 人脸信息标注代码
annotated_info = # 标注后的信息
return annotated_info
# 人脸检测函数
def face_detection():
# 人脸检测代码
print("Function 1") # 示例输出
# 示例函数调用
def example_function():
print("Function 2") # 示例输出
# 主程序
if __name__ == "__main__":
# 视频流读取
video_stream = cv2.VideoCapture(0) # 0表示摄像头设备编号
while True:
ret, frame = video_stream.read()
# 在图像上标注人脸位置
annotated_image = annotate_face_position(frame)
# 进行人脸检测
face_detection()
# 进行人脸信息标注
face_info = "Face info" # 示例人脸信息
annotated_info = annotate_face_info(face_info)
# 显示标注后的图像
cv2.imshow("Annotated Image", annotated_image)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video_stream.release()
cv2.destroyAllWindows()
请注意,以上代码是一个基本的框架,仅包含了您提供的部分函数和示例代码,并没有包含完整的人脸识别功能。您还需要根据具体的需求和使用的人脸识别引擎进行进一步的开发和集成。另外,您还需要安装并导入相应的库,如OpenCV和ctypes,以便代码能够正常运行。
此外,我注意到代码中存在一些缺失或错误的部分,如函数定义缺少冒号、拼写错误等。请在进一步开发时仔细检查代码并进行必要的修正。