| | |
| | | using System; |
| | | using System.IO; |
| | | using System.Threading; |
| | | using System.Collections; |
| | | using System.Runtime.InteropServices; |
| | | using System.Collections.Generic; |
| | | using OpenCvSharp; |
| | | //using System; |
| | | //using System.IO; |
| | | //using System.Threading; |
| | | //using System.Collections; |
| | | //using System.Runtime.InteropServices; |
| | | //using System.Collections.Generic; |
| | | //using OpenCvSharp; |
| | | |
| | | namespace FaceAI |
| | | { |
| | | [StructLayout(LayoutKind.Sequential, Pack = 1)] |
| | | // 活体分值 |
| | | struct BDLivenessScore |
| | | { |
| | | public float score; //分值 |
| | | }; |
| | | // 活体检测 |
| | | class FaceLiveness |
| | | { |
| | | // 单目RGB静默活体检测 |
| | | [DllImport("BaiduFaceApi.dll", EntryPoint = "rgb_liveness", CharSet = CharSet.Ansi |
| | | , CallingConvention = CallingConvention.Cdecl)] |
| | | public static extern int rgb_liveness(IntPtr ptr_boxinfo, IntPtr ptr_score, IntPtr mat); |
| | | //namespace FaceAI |
| | | //{ |
| | | // [StructLayout(LayoutKind.Sequential, Pack = 1)] |
| | | // // 活体分值 |
| | | // struct BDLivenessScore |
| | | // { |
| | | // public float score; //分值 |
| | | // }; |
| | | // // 活体检测 |
| | | // class FaceLiveness |
| | | // { |
| | | // // 单目RGB静默活体检测 |
| | | // [DllImport("BaiduFaceApi.dll", EntryPoint = "rgb_liveness", CharSet = CharSet.Ansi |
| | | // , CallingConvention = CallingConvention.Cdecl)] |
| | | // public static extern int rgb_liveness(IntPtr ptr_boxinfo, IntPtr ptr_score, IntPtr mat); |
| | | |
| | | // 单目近红外静默活体检测 |
| | | [DllImport("BaiduFaceApi.dll", EntryPoint = "nir_liveness", CharSet = CharSet.Ansi |
| | | , CallingConvention = CallingConvention.Cdecl)] |
| | | public static extern int nir_liveness(IntPtr ptr_boxinfo, IntPtr ptr_score, IntPtr mat); |
| | | // // 单目近红外静默活体检测 |
| | | // [DllImport("BaiduFaceApi.dll", EntryPoint = "nir_liveness", CharSet = CharSet.Ansi |
| | | // , CallingConvention = CallingConvention.Cdecl)] |
| | | // public static extern int nir_liveness(IntPtr ptr_boxinfo, IntPtr ptr_score, IntPtr mat); |
| | | |
| | | // 双目深度静默活体检测 |
| | | [DllImport("BaiduFaceApi.dll", EntryPoint = "rgb_depth_liveness", CharSet = CharSet.Ansi |
| | | , CallingConvention = CallingConvention.Cdecl)] |
| | | public static extern int rgb_depth_liveness(IntPtr ptr_boxinfo, IntPtr ptr_rgbscore, IntPtr ptr_depthcore, IntPtr rgb_mat, IntPtr depth_mat); |
| | | // // 双目深度静默活体检测 |
| | | // [DllImport("BaiduFaceApi.dll", EntryPoint = "rgb_depth_liveness", CharSet = CharSet.Ansi |
| | | // , CallingConvention = CallingConvention.Cdecl)] |
| | | // public static extern int rgb_depth_liveness(IntPtr ptr_boxinfo, IntPtr ptr_rgbscore, IntPtr ptr_depthcore, IntPtr rgb_mat, IntPtr depth_mat); |
| | | |
| | | |
| | | public void test_liveness_by_image() |
| | | { |
| | | // rgb 活体检测 |
| | | string img_rgb = "../images/rgb.png"; |
| | | liveness_check(img_rgb, 0); |
| | | // nir 活体检测 |
| | | string img_nir = "../images/nir.png"; |
| | | // liveness_check(img_nir, 1); |
| | | // public void test_liveness_by_image() |
| | | // { |
| | | // // rgb 活体检测 |
| | | // string img_rgb = "../images/rgb.png"; |
| | | // liveness_check(img_rgb, 0); |
| | | // // nir 活体检测 |
| | | // string img_nir = "../images/nir.png"; |
| | | // // liveness_check(img_nir, 1); |
| | | |
| | | } |
| | | // } |
| | | |
| | | // 测试单目RGB静默活体检测(传入图片文件路径,活体类型) |
| | | public void liveness_check(string img_path, int live_type) |
| | | { |
| | | Mat mat = Cv2.ImRead(img_path); |
| | | int max_face_num = 1; // 活体仅返回一个人脸,多人取最大人脸 |
| | | // // 测试单目RGB静默活体检测(传入图片文件路径,活体类型) |
| | | // public void liveness_check(string img_path, int live_type) |
| | | // { |
| | | // Mat mat = Cv2.ImRead(img_path); |
| | | // int max_face_num = 1; // 活体仅返回一个人脸,多人取最大人脸 |
| | | |
| | | BDFaceBBox[] box_info = new BDFaceBBox[max_face_num]; |
| | | // BDFaceBBox[] box_info = new BDFaceBBox[max_face_num]; |
| | | |
| | | int sizeBox = Marshal.SizeOf(typeof(BDFaceBBox)); |
| | | IntPtr ptT = Marshal.AllocHGlobal(sizeBox * max_face_num); |
| | | // int sizeBox = Marshal.SizeOf(typeof(BDFaceBBox)); |
| | | // IntPtr ptT = Marshal.AllocHGlobal(sizeBox * max_face_num); |
| | | |
| | | |
| | | BDLivenessScore[] score_info = new BDLivenessScore[max_face_num]; |
| | | int sizeScore = Marshal.SizeOf(typeof(BDLivenessScore)); |
| | | IntPtr ptS = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | // faceNum为返回的检测到的人脸个数 |
| | | int faceNum = 0; |
| | | if (live_type == 0) |
| | | { |
| | | faceNum = rgb_liveness(ptT, ptS, mat.CvPtr); |
| | | } |
| | | else if (live_type == 1) |
| | | { |
| | | faceNum = nir_liveness(ptT, ptS, mat.CvPtr); |
| | | } |
| | | mat.Release(); |
| | | // BDLivenessScore[] score_info = new BDLivenessScore[max_face_num]; |
| | | // int sizeScore = Marshal.SizeOf(typeof(BDLivenessScore)); |
| | | // IntPtr ptS = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | // // faceNum为返回的检测到的人脸个数 |
| | | // int faceNum = 0; |
| | | // if (live_type == 0) |
| | | // { |
| | | // faceNum = rgb_liveness(ptT, ptS, mat.CvPtr); |
| | | // } |
| | | // else if (live_type == 1) |
| | | // { |
| | | // faceNum = nir_liveness(ptT, ptS, mat.CvPtr); |
| | | // } |
| | | // mat.Release(); |
| | | |
| | | |
| | | Console.WriteLine("faceSize is:" + faceNum); |
| | | for (int index = 0; index < faceNum; index++) |
| | | { |
| | | // Console.WriteLine("faceSize is:" + faceNum); |
| | | // for (int index = 0; index < faceNum; index++) |
| | | // { |
| | | |
| | | IntPtr ptr = new IntPtr(); |
| | | IntPtr ptrScore = new IntPtr(); |
| | | if (8 == IntPtr.Size) |
| | | { |
| | | ptr = (IntPtr)(ptT.ToInt64() + sizeBox * index); |
| | | ptrScore = (IntPtr)(ptS.ToInt64() + sizeScore * index); |
| | | } |
| | | else if (4 == IntPtr.Size) |
| | | { |
| | | ptr = (IntPtr)(ptT.ToInt32() + sizeBox * index); |
| | | ptrScore = (IntPtr)(ptS.ToInt32() + sizeScore * index); |
| | | } |
| | | // IntPtr ptr = new IntPtr(); |
| | | // IntPtr ptrScore = new IntPtr(); |
| | | // if (8 == IntPtr.Size) |
| | | // { |
| | | // ptr = (IntPtr)(ptT.ToInt64() + sizeBox * index); |
| | | // ptrScore = (IntPtr)(ptS.ToInt64() + sizeScore * index); |
| | | // } |
| | | // else if (4 == IntPtr.Size) |
| | | // { |
| | | // ptr = (IntPtr)(ptT.ToInt32() + sizeBox * index); |
| | | // ptrScore = (IntPtr)(ptS.ToInt32() + sizeScore * index); |
| | | // } |
| | | |
| | | box_info[index] = (BDFaceBBox)Marshal.PtrToStructure(ptr, typeof(BDFaceBBox)); |
| | | // box_info[index] = (BDFaceBBox)Marshal.PtrToStructure(ptr, typeof(BDFaceBBox)); |
| | | |
| | | score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrScore, typeof(BDLivenessScore)); |
| | | // score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrScore, typeof(BDLivenessScore)); |
| | | |
| | | // 索引值 |
| | | Console.WriteLine("track index is:{0}", box_info[index].index); |
| | | // 置信度 |
| | | Console.WriteLine("track score is:{0}", box_info[index].score); |
| | | // 人脸宽度 |
| | | Console.WriteLine("track mWidth is:{0}", box_info[index].width); |
| | | // 中心点X,Y坐标 |
| | | Console.WriteLine("track mCenter_x is:{0}", box_info[index].center_x); |
| | | Console.WriteLine("track mCenter_y is:{0}", box_info[index].center_y); |
| | | // rgb 活体分值 |
| | | Console.WriteLine("liveness score is:{0}", score_info[index].score); |
| | | // // 索引值 |
| | | // Console.WriteLine("track index is:{0}", box_info[index].index); |
| | | // // 置信度 |
| | | // Console.WriteLine("track score is:{0}", box_info[index].score); |
| | | // // 人脸宽度 |
| | | // Console.WriteLine("track mWidth is:{0}", box_info[index].width); |
| | | // // 中心点X,Y坐标 |
| | | // Console.WriteLine("track mCenter_x is:{0}", box_info[index].center_x); |
| | | // Console.WriteLine("track mCenter_y is:{0}", box_info[index].center_y); |
| | | // // rgb 活体分值 |
| | | // Console.WriteLine("liveness score is:{0}", score_info[index].score); |
| | | |
| | | } |
| | | Marshal.FreeHGlobal(ptT); |
| | | } |
| | | // } |
| | | // Marshal.FreeHGlobal(ptT); |
| | | // } |
| | | |
| | | // 选择usb视频摄像头id,方法里面有获取连接的摄像头列表,包括id,名称和路径等 |
| | | public int select_usb_device_id() |
| | | { |
| | | ArrayList capDevs = new ArrayList(); |
| | | int device_id = 0; |
| | | try |
| | | { |
| | | if (!File.Exists(Path.Combine(Environment.SystemDirectory, @"dpnhpast.dll"))) |
| | | { |
| | | Console.WriteLine("DirectX NOT installed!"); |
| | | return - 1; |
| | | } |
| | | if (!DevEnum.GetDevicesOfCat(FilterCategory.VideoInputDevice, out capDevs)) |
| | | { |
| | | Console.WriteLine("No video capture devices found!"); |
| | | return -1; |
| | | } |
| | | if (capDevs.Count < 2) |
| | | { |
| | | Console.WriteLine("ir and rgb camera devices needed"); |
| | | return -1; |
| | | } |
| | | foreach (DsDevice d in capDevs) { |
| | | Console.WriteLine("== VIDEO DEVICE (id:{0}) ==", d.id); |
| | | Console.WriteLine("Name: {0}", d.Name); |
| | | Console.WriteLine("Path: {0}", d.Path); |
| | | } |
| | | // // 选择usb视频摄像头id,方法里面有获取连接的摄像头列表,包括id,名称和路径等 |
| | | // public int select_usb_device_id() |
| | | // { |
| | | // ArrayList capDevs = new ArrayList(); |
| | | // int device_id = 0; |
| | | // try |
| | | // { |
| | | // if (!File.Exists(Path.Combine(Environment.SystemDirectory, @"dpnhpast.dll"))) |
| | | // { |
| | | // Console.WriteLine("DirectX NOT installed!"); |
| | | // return - 1; |
| | | // } |
| | | // if (!DevEnum.GetDevicesOfCat(FilterCategory.VideoInputDevice, out capDevs)) |
| | | // { |
| | | // Console.WriteLine("No video capture devices found!"); |
| | | // return -1; |
| | | // } |
| | | // if (capDevs.Count < 2) |
| | | // { |
| | | // Console.WriteLine("ir and rgb camera devices needed"); |
| | | // return -1; |
| | | // } |
| | | // foreach (DsDevice d in capDevs) { |
| | | // Console.WriteLine("== VIDEO DEVICE (id:{0}) ==", d.id); |
| | | // Console.WriteLine("Name: {0}", d.Name); |
| | | // Console.WriteLine("Path: {0}", d.Path); |
| | | // } |
| | | |
| | | if (capDevs.Count > 0) |
| | | { |
| | | device_id = ((DsDevice)capDevs[0]).id; |
| | | Console.WriteLine("select device id is:{0}", device_id); |
| | | } |
| | | } |
| | | catch(Exception) |
| | | { |
| | | if (capDevs != null) |
| | | { |
| | | foreach (DsDevice d in capDevs) |
| | | d.Dispose(); |
| | | capDevs = null; |
| | | } |
| | | return -1; |
| | | } |
| | | return device_id; |
| | | } |
| | | // if (capDevs.Count > 0) |
| | | // { |
| | | // device_id = ((DsDevice)capDevs[0]).id; |
| | | // Console.WriteLine("select device id is:{0}", device_id); |
| | | // } |
| | | // } |
| | | // catch(Exception) |
| | | // { |
| | | // if (capDevs != null) |
| | | // { |
| | | // foreach (DsDevice d in capDevs) |
| | | // d.Dispose(); |
| | | // capDevs = null; |
| | | // } |
| | | // return -1; |
| | | // } |
| | | // return device_id; |
| | | // } |
| | | |
| | | // 双目RGB和IR静默活体检测(可使用迪威泰或视派尔等rgb+nir双目摄像头),rgb和nir的分值都通过如0.8才算活体通过 |
| | | public bool rgb_ir_liveness_check_mat() |
| | | { |
| | | int max_face_num = 1;//取最大人脸的活体 |
| | | BDLivenessScore[] rgb_score_info = new BDLivenessScore[max_face_num]; |
| | | BDLivenessScore[] nir_score_info = new BDLivenessScore[max_face_num]; |
| | | int sizeScore = Marshal.SizeOf(typeof(BDLivenessScore)); |
| | | IntPtr ptSRGB = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | IntPtr ptSNIR = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | // // 双目RGB和IR静默活体检测(可使用迪威泰或视派尔等rgb+nir双目摄像头),rgb和nir的分值都通过如0.8才算活体通过 |
| | | // public bool rgb_ir_liveness_check_mat() |
| | | // { |
| | | // int max_face_num = 1;//取最大人脸的活体 |
| | | // BDLivenessScore[] rgb_score_info = new BDLivenessScore[max_face_num]; |
| | | // BDLivenessScore[] nir_score_info = new BDLivenessScore[max_face_num]; |
| | | // int sizeScore = Marshal.SizeOf(typeof(BDLivenessScore)); |
| | | // IntPtr ptSRGB = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | // IntPtr ptSNIR = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | |
| | | // 初始化rgb 返回的人脸数据 |
| | | BDFaceBBox[] rgb_box_info = new BDFaceBBox[max_face_num]; |
| | | // // 初始化rgb 返回的人脸数据 |
| | | // BDFaceBBox[] rgb_box_info = new BDFaceBBox[max_face_num]; |
| | | |
| | | int sizeBox = Marshal.SizeOf(typeof(BDFaceBBox)); |
| | | IntPtr ptTRGB = Marshal.AllocHGlobal(sizeBox * max_face_num); |
| | | // int sizeBox = Marshal.SizeOf(typeof(BDFaceBBox)); |
| | | // IntPtr ptTRGB = Marshal.AllocHGlobal(sizeBox * max_face_num); |
| | | |
| | | // 初始化nir 返回的人脸数据 |
| | | BDFaceBBox[] nir_box_info = new BDFaceBBox[max_face_num]; |
| | | // // 初始化nir 返回的人脸数据 |
| | | // BDFaceBBox[] nir_box_info = new BDFaceBBox[max_face_num]; |
| | | |
| | | sizeBox = Marshal.SizeOf(typeof(BDFaceBBox)); |
| | | IntPtr ptTNIR = Marshal.AllocHGlobal(sizeBox * max_face_num); |
| | | // sizeBox = Marshal.SizeOf(typeof(BDFaceBBox)); |
| | | // IntPtr ptTNIR = Marshal.AllocHGlobal(sizeBox * max_face_num); |
| | | |
| | | // 序号0为电脑识别的usb摄像头编号,本demo中0为ir红外摄像头 |
| | | // 不同摄像头和电脑识别可能有区别 |
| | | // 编号一般从0-10 */ |
| | | int device = select_usb_device_id(); |
| | | VideoCapture camera1 = VideoCapture.FromCamera(device); |
| | | if(!camera1.IsOpened()) |
| | | { |
| | | Console.WriteLine("camera1 open error"); |
| | | return false; |
| | | } |
| | | // // 序号0为电脑识别的usb摄像头编号,本demo中0为ir红外摄像头 |
| | | // // 不同摄像头和电脑识别可能有区别 |
| | | // // 编号一般从0-10 */ |
| | | // int device = select_usb_device_id(); |
| | | // VideoCapture camera1 = VideoCapture.FromCamera(device); |
| | | // if(!camera1.IsOpened()) |
| | | // { |
| | | // Console.WriteLine("camera1 open error"); |
| | | // return false; |
| | | // } |
| | | |
| | | VideoCapture camera2 = VideoCapture.FromCamera(device+1); |
| | | if (!camera2.IsOpened()) |
| | | { |
| | | Console.WriteLine("camera2 open error"); |
| | | return false; |
| | | } |
| | | // VideoCapture camera2 = VideoCapture.FromCamera(device+1); |
| | | // if (!camera2.IsOpened()) |
| | | // { |
| | | // Console.WriteLine("camera2 open error"); |
| | | // return false; |
| | | // } |
| | | |
| | | Mat frame1 = new Mat(); |
| | | Mat frame2 = new Mat(); |
| | | Mat rgb_mat = new Mat(); |
| | | Mat ir_mat = new Mat(); |
| | | var window_ir = new Window("ir_face"); |
| | | var window_rgb = new Window("rgb_face"); |
| | | while (true) |
| | | { |
| | | camera1.Read(frame1); |
| | | camera2.Read(frame2); |
| | | if(!frame1.Empty() && !frame2.Empty()) |
| | | { |
| | | if (frame1.Channels() == 3) |
| | | { |
| | | rgb_mat = frame1; |
| | | ir_mat = frame2; |
| | | } |
| | | else |
| | | { |
| | | rgb_mat = frame2; |
| | | ir_mat = frame1; |
| | | } |
| | | float rgb_score = 0; |
| | | float ir_score = 0; |
| | | // Mat frame1 = new Mat(); |
| | | // Mat frame2 = new Mat(); |
| | | // Mat rgb_mat = new Mat(); |
| | | // Mat ir_mat = new Mat(); |
| | | // var window_ir = new Window("ir_face"); |
| | | // var window_rgb = new Window("rgb_face"); |
| | | // while (true) |
| | | // { |
| | | // camera1.Read(frame1); |
| | | // camera2.Read(frame2); |
| | | // if(!frame1.Empty() && !frame2.Empty()) |
| | | // { |
| | | // if (frame1.Channels() == 3) |
| | | // { |
| | | // rgb_mat = frame1; |
| | | // ir_mat = frame2; |
| | | // } |
| | | // else |
| | | // { |
| | | // rgb_mat = frame2; |
| | | // ir_mat = frame1; |
| | | // } |
| | | // float rgb_score = 0; |
| | | // float ir_score = 0; |
| | | |
| | | int face_size = 0; |
| | | int nir_size = nir_liveness(ptTNIR, ptSNIR, ir_mat.CvPtr); |
| | | int rgb_size = rgb_liveness(ptTRGB, ptSRGB, rgb_mat.CvPtr); |
| | | // int face_size = 0; |
| | | // int nir_size = nir_liveness(ptTNIR, ptSNIR, ir_mat.CvPtr); |
| | | // int rgb_size = rgb_liveness(ptTRGB, ptSRGB, rgb_mat.CvPtr); |
| | | |
| | | face_size = nir_size <= rgb_size?nir_size:rgb_size; |
| | | // 获取的人脸数 |
| | | Console.WriteLine("faceNum is:{0}", face_size); |
| | | for (int index = 0; index < face_size; index++) |
| | | { |
| | | // face_size = nir_size <= rgb_size?nir_size:rgb_size; |
| | | // // 获取的人脸数 |
| | | // Console.WriteLine("faceNum is:{0}", face_size); |
| | | // for (int index = 0; index < face_size; index++) |
| | | // { |
| | | |
| | | IntPtr ptrBox = new IntPtr(); |
| | | IntPtr ptrRGBScore = new IntPtr(); |
| | | IntPtr ptrNIRScore = new IntPtr(); |
| | | if (8 == IntPtr.Size) |
| | | { |
| | | ptrBox = (IntPtr)(ptTRGB.ToInt64() + sizeBox * index); |
| | | ptrRGBScore = (IntPtr)(ptSRGB.ToInt64() + sizeScore * index); |
| | | ptrNIRScore = (IntPtr)(ptSNIR.ToInt64() + sizeScore * index); |
| | | } |
| | | else if (4 == IntPtr.Size) |
| | | { |
| | | ptrBox = (IntPtr)(ptTRGB.ToInt32() + sizeBox * index); |
| | | ptrRGBScore = (IntPtr)(ptSRGB.ToInt32() + sizeScore * index); |
| | | ptrNIRScore = (IntPtr)(ptSNIR.ToInt32() + sizeScore * index); |
| | | } |
| | | // IntPtr ptrBox = new IntPtr(); |
| | | // IntPtr ptrRGBScore = new IntPtr(); |
| | | // IntPtr ptrNIRScore = new IntPtr(); |
| | | // if (8 == IntPtr.Size) |
| | | // { |
| | | // ptrBox = (IntPtr)(ptTRGB.ToInt64() + sizeBox * index); |
| | | // ptrRGBScore = (IntPtr)(ptSRGB.ToInt64() + sizeScore * index); |
| | | // ptrNIRScore = (IntPtr)(ptSNIR.ToInt64() + sizeScore * index); |
| | | // } |
| | | // else if (4 == IntPtr.Size) |
| | | // { |
| | | // ptrBox = (IntPtr)(ptTRGB.ToInt32() + sizeBox * index); |
| | | // ptrRGBScore = (IntPtr)(ptSRGB.ToInt32() + sizeScore * index); |
| | | // ptrNIRScore = (IntPtr)(ptSNIR.ToInt32() + sizeScore * index); |
| | | // } |
| | | |
| | | rgb_box_info[index] = (BDFaceBBox)Marshal.PtrToStructure(ptrBox, typeof(BDFaceBBox)); |
| | | // rgb_box_info[index] = (BDFaceBBox)Marshal.PtrToStructure(ptrBox, typeof(BDFaceBBox)); |
| | | |
| | | rgb_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrRGBScore, typeof(BDLivenessScore)); |
| | | nir_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrNIRScore, typeof(BDLivenessScore)); |
| | | rgb_score = rgb_score_info[index].score; |
| | | ir_score = nir_score_info[index].score; |
| | | if (rgb_score <= 0.1f) |
| | | { |
| | | rgb_score = 0; |
| | | } |
| | | if (ir_score <= 0.1f) |
| | | { |
| | | ir_score = 0; |
| | | } |
| | | Console.WriteLine("demo ccccc"); |
| | | // 人脸宽度 |
| | | Console.WriteLine("mWidth is:{0:f}", rgb_box_info[index].width); |
| | | // 中心点X,Y坐标 |
| | | Console.WriteLine("mCenter_x is:{0:f}", rgb_box_info[index].center_x); |
| | | Console.WriteLine("mCenter_y is:{0:f}", rgb_box_info[index].center_y); |
| | | // rgb_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrRGBScore, typeof(BDLivenessScore)); |
| | | // nir_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrNIRScore, typeof(BDLivenessScore)); |
| | | // rgb_score = rgb_score_info[index].score; |
| | | // ir_score = nir_score_info[index].score; |
| | | // if (rgb_score <= 0.1f) |
| | | // { |
| | | // rgb_score = 0; |
| | | // } |
| | | // if (ir_score <= 0.1f) |
| | | // { |
| | | // ir_score = 0; |
| | | // } |
| | | // Console.WriteLine("demo ccccc"); |
| | | // // 人脸宽度 |
| | | // Console.WriteLine("mWidth is:{0:f}", rgb_box_info[index].width); |
| | | // // 中心点X,Y坐标 |
| | | // Console.WriteLine("mCenter_x is:{0:f}", rgb_box_info[index].center_x); |
| | | // Console.WriteLine("mCenter_y is:{0:f}", rgb_box_info[index].center_y); |
| | | |
| | | } |
| | | // } |
| | | |
| | | string msg_depth = "ir score is:" + ir_score.ToString(); |
| | | // string msg_depth = "ir score is:" + ir_score.ToString(); |
| | | |
| | | Cv2.PutText(ir_mat, msg_depth, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | // Cv2.PutText(ir_mat, msg_depth, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | |
| | | string msg_rgb = "rgb score is:" + rgb_score.ToString(); |
| | | Cv2.PutText(rgb_mat, msg_rgb, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | if (face_size > 0) |
| | | { |
| | | // 画人脸框 |
| | | FaceDraw.draw_rects(ref rgb_mat, face_size, rgb_box_info); |
| | | // 画关键点 |
| | | // FaceDraw.draw_shape(ref rgb_mat, face_size, rgb_track_info); |
| | | } |
| | | window_rgb.ShowImage(rgb_mat); |
| | | window_ir.ShowImage(ir_mat); |
| | | Cv2.WaitKey(1); |
| | | } |
| | | } |
| | | Marshal.FreeHGlobal(ptTRGB); |
| | | Marshal.FreeHGlobal(ptTNIR); |
| | | rgb_mat.Release(); |
| | | ir_mat.Release(); |
| | | frame1.Release(); |
| | | frame2.Release(); |
| | | Cv2.DestroyWindow("ir_face"); |
| | | Cv2.DestroyWindow("rgb_face"); |
| | | return true; |
| | | } |
| | | // 双目摄像头进行rgb,depth活体检测(此处适配了华杰艾米的双目摄像头)rgb和depth的分值都通过如0.8才算活体通过 |
| | | public bool rgb_depth_liveness_check_hjimi() |
| | | { |
| | | int max_face_num = 1;//取最大人脸的活体 |
| | | // string msg_rgb = "rgb score is:" + rgb_score.ToString(); |
| | | // Cv2.PutText(rgb_mat, msg_rgb, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | // if (face_size > 0) |
| | | // { |
| | | // // 画人脸框 |
| | | // FaceDraw.draw_rects(ref rgb_mat, face_size, rgb_box_info); |
| | | // // 画关键点 |
| | | // // FaceDraw.draw_shape(ref rgb_mat, face_size, rgb_track_info); |
| | | // } |
| | | // window_rgb.ShowImage(rgb_mat); |
| | | // window_ir.ShowImage(ir_mat); |
| | | // Cv2.WaitKey(1); |
| | | // } |
| | | // } |
| | | // Marshal.FreeHGlobal(ptTRGB); |
| | | // Marshal.FreeHGlobal(ptTNIR); |
| | | // rgb_mat.Release(); |
| | | // ir_mat.Release(); |
| | | // frame1.Release(); |
| | | // frame2.Release(); |
| | | // Cv2.DestroyWindow("ir_face"); |
| | | // Cv2.DestroyWindow("rgb_face"); |
| | | // return true; |
| | | // } |
| | | // // 双目摄像头进行rgb,depth活体检测(此处适配了华杰艾米的双目摄像头)rgb和depth的分值都通过如0.8才算活体通过 |
| | | // public bool rgb_depth_liveness_check_hjimi() |
| | | // { |
| | | // int max_face_num = 1;//取最大人脸的活体 |
| | | |
| | | BDLivenessScore[] rgb_score_info = new BDLivenessScore[max_face_num]; |
| | | BDLivenessScore[] depth_score_info = new BDLivenessScore[max_face_num]; |
| | | int sizeScore = Marshal.SizeOf(typeof(BDLivenessScore)); |
| | | IntPtr ptRGBS = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | IntPtr ptDepthS = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | // BDLivenessScore[] rgb_score_info = new BDLivenessScore[max_face_num]; |
| | | // BDLivenessScore[] depth_score_info = new BDLivenessScore[max_face_num]; |
| | | // int sizeScore = Marshal.SizeOf(typeof(BDLivenessScore)); |
| | | // IntPtr ptRGBS = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | // IntPtr ptDepthS = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | |
| | | BDFaceBBox[] box_info = new BDFaceBBox[max_face_num]; |
| | | // BDFaceBBox[] box_info = new BDFaceBBox[max_face_num]; |
| | | |
| | | int sizeBox = Marshal.SizeOf(typeof(BDFaceBBox)); |
| | | IntPtr ptT = Marshal.AllocHGlobal(sizeBox * max_face_num); |
| | | IntPtr phjimi = HjimiCamera.new_hjimi(); |
| | | var rgb_win = new Window("rgb", WindowMode.AutoSize); |
| | | var depth_win = new Window("depth", WindowMode.Normal); |
| | | float rgb_score = 0; |
| | | float depth_score = 0; |
| | | Mat cv_depth = new Mat(); |
| | | Mat cv_rgb = new Mat(); |
| | | while (true) |
| | | { |
| | | bool ok = HjimiCamera.open_hjimimat(phjimi, cv_rgb.CvPtr, cv_depth.CvPtr); |
| | | if (!ok) |
| | | { |
| | | depth_score = 0; |
| | | rgb_score = depth_score; |
| | | Console.WriteLine("open camera faile"); |
| | | continue; |
| | | } |
| | | if(cv_rgb.Empty()) |
| | | { |
| | | continue; |
| | | } |
| | | if (cv_depth.Empty()) |
| | | { |
| | | continue; |
| | | } |
| | | // 返回人脸个数 |
| | | int face_size = rgb_depth_liveness(ptT, ptRGBS, ptDepthS, cv_rgb.CvPtr, cv_depth.CvPtr); |
| | | // int sizeBox = Marshal.SizeOf(typeof(BDFaceBBox)); |
| | | // IntPtr ptT = Marshal.AllocHGlobal(sizeBox * max_face_num); |
| | | // IntPtr phjimi = HjimiCamera.new_hjimi(); |
| | | // var rgb_win = new Window("rgb", WindowMode.AutoSize); |
| | | // var depth_win = new Window("depth", WindowMode.Normal); |
| | | // float rgb_score = 0; |
| | | // float depth_score = 0; |
| | | // Mat cv_depth = new Mat(); |
| | | // Mat cv_rgb = new Mat(); |
| | | // while (true) |
| | | // { |
| | | // bool ok = HjimiCamera.open_hjimimat(phjimi, cv_rgb.CvPtr, cv_depth.CvPtr); |
| | | // if (!ok) |
| | | // { |
| | | // depth_score = 0; |
| | | // rgb_score = depth_score; |
| | | // Console.WriteLine("open camera faile"); |
| | | // continue; |
| | | // } |
| | | // if(cv_rgb.Empty()) |
| | | // { |
| | | // continue; |
| | | // } |
| | | // if (cv_depth.Empty()) |
| | | // { |
| | | // continue; |
| | | // } |
| | | // // 返回人脸个数 |
| | | // int face_size = rgb_depth_liveness(ptT, ptRGBS, ptDepthS, cv_rgb.CvPtr, cv_depth.CvPtr); |
| | | |
| | | Console.WriteLine("res is:{0}", face_size); |
| | | depth_score = 0; |
| | | rgb_score = depth_score; |
| | | for (int index = 0; index < face_size; index++) |
| | | { |
| | | IntPtr ptrBox = new IntPtr(); |
| | | IntPtr ptrRGBScore = new IntPtr(); |
| | | IntPtr ptrDepthScore = new IntPtr(); |
| | | if (8 == IntPtr.Size) |
| | | { |
| | | ptrBox = (IntPtr)(ptT.ToInt64() + sizeBox * index); |
| | | ptrRGBScore = (IntPtr)(ptRGBS.ToInt64() + sizeScore * index); |
| | | ptrDepthScore = (IntPtr)(ptDepthS.ToInt64() + sizeScore * index); |
| | | } |
| | | else if (4 == IntPtr.Size) |
| | | { |
| | | ptrBox = (IntPtr)(ptT.ToInt32() + sizeBox * index); |
| | | ptrRGBScore = (IntPtr)(ptRGBS.ToInt32() + sizeScore * index); |
| | | ptrDepthScore = (IntPtr)(ptDepthS.ToInt32() + sizeScore * index); |
| | | } |
| | | // Console.WriteLine("res is:{0}", face_size); |
| | | // depth_score = 0; |
| | | // rgb_score = depth_score; |
| | | // for (int index = 0; index < face_size; index++) |
| | | // { |
| | | // IntPtr ptrBox = new IntPtr(); |
| | | // IntPtr ptrRGBScore = new IntPtr(); |
| | | // IntPtr ptrDepthScore = new IntPtr(); |
| | | // if (8 == IntPtr.Size) |
| | | // { |
| | | // ptrBox = (IntPtr)(ptT.ToInt64() + sizeBox * index); |
| | | // ptrRGBScore = (IntPtr)(ptRGBS.ToInt64() + sizeScore * index); |
| | | // ptrDepthScore = (IntPtr)(ptDepthS.ToInt64() + sizeScore * index); |
| | | // } |
| | | // else if (4 == IntPtr.Size) |
| | | // { |
| | | // ptrBox = (IntPtr)(ptT.ToInt32() + sizeBox * index); |
| | | // ptrRGBScore = (IntPtr)(ptRGBS.ToInt32() + sizeScore * index); |
| | | // ptrDepthScore = (IntPtr)(ptDepthS.ToInt32() + sizeScore * index); |
| | | // } |
| | | |
| | | box_info[index] = (BDFaceBBox)Marshal.PtrToStructure(ptrBox, typeof(BDFaceBBox)); |
| | | // box_info[index] = (BDFaceBBox)Marshal.PtrToStructure(ptrBox, typeof(BDFaceBBox)); |
| | | |
| | | rgb_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrRGBScore, typeof(BDLivenessScore)); |
| | | rgb_score = rgb_score_info[index].score; |
| | | depth_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrDepthScore, typeof(BDLivenessScore)); |
| | | depth_score = depth_score_info[index].score; |
| | | // 分值太低,会显示小数点太长,直接赋值0 |
| | | if (depth_score <= 0.1f) |
| | | { |
| | | depth_score = 0; |
| | | } |
| | | if (rgb_score <= 0.1f) |
| | | { |
| | | rgb_score = 0; |
| | | } |
| | | // 人脸宽度 |
| | | Console.WriteLine("mWidth is:{0:f}", box_info[index].width); |
| | | // 中心点X,Y坐标 |
| | | Console.WriteLine("mCenter_x is:{0:f}", box_info[index].center_x); |
| | | Console.WriteLine("mCenter_y is:{0:f}", box_info[index].center_y); |
| | | // rgb_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrRGBScore, typeof(BDLivenessScore)); |
| | | // rgb_score = rgb_score_info[index].score; |
| | | // depth_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrDepthScore, typeof(BDLivenessScore)); |
| | | // depth_score = depth_score_info[index].score; |
| | | // // 分值太低,会显示小数点太长,直接赋值0 |
| | | // if (depth_score <= 0.1f) |
| | | // { |
| | | // depth_score = 0; |
| | | // } |
| | | // if (rgb_score <= 0.1f) |
| | | // { |
| | | // rgb_score = 0; |
| | | // } |
| | | // // 人脸宽度 |
| | | // Console.WriteLine("mWidth is:{0:f}", box_info[index].width); |
| | | // // 中心点X,Y坐标 |
| | | // Console.WriteLine("mCenter_x is:{0:f}", box_info[index].center_x); |
| | | // Console.WriteLine("mCenter_y is:{0:f}", box_info[index].center_y); |
| | | |
| | | } |
| | | // } |
| | | |
| | | |
| | | Mat depth_img = new Mat(); |
| | | cv_depth.ConvertTo(depth_img, MatType.CV_8UC1, 255.0 / 4500); |
| | | string msg_depth = "depth score is:" + depth_score.ToString(); |
| | | Cv2.PutText(depth_img, msg_depth, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | // Mat depth_img = new Mat(); |
| | | // cv_depth.ConvertTo(depth_img, MatType.CV_8UC1, 255.0 / 4500); |
| | | // string msg_depth = "depth score is:" + depth_score.ToString(); |
| | | // Cv2.PutText(depth_img, msg_depth, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | |
| | | string msg_rgb = "rgb score is:" + rgb_score.ToString(); |
| | | Cv2.PutText(cv_rgb, msg_rgb, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | if (face_size > 0) |
| | | { |
| | | // 画人脸框 |
| | | FaceDraw.draw_rects(ref cv_rgb, face_size, box_info); |
| | | // string msg_rgb = "rgb score is:" + rgb_score.ToString(); |
| | | // Cv2.PutText(cv_rgb, msg_rgb, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | // if (face_size > 0) |
| | | // { |
| | | // // 画人脸框 |
| | | // FaceDraw.draw_rects(ref cv_rgb, face_size, box_info); |
| | | |
| | | } |
| | | // } |
| | | |
| | | rgb_win.ShowImage(cv_rgb); |
| | | depth_win.ShowImage(depth_img); |
| | | Cv2.WaitKey(1); |
| | | depth_img.Release(); |
| | | } |
| | | Marshal.FreeHGlobal(ptT); |
| | | cv_rgb.Release(); |
| | | cv_depth.Release(); |
| | | Cv2.DestroyWindow("rgb"); |
| | | Cv2.DestroyWindow("depth"); |
| | | HjimiCamera.hjimi_release(phjimi); |
| | | return true; |
| | | } |
| | | //双目RGB和DEPTH静默活体检测(传入opencv视频帧)适配奥比中光海燕等双目摄像头 |
| | | public bool rgb_depth_liveness_check_orbe() |
| | | { |
| | | int max_face_num = 1;//取最大人脸的活体 |
| | | // rgb_win.ShowImage(cv_rgb); |
| | | // depth_win.ShowImage(depth_img); |
| | | // Cv2.WaitKey(1); |
| | | // depth_img.Release(); |
| | | // } |
| | | // Marshal.FreeHGlobal(ptT); |
| | | // cv_rgb.Release(); |
| | | // cv_depth.Release(); |
| | | // Cv2.DestroyWindow("rgb"); |
| | | // Cv2.DestroyWindow("depth"); |
| | | // HjimiCamera.hjimi_release(phjimi); |
| | | // return true; |
| | | // } |
| | | // //双目RGB和DEPTH静默活体检测(传入opencv视频帧)适配奥比中光海燕等双目摄像头 |
| | | // public bool rgb_depth_liveness_check_orbe() |
| | | // { |
| | | // int max_face_num = 1;//取最大人脸的活体 |
| | | |
| | | BDLivenessScore[] rgb_score_info = new BDLivenessScore[max_face_num]; |
| | | BDLivenessScore[] depth_score_info = new BDLivenessScore[max_face_num]; |
| | | int sizeScore = Marshal.SizeOf(typeof(BDLivenessScore)); |
| | | IntPtr ptRGBS = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | IntPtr ptDepthS = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | // BDLivenessScore[] rgb_score_info = new BDLivenessScore[max_face_num]; |
| | | // BDLivenessScore[] depth_score_info = new BDLivenessScore[max_face_num]; |
| | | // int sizeScore = Marshal.SizeOf(typeof(BDLivenessScore)); |
| | | // IntPtr ptRGBS = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | // IntPtr ptDepthS = Marshal.AllocHGlobal(sizeScore * max_face_num); |
| | | |
| | | BDFaceBBox[] box_info = new BDFaceBBox[max_face_num]; |
| | | // BDFaceBBox[] box_info = new BDFaceBBox[max_face_num]; |
| | | |
| | | int sizeBox = Marshal.SizeOf(typeof(BDFaceTrackInfo)); |
| | | IntPtr ptT = Marshal.AllocHGlobal(sizeBox * max_face_num); |
| | | // int sizeBox = Marshal.SizeOf(typeof(BDFaceTrackInfo)); |
| | | // IntPtr ptT = Marshal.AllocHGlobal(sizeBox * max_face_num); |
| | | |
| | | IntPtr porbe = OrbeCamera.new_orbe(); |
| | | var rgb_win = new Window("rgb", WindowMode.AutoSize); |
| | | var depth_win = new Window("depth", WindowMode.Normal); |
| | | float rgb_score = 0; |
| | | float depth_score = 0; |
| | | Mat cv_depth = new Mat(); |
| | | Mat cv_rgb = new Mat(); |
| | | while (true) |
| | | { |
| | | int res_ok = OrbeCamera.open_orbe(porbe, cv_rgb.CvPtr, cv_depth.CvPtr); |
| | | if (res_ok != 0) |
| | | { |
| | | depth_score = 0; |
| | | rgb_score = depth_score; |
| | | Console.WriteLine("open camera faile"); |
| | | continue; |
| | | } |
| | | if (cv_rgb.Empty()) |
| | | { |
| | | continue; |
| | | } |
| | | if (cv_depth.Empty()) |
| | | { |
| | | continue; |
| | | } |
| | | // 返回人脸个数 |
| | | int face_size = rgb_depth_liveness(ptT, ptRGBS, ptDepthS, cv_rgb.CvPtr, cv_depth.CvPtr); |
| | | // IntPtr porbe = OrbeCamera.new_orbe(); |
| | | // var rgb_win = new Window("rgb", WindowMode.AutoSize); |
| | | // var depth_win = new Window("depth", WindowMode.Normal); |
| | | // float rgb_score = 0; |
| | | // float depth_score = 0; |
| | | // Mat cv_depth = new Mat(); |
| | | // Mat cv_rgb = new Mat(); |
| | | // while (true) |
| | | // { |
| | | // int res_ok = OrbeCamera.open_orbe(porbe, cv_rgb.CvPtr, cv_depth.CvPtr); |
| | | // if (res_ok != 0) |
| | | // { |
| | | // depth_score = 0; |
| | | // rgb_score = depth_score; |
| | | // Console.WriteLine("open camera faile"); |
| | | // continue; |
| | | // } |
| | | // if (cv_rgb.Empty()) |
| | | // { |
| | | // continue; |
| | | // } |
| | | // if (cv_depth.Empty()) |
| | | // { |
| | | // continue; |
| | | // } |
| | | // // 返回人脸个数 |
| | | // int face_size = rgb_depth_liveness(ptT, ptRGBS, ptDepthS, cv_rgb.CvPtr, cv_depth.CvPtr); |
| | | |
| | | Console.WriteLine("res is:{0}", face_size); |
| | | depth_score = 0; |
| | | rgb_score = depth_score; |
| | | for (int index = 0; index < face_size; index++) |
| | | { |
| | | IntPtr ptrBox = new IntPtr(); |
| | | IntPtr ptrRGBScore = new IntPtr(); |
| | | IntPtr ptrDepthScore = new IntPtr(); |
| | | if (8 == IntPtr.Size) |
| | | { |
| | | ptrBox = (IntPtr)(ptT.ToInt64() + sizeBox * index); |
| | | ptrRGBScore = (IntPtr)(ptRGBS.ToInt64() + sizeScore * index); |
| | | ptrDepthScore = (IntPtr)(ptDepthS.ToInt64() + sizeScore * index); |
| | | } |
| | | else if (4 == IntPtr.Size) |
| | | { |
| | | ptrBox = (IntPtr)(ptT.ToInt32() + sizeBox * index); |
| | | ptrRGBScore = (IntPtr)(ptRGBS.ToInt32() + sizeScore * index); |
| | | ptrDepthScore = (IntPtr)(ptDepthS.ToInt32() + sizeScore * index); |
| | | } |
| | | // Console.WriteLine("res is:{0}", face_size); |
| | | // depth_score = 0; |
| | | // rgb_score = depth_score; |
| | | // for (int index = 0; index < face_size; index++) |
| | | // { |
| | | // IntPtr ptrBox = new IntPtr(); |
| | | // IntPtr ptrRGBScore = new IntPtr(); |
| | | // IntPtr ptrDepthScore = new IntPtr(); |
| | | // if (8 == IntPtr.Size) |
| | | // { |
| | | // ptrBox = (IntPtr)(ptT.ToInt64() + sizeBox * index); |
| | | // ptrRGBScore = (IntPtr)(ptRGBS.ToInt64() + sizeScore * index); |
| | | // ptrDepthScore = (IntPtr)(ptDepthS.ToInt64() + sizeScore * index); |
| | | // } |
| | | // else if (4 == IntPtr.Size) |
| | | // { |
| | | // ptrBox = (IntPtr)(ptT.ToInt32() + sizeBox * index); |
| | | // ptrRGBScore = (IntPtr)(ptRGBS.ToInt32() + sizeScore * index); |
| | | // ptrDepthScore = (IntPtr)(ptDepthS.ToInt32() + sizeScore * index); |
| | | // } |
| | | |
| | | box_info[index] = (BDFaceBBox)Marshal.PtrToStructure(ptrBox, typeof(BDFaceBBox)); |
| | | // box_info[index] = (BDFaceBBox)Marshal.PtrToStructure(ptrBox, typeof(BDFaceBBox)); |
| | | |
| | | rgb_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrRGBScore, typeof(BDLivenessScore)); |
| | | rgb_score = rgb_score_info[index].score; |
| | | depth_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrDepthScore, typeof(BDLivenessScore)); |
| | | depth_score = depth_score_info[index].score; |
| | | // 分值太低,会显示小数点太长,直接赋值0 |
| | | if (depth_score <= 0.1f) |
| | | { |
| | | depth_score = 0; |
| | | } |
| | | if (rgb_score <= 0.1f) |
| | | { |
| | | rgb_score = 0; |
| | | } |
| | | // 人脸宽度 |
| | | Console.WriteLine("mWidth is:{0:f}", box_info[index].width); |
| | | // 中心点X,Y坐标 |
| | | Console.WriteLine("mCenter_x is:{0:f}", box_info[index].center_x); |
| | | Console.WriteLine("mCenter_y is:{0:f}", box_info[index].center_y); |
| | | // rgb_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrRGBScore, typeof(BDLivenessScore)); |
| | | // rgb_score = rgb_score_info[index].score; |
| | | // depth_score_info[index] = (BDLivenessScore)Marshal.PtrToStructure(ptrDepthScore, typeof(BDLivenessScore)); |
| | | // depth_score = depth_score_info[index].score; |
| | | // // 分值太低,会显示小数点太长,直接赋值0 |
| | | // if (depth_score <= 0.1f) |
| | | // { |
| | | // depth_score = 0; |
| | | // } |
| | | // if (rgb_score <= 0.1f) |
| | | // { |
| | | // rgb_score = 0; |
| | | // } |
| | | // // 人脸宽度 |
| | | // Console.WriteLine("mWidth is:{0:f}", box_info[index].width); |
| | | // // 中心点X,Y坐标 |
| | | // Console.WriteLine("mCenter_x is:{0:f}", box_info[index].center_x); |
| | | // Console.WriteLine("mCenter_y is:{0:f}", box_info[index].center_y); |
| | | |
| | | } |
| | | // } |
| | | |
| | | |
| | | Mat depth_img = new Mat(); |
| | | cv_depth.ConvertTo(depth_img, MatType.CV_8UC1, 255.0 / 4500); |
| | | string msg_depth = "depth score is:" + depth_score.ToString(); |
| | | Cv2.PutText(depth_img, msg_depth, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | // Mat depth_img = new Mat(); |
| | | // cv_depth.ConvertTo(depth_img, MatType.CV_8UC1, 255.0 / 4500); |
| | | // string msg_depth = "depth score is:" + depth_score.ToString(); |
| | | // Cv2.PutText(depth_img, msg_depth, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | |
| | | string msg_rgb = "rgb score is:" + rgb_score.ToString(); |
| | | Cv2.PutText(cv_rgb, msg_rgb, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | if (face_size > 0) |
| | | { |
| | | // 画人脸框 |
| | | FaceDraw.draw_rects(ref cv_rgb, face_size, box_info); |
| | | } |
| | | rgb_win.ShowImage(cv_rgb); |
| | | depth_win.ShowImage(depth_img); |
| | | Cv2.WaitKey(1); |
| | | depth_img.Release(); |
| | | } |
| | | Marshal.FreeHGlobal(ptT); |
| | | cv_rgb.Release(); |
| | | cv_depth.Release(); |
| | | Cv2.DestroyWindow("rgb"); |
| | | Cv2.DestroyWindow("depth"); |
| | | OrbeCamera.orbe_release(porbe); |
| | | return true; |
| | | } |
| | | // string msg_rgb = "rgb score is:" + rgb_score.ToString(); |
| | | // Cv2.PutText(cv_rgb, msg_rgb, new Point(20, 50), HersheyFonts.HersheyComplex, 1, new Scalar(255, 100, 0)); |
| | | // if (face_size > 0) |
| | | // { |
| | | // // 画人脸框 |
| | | // FaceDraw.draw_rects(ref cv_rgb, face_size, box_info); |
| | | // } |
| | | // rgb_win.ShowImage(cv_rgb); |
| | | // depth_win.ShowImage(depth_img); |
| | | // Cv2.WaitKey(1); |
| | | // depth_img.Release(); |
| | | // } |
| | | // Marshal.FreeHGlobal(ptT); |
| | | // cv_rgb.Release(); |
| | | // cv_depth.Release(); |
| | | // Cv2.DestroyWindow("rgb"); |
| | | // Cv2.DestroyWindow("depth"); |
| | | // OrbeCamera.orbe_release(porbe); |
| | | // return true; |
| | | // } |
| | | |
| | | public void test_rgb_ir_liveness_check_by_opencv() |
| | | { |
| | | rgb_ir_liveness_check_mat(); |
| | | } |
| | | // public void test_rgb_ir_liveness_check_by_opencv() |
| | | // { |
| | | // rgb_ir_liveness_check_mat(); |
| | | // } |
| | | |
| | | // 双目RGB和DEPTH静默活体检测,适配奥比中光海燕等双目摄像头 |
| | | public void test_rgb_depth_liveness_check_by_orbe() |
| | | { |
| | | rgb_depth_liveness_check_orbe(); |
| | | } |
| | | // // 双目RGB和DEPTH静默活体检测,适配奥比中光海燕等双目摄像头 |
| | | // public void test_rgb_depth_liveness_check_by_orbe() |
| | | // { |
| | | // rgb_depth_liveness_check_orbe(); |
| | | // } |
| | | |
| | | // 双目摄像头进行rgb,depth活体检测(此处适配了华杰艾米的双目摄像头) |
| | | public void test_rgb_depth_liveness_check_by_hjimi() |
| | | { |
| | | rgb_depth_liveness_check_hjimi(); |
| | | } |
| | | } |
| | | } |
| | | // // 双目摄像头进行rgb,depth活体检测(此处适配了华杰艾米的双目摄像头) |
| | | // public void test_rgb_depth_liveness_check_by_hjimi() |
| | | // { |
| | | // rgb_depth_liveness_check_hjimi(); |
| | | // } |
| | | // } |
| | | //} |