//using System; //using System.Runtime.InteropServices; //using System.Collections.Generic; //using OpenCvSharp; //// 人脸跟踪 //namespace FaceAI //{ // // 人脸跟踪配置结构体 // [StructLayout(LayoutKind.Sequential, Pack = 1)] // struct BDFaceTrackConf // { // public float detect_intv_before_track; // 未跟踪到人脸前的检测时间间隔 // public float detect_intv_during_track; // 已跟踪到人脸后的检测时间间隔 // }; // [StructLayout(LayoutKind.Sequential, Pack = 1)] // public struct BDFaceBBox // { // public int index; // 人脸索引值 // public float center_x; // 人脸中心点x坐标 // public float center_y; // 人脸中心点y坐标 // public float width; // 人脸宽度 // public float height; // 人脸高度 // public float score; // 人脸置信度 // } // [StructLayout(LayoutKind.Sequential, Pack = 1)] // public struct BDFaceLandmark // { // public int index; // 人脸关键点索引值 // public int size; // 人脸关键点数量 // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 144)] // public float[] data;// = new float[144]; // public float score; // 人脸关键点置信度 // } // [StructLayout(LayoutKind.Sequential, Pack = 1)] // public struct BDFaceTrackInfo // { // public int face_id; // [MarshalAs(UnmanagedType.Struct)] // public BDFaceBBox box; // [MarshalAs(UnmanagedType.Struct)] // public BDFaceLandmark landmark; // } // // 人脸跟踪 // class FaceTrack // { // [DllImport("BaiduFaceApi.dll", EntryPoint = "track", CharSet = CharSet.Ansi // , CallingConvention = CallingConvention.Cdecl)] // // type 为0时候执行RGB人脸跟踪,1时候执行NIR人脸跟踪 // public static extern int track(IntPtr ptr, IntPtr mat, int type); // [DllImport("BaiduFaceApi.dll", EntryPoint = "clear_track_history", CharSet = CharSet.Ansi // , CallingConvention = CallingConvention.Cdecl)] // // type 为0时候执行RGB人脸跟踪,1时候执行NIR人脸跟踪 // public static extern void clear_track_history(int type); // // 测试人脸跟踪 // public void image_track() // { // Console.WriteLine("test_track"); // int max_track_num = 50; // 设置最多检测跟踪人数(多人脸检测),默认为1,最多可设为50 // BDFaceTrackInfo[] track_info = new BDFaceTrackInfo[max_track_num]; // for (int i = 0; i < max_track_num; i++) // { // track_info[i] = new BDFaceTrackInfo(); // track_info[i].box = new BDFaceBBox(); // track_info[i].box.score = 0; // track_info[i].box.width = 0; // track_info[i].landmark.data = new float[144]; // track_info[i].face_id = 0; // } // int sizeTrack = Marshal.SizeOf(typeof(BDFaceTrackInfo)); // IntPtr ptT = Marshal.AllocHGlobal(sizeTrack * max_track_num); // Mat mat = Cv2.ImRead("../images/2.jpg"); // // faceNum为返回的检测到的人脸个数 // int type = 0; // int faceNum = track(ptT, mat.CvPtr, type); // Console.WriteLine("faceSize is:" + faceNum); // // 因为需预分配内存,所以返回的人脸数若大于预先分配的内存数,则仅仅显示预分配的人脸数 // if (faceNum > max_track_num) // { // faceNum = max_track_num; // } // for (int index = 0; index < faceNum; index++) { // IntPtr ptr = new IntPtr(); // if (8 == IntPtr.Size) // { // ptr = (IntPtr)(ptT.ToInt64() + sizeTrack * index); // } // else if (4 == IntPtr.Size) // { // ptr = (IntPtr)(ptT.ToInt32() + sizeTrack * index); // } // track_info[index] = (BDFaceTrackInfo)Marshal.PtrToStructure(ptr, typeof(BDFaceTrackInfo)); // Console.WriteLine("track face_id is {0}:", track_info[index].face_id); // Console.WriteLine("track landmarks is:"); // for(int i = 0; i < 144; i++) // { // Console.WriteLine("lanmark data is {0}:", track_info[index].landmark.data[i]); // } // Console.WriteLine("track landmarks score is:{0}", track_info[index].landmark.score); // Console.WriteLine("track landmarks index is:{0}", track_info[index].landmark.index); // // 索引值 // Console.WriteLine("track score is:{0}", track_info[index].box.index); // // 置信度 // Console.WriteLine("track score is:{0}", track_info[index].box.score); // // 人脸宽度 // Console.WriteLine("track mWidth is:{0}", track_info[index].box.width); // // 中心点X,Y坐标 // Console.WriteLine("track mCenter_x is:{0}", track_info[index].box.center_x); // Console.WriteLine("track mCenter_y is:{0}", track_info[index].box.center_y); // } // // 画人脸框 // FaceDraw.draw_rects(ref mat, faceNum, track_info); // // 图片画框保存 // mat.ImWrite("track.jpg"); // Marshal.FreeHGlobal(ptT); // } // //usb摄像头实时人脸检测示例 // public void usb_video_track() // { // // 默认电脑自带摄像头,device可能为0,若外接usb摄像头,则device可能为1. // int dev = 0; // using (var window = new Window("face")) // using (VideoCapture cap = VideoCapture.FromCamera(dev)) // { // if (!cap.IsOpened()) // { // Console.WriteLine("open camera error"); // return; // } // // Frame image buffer // Mat image = new Mat(); // // When the movie playback reaches end, Mat.data becomes NULL. // while (true) // { // cap.Read(image); // same as cvQueryFrame // if (!image.Empty()) // { // int ilen = 10;//传入的人脸数 // BDFaceTrackInfo[] track_info = new BDFaceTrackInfo[ilen]; // for (int i = 0; i < ilen; i++) // { // track_info[i].box = new BDFaceBBox(); // track_info[i].box.score = 0; // track_info[i].box.width = 0; // track_info[i].landmark.data = new float[144]; // track_info[i].face_id = 0; // } // int sizeTrack = Marshal.SizeOf(typeof(BDFaceTrackInfo)); // IntPtr ptT = Marshal.AllocHGlobal(sizeTrack* ilen); // //Cv2.ImWrite("usb_track_Cv2.jpg", image); // /* trackMat // * 传入参数: maxTrackObjNum:检测到的最大人脸数,传入外部分配人脸数,需要分配对应的内存大小。 // * 传出检测到的最大人脸数 // * 返回值: 传入的人脸数 和 检测到的人脸数 中的最小值,实际返回的人脸。 // ****/ // int faceSize = ilen;//返回人脸数 分配人脸数和检测到人脸数的最小值 // int curSize = ilen;//当前人脸数 输入分配的人脸数,输出实际检测到的人脸数 // int type = 0; // faceSize = track(ptT, image.CvPtr, type); // for (int index = 0; index < faceSize; index++) // { // IntPtr ptr = new IntPtr(); // if( 8 == IntPtr.Size) // { // ptr = (IntPtr)(ptT.ToInt64() + sizeTrack * index); // } // else if(4 == IntPtr.Size) // { // ptr = (IntPtr)(ptT.ToInt32() + sizeTrack * index); // } // track_info[index] = (BDFaceTrackInfo)Marshal.PtrToStructure(ptr, typeof(BDFaceTrackInfo)); // //face_info[index] = (BDFaceBBox)Marshal.PtrToStructure(info_ptr, typeof(BDFaceBBox)); // Console.WriteLine("in Liveness::usb_track face_id is {0}:",track_info[index].face_id); // Console.WriteLine("in Liveness::usb_track landmarks is:"); // Console.WriteLine("in Liveness::usb_track score is:{0:f}", track_info[index].box.score); // // 人脸宽度 // Console.WriteLine("in Liveness::usb_track mWidth is:{0:f}", track_info[index].box.width); // // 中心点X,Y坐标 // Console.WriteLine("in Liveness::usb_track mCenter_x is:{0:f}", track_info[index].box.center_x); // Console.WriteLine("in Liveness::usb_track mCenter_y is:{0:f}", track_info[index].box.center_y); // } // FaceDraw.draw_rects(ref image, faceSize, track_info); // // FaceDraw.draw_shape(ref image, faceSize, track_info); // Marshal.FreeHGlobal(ptT); // window.ShowImage(image); // Cv2.WaitKey(1); // Console.WriteLine("mat not empty"); // } // else // { // Console.WriteLine("mat is empty"); // } // } // } // } // // 清除跟踪的人脸信息 // public void test_clear_tracked_faces() // { // int type = 0; // clear_track_history(type); // Console.WriteLine("after clear tracked faces"); // } // } // }