using OpenCvSharp; using System; using System.Runtime.InteropServices; /** * 备注(人脸数据库管理说明): * 人脸数据库为采用sqlite3的数据库,会自动生成一个db目录夹,下面有数据库face.db文件保存数据库 * 可用sqliteExpert之类的可视化工具打开查看,亦可用命令行,方法请自行百度。 * 该数据库仅仅可适应于5w人左右的人脸库,且设计表格等属于小型通用化。 * 若不能满足客户个性化需求,客户可自行设计数据库保存数据。宗旨就是每个人脸图片提取一个特征值保存。 * 人脸1:1,1:N比对及识别实际就是特征值的比对。1:1只要提取2张不同的图片特征值调用compare_feature比对。 * 1:N是提取一个特征值和数据库中已保存的N个特征值一一比对(比对速度很快,不用担心效率问题), * 最终取分数高的值为最高相似度。 * 相似度识别的分数可自行测试根据实验结果拟定,一般推荐相似度大于80分为同一人。 * */ namespace FaceAI { class FaceManager { // 人脸注册(传特征值,特征值可参考FaceFeature.cs提取,亦可参考FaceCompare.cs查看特征值的比对) [DllImport("BaiduFaceApi.dll", EntryPoint = "user_add", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr user_add(ref BDFaceFeature f1, string user_id, string group_id, string user_info=""); // 人脸注册(传opencv图片帧,特征值可参考FaceFeature.cs提取,亦可参考FaceCompare.cs查看特征值的比对) [DllImport("BaiduFaceApi.dll", EntryPoint = "user_add_by_mat", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr user_add_by_mat(IntPtr mat, string user_id, string group_id, string user_info = ""); // 人脸更新(传图片帧) [DllImport("BaiduFaceApi.dll", EntryPoint = "user_update", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr user_update(IntPtr mat, string user_id, string group_id, string user_info = ""); // 用户删除 [DllImport("BaiduFaceApi.dll", EntryPoint = "user_delete", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr user_delete(string user_id, string group_id); // 组添加 [DllImport("BaiduFaceApi.dll", EntryPoint = "group_add", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr group_add(string group_id); // 组删除 [DllImport("BaiduFaceApi.dll", EntryPoint = "group_delete", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr group_delete(string group_id); // 查询用户信息 [DllImport("BaiduFaceApi.dll", EntryPoint = "get_user_info", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr get_user_info(string user_id, string group_id); // 查询用户图片 [DllImport("BaiduFaceApi.dll", EntryPoint = "get_user_image", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern int get_user_image(IntPtr out_mat, string user_id, string group_id); // 用户组列表查询 [DllImport("BaiduFaceApi.dll", EntryPoint = "get_user_list", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr get_user_list(string group_id, int start = 0, int length = 100); // 组列表查询 [DllImport("BaiduFaceApi.dll", EntryPoint = "get_group_list", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr get_group_list(int start = 0, int length = 100); // 数据库人脸数量查询 [DllImport("BaiduFaceApi.dll", EntryPoint = "db_face_count", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)] public static extern int db_face_count(string group_id); // 测试人脸注册 public void test_user_add() { // 人脸注册 string user_id = "test_user"; string group_id = "test_group"; string file_name = "../images/1.jpg"; string user_info = "user_info"; // 提取人脸特征值数组(多人会提取多个人的特征值) /* FaceFeature feature = new FaceFeature(); BDFaceFeature[] feaList1 = feature.test_get_face_feature_by_path(file_name if (feaList1 == null) { Console.WriteLine("get feature fail"); return; } // 假设测试的图片是1个人, BDFaceFeature f1 = feaList1[0]; // 人脸注册 (传特征值人脸注册,该方法注册不保存人脸图片入库) IntPtr ptr = user_add(ref f1, user_id, group_id, user_info); string buf = Marshal.PtrToStringAnsi(ptr); Console.WriteLine("user_add res is:" + buf); */ // 通过图片帧人脸注册(只有该方法进行的人脸注册,人脸库才会保存人脸图片) Mat mat = Cv2.ImRead(file_name); IntPtr mptr = user_add_by_mat(mat.CvPtr, user_id, group_id, user_info); string mbuf = Marshal.PtrToStringAnsi(mptr); Console.WriteLine("user_add_by_mat res is:" + mbuf); } // 测试人脸更新 public void test_user_update() { string user_id = "test_user"; string group_id = "test_group"; string file_name = "../images/1.jpg"; Mat mat = Cv2.ImRead(file_name); string user_info = "user_info"; // 人脸更新 IntPtr ptr = user_update(mat.CvPtr, user_id, group_id, user_info); string buf = Marshal.PtrToStringAnsi(ptr); Console.WriteLine("user_update res is:" + buf); } // 测试用户删除 (用户删除后,人脸数据也被删除) public void test_user_delete() { string user_id = "test_user"; string group_id = "test_group"; IntPtr ptr = user_delete(user_id, group_id); string buf = Marshal.PtrToStringAnsi(ptr); Console.WriteLine("user_delete res is:" + buf); } // 组添加 public void test_group_add() { string group_id = "test_group2"; IntPtr ptr = group_add(group_id); string buf = Marshal.PtrToStringAnsi(ptr); Console.WriteLine("group_add res is:" + buf); } // 组删除 public void test_group_delete() { string group_id = "test_group2"; IntPtr ptr = group_delete(group_id); string buf = Marshal.PtrToStringAnsi(ptr); Console.WriteLine("group_delete res is:" + buf); } // 查询用户信息 public void test_get_user_info() { string user_id = "test_user"; string group_id = "test_group"; IntPtr ptr = get_user_info(user_id , group_id); string buf = Marshal.PtrToStringAnsi(ptr); Console.WriteLine("get_user_info res is:" + buf); } // 查询用户图片 public void test_get_user_image() { string user_id = "test_user"; string group_id = "test_group"; Mat out_mat = new Mat(); int res = get_user_image(out_mat.CvPtr, user_id, group_id); if (res == 0) { Console.WriteLine("get_user_image success"); // 图片保存到本地 out_mat.ImWrite("user.jpg"); } else { Console.WriteLine("get_user_image error{0}:", res); } } // 用户组列表查询 public void test_get_user_list() { string group_id = "test_group"; IntPtr ptr = get_user_list(group_id); string buf = Marshal.PtrToStringAnsi(ptr); Console.WriteLine("get_user_list res is:" + buf); } // 组列表查询 public void test_get_group_list() { IntPtr ptr = get_group_list(); string buf = Marshal.PtrToStringAnsi(ptr); Console.WriteLine("get_group_list res is:" + buf); } // 人脸库数量查询 public void test_db_face_count() { string group_id = "test_group"; // 参数传组id表示查该组都人脸数量 int count = db_face_count(group_id); Console.WriteLine("count is:" + count); string group_id2 = null; // 参数传null表示查整个库 int count2 = db_face_count(group_id2); Console.WriteLine("all count is:" + count2); } } }