qiuyao
2025-04-28 bb7f59a301a390e04443fa4745bd2afa1fa58e0f
人脸识别离线SDK
已修改10个文件
已添加14个文件
3671 ■■■■ 文件已修改
项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json 976 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/BaiDuFaceHelper.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/DevEnum.cs 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/Face.cs 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceAttr.cs 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceCompare.cs 781 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceDraw.cs 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceFeature.cs 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceLiveness.cs 548 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceManager.cs 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceTrack.cs 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FileUtil.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/HjimiCamera.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/ImageUtil.cs 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/OrbeCamera.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/TimeUtil.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/ISys_UserService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserService.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_TelescopicService/WIDESEAWCS_TelescopicService.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json
@@ -1,206 +1,62 @@
{
  "Version": 1,
  "WorkspaceRootPath": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\",
  "WorkspaceRootPath": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\ssg\\alarmresetjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\ssg\\alarmresetjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|e:\\\u9879\u76EE\u6E90\u7801\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_common\\faceai\\face.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\faceai\\face.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\ssg\\ssgonejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\ssg\\ssgonejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\ssg\\ssgtwojob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\ssg\\ssgtwojob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{A14242DD-DA06-4DC3-8598-1761AA7C76D1}|WIDESEAWCS_SystemServices\\WIDESEAWCS_SystemServices.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_systemservices\\sys_userservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{A14242DD-DA06-4DC3-8598-1761AA7C76D1}|WIDESEAWCS_SystemServices\\WIDESEAWCS_SystemServices.csproj|solutionrelative:wideseawcs_systemservices\\sys_userservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u9879\u76EE\u6E90\u7801\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\filter\\autofacpropertitymodulereg.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\filter\\autofacpropertitymodulereg.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\telescopic\\alarmresethsycontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\telescopic\\alarmresethsycontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\telescopic\\facerecognitioncontroller .cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\telescopic\\facerecognitioncontroller .cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_model\\models\\telescopic\\dt_alarmresethsy.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\telescopic\\dt_alarmresethsy.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_telescopicservice\\alarmresethsyserver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|solutionrelative:wideseawcs_telescopicservice\\alarmresethsyserver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_itelescopicservice\\ialarmresethsyserver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|solutionrelative:wideseawcs_itelescopicservice\\ialarmresethsyserver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_telescopicservice\\facerecognitionserver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|solutionrelative:wideseawcs_telescopicservice\\facerecognitionserver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_itelescopicservice\\imaintenanceteamservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|solutionrelative:wideseawcs_itelescopicservice\\imaintenanceteamservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_telescopicservice\\maintenanceteamservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|solutionrelative:wideseawcs_telescopicservice\\maintenanceteamservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_telescopicservice\\parametersservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|solutionrelative:wideseawcs_telescopicservice\\parametersservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\telescopic\\parameterscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\telescopic\\parameterscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_model\\models\\telescopic\\dt_parameters.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\telescopic\\dt_parameters.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\wideseawcs_tasks.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\wideseawcs_tasks.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\telescopic\\loginhsycontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\telescopic\\loginhsycontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_itelescopicservice\\ifacerecognitionserver .cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|solutionrelative:wideseawcs_itelescopicservice\\ifacerecognitionserver .cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_model\\models\\telescopic\\dt_facerecognition.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\telescopic\\dt_facerecognition.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_model\\models\\telescopic\\dt_maintenance.cs||{8B382828-6202-11D1-8870-0000F87579D2}",
      "RelativeMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\telescopic\\dt_maintenance.cs||{8B382828-6202-11D1-8870-0000F87579D2}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\oht\\ohtjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\oht\\ohtjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\oht\\ohtenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\oht\\ohtenum.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_itelescopicservice\\iparametersservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|solutionrelative:wideseawcs_itelescopicservice\\iparametersservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_itelescopicservice\\imaintenanceservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|solutionrelative:wideseawcs_itelescopicservice\\imaintenanceservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_itelescopicservice\\iloginhsyservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{4784950F-D89F-4F0A-9FFD-E8F44589AC2A}|WIDESEAWCS_ITelescopicService\\WIDESEAWCS_ITelescopicService.csproj|solutionrelative:wideseawcs_itelescopicservice\\iloginhsyservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{B17BAF3C-2BAD-4162-B6DC-46ED7A1E3D8D}|WIDESEAWCS_WMSPart\\WIDESEAWCS_WMSPart.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_wmspart\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{B17BAF3C-2BAD-4162-B6DC-46ED7A1E3D8D}|WIDESEAWCS_WMSPart\\WIDESEAWCS_WMSPart.csproj|solutionrelative:wideseawcs_wmspart\\locationinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{B17BAF3C-2BAD-4162-B6DC-46ED7A1E3D8D}|WIDESEAWCS_WMSPart\\WIDESEAWCS_WMSPart.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_wmspart\\stockinfodetailservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{B17BAF3C-2BAD-4162-B6DC-46ED7A1E3D8D}|WIDESEAWCS_WMSPart\\WIDESEAWCS_WMSPart.csproj|solutionrelative:wideseawcs_wmspart\\stockinfodetailservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{B17BAF3C-2BAD-4162-B6DC-46ED7A1E3D8D}|WIDESEAWCS_WMSPart\\WIDESEAWCS_WMSPart.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_wmspart\\stockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{B17BAF3C-2BAD-4162-B6DC-46ED7A1E3D8D}|WIDESEAWCS_WMSPart\\WIDESEAWCS_WMSPart.csproj|solutionrelative:wideseawcs_wmspart\\stockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_telescopicservice\\loginhsyservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|solutionrelative:wideseawcs_telescopicservice\\loginhsyservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\wmspart\\locationinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\wmspart\\locationinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|solutionrelative:wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_taskinfoservice\\taskhtyservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|solutionrelative:wideseawcs_taskinfoservice\\taskhtyservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_taskinfoservice\\taskexecutedetailservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|solutionrelative:wideseawcs_taskinfoservice\\taskexecutedetailservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7279A2AE-8D1F-4E66-A73A-01AF7927A336}|WIDESEAWCS_ITaskInfoService\\WIDESEAWCS_ITaskInfoService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_itaskinfoservice\\itaskhtyservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7279A2AE-8D1F-4E66-A73A-01AF7927A336}|WIDESEAWCS_ITaskInfoService\\WIDESEAWCS_ITaskInfoService.csproj|solutionrelative:wideseawcs_itaskinfoservice\\itaskhtyservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7279A2AE-8D1F-4E66-A73A-01AF7927A336}|WIDESEAWCS_ITaskInfoService\\WIDESEAWCS_ITaskInfoService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_itaskinfoservice\\itaskexecutedetailservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7279A2AE-8D1F-4E66-A73A-01AF7927A336}|WIDESEAWCS_ITaskInfoService\\WIDESEAWCS_ITaskInfoService.csproj|solutionrelative:wideseawcs_itaskinfoservice\\itaskexecutedetailservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\gzj\\gzjjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\gzj\\gzjjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\quartzjob\\deviceinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\quartzjob\\deviceinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\system\\batchcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\system\\batchcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9E4BFF47-52BF-4FD8-9CC7-3763BF19D9E0}|WIDESEAWCS_ISystemServices\\WIDESEAWCS_ISystemServices.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_isystemservices\\isys_userservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9E4BFF47-52BF-4FD8-9CC7-3763BF19D9E0}|WIDESEAWCS_ISystemServices\\WIDESEAWCS_ISystemServices.csproj|solutionrelative:wideseawcs_isystemservices\\isys_userservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\system\\sys_usercontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\system\\sys_usercontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_telescopicservice\\maintenanceservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|solutionrelative:wideseawcs_telescopicservice\\maintenanceservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|e:\\\u9879\u76EE\u6E90\u7801\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_common\\faceai\\faceattr.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\faceai\\faceattr.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\telescopic\\maintenancecontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\telescopic\\maintenancecontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|e:\\\u9879\u76EE\u6E90\u7801\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_common\\faceai\\facecompare.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\faceai\\facecompare.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\controllers\\telescopic\\maintenanceteamcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\telescopic\\maintenanceteamcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|e:\\\u9879\u76EE\u6E90\u7801\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_common\\faceai\\facemanager.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\faceai\\facemanager.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_dto\\telescopic\\paginationdto.cs||{8B382828-6202-11D1-8870-0000F87579D2}",
      "RelativeMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|solutionrelative:wideseawcs_dto\\telescopic\\paginationdto.cs||{8B382828-6202-11D1-8870-0000F87579D2}"
      "AbsoluteMoniker": "D:0:0:{A14242DD-DA06-4DC3-8598-1761AA7C76D1}|WIDESEAWCS_SystemServices\\WIDESEAWCS_SystemServices.csproj|E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\wideseawcs_systemservices\\sys_userservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{A14242DD-DA06-4DC3-8598-1761AA7C76D1}|WIDESEAWCS_SystemServices\\WIDESEAWCS_SystemServices.csproj|solutionrelative:wideseawcs_systemservices\\sys_userservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_model\\models\\telescopic\\dt_loginhsy.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\telescopic\\dt_loginhsy.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\wideseawcs_server\\controllers\\system\\sys_usercontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\controllers\\system\\sys_usercontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_dto\\system\\adduserdto.cs||{8B382828-6202-11D1-8870-0000F87579D2}",
      "RelativeMoniker": "D:0:0:{C2D3D138-9109-481B-8BEB-A27597890B2C}|WIDESEAWCS_DTO\\WIDESEAWCS_DTO.csproj|solutionrelative:wideseawcs_dto\\system\\adduserdto.cs||{8B382828-6202-11D1-8870-0000F87579D2}"
      "AbsoluteMoniker": "D:0:0:{9E4BFF47-52BF-4FD8-9CC7-3763BF19D9E0}|WIDESEAWCS_ISystemServices\\WIDESEAWCS_ISystemServices.csproj|E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\wideseawcs_isystemservices\\isys_userservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9E4BFF47-52BF-4FD8-9CC7-3763BF19D9E0}|WIDESEAWCS_ISystemServices\\WIDESEAWCS_ISystemServices.csproj|solutionrelative:wideseawcs_isystemservices\\isys_userservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\\u4F38\u7F29\u6746\\shensuogankongzhi\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_model\\models\\system\\sys_user.cs||{8B382828-6202-11D1-8870-0000F87579D2}",
      "RelativeMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\system\\sys_user.cs||{8B382828-6202-11D1-8870-0000F87579D2}"
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\wideseawcs_common\\baidufacehelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\baidufacehelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\wideseawcs_telescopicservice\\parametersservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|solutionrelative:wideseawcs_telescopicservice\\parametersservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\wideseawcs_telescopicservice\\facerecognitionserver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{1B1C16CA-8989-4590-BAF6-B55DCC330218}|WIDESEAWCS_TelescopicService\\WIDESEAWCS_TelescopicService.csproj|solutionrelative:wideseawcs_telescopicservice\\facerecognitionserver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\wideseawcs_common\\faceai\\imageutil.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\faceai\\imageutil.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\wideseawcs_common\\faceai\\facetrack.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}|WIDESEAWCS_Common\\WIDESEAWCS_Common.csproj|solutionrelative:wideseawcs_common\\faceai\\facetrack.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -210,612 +66,242 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 1,
          "SelectedChildIndex": 18,
          "Children": [
            {
              "$type": "Bookmark",
              "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
              "Name": "ST:131:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:132:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:12:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:17:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:0:0:{65ddf8c3-8f89-4077-a6c6-dbb8853aab13}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:133:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:129:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:129:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:130:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:135:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:136:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:134:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "Program.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Program.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Program.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Program.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Program.cs",
              "ViewState": "AQIAAGoAAAAAAAAAAAAAAHYAAAATAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-28T03:53:12.871Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "FaceAttr.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\FaceAttr.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\FaceAI\\FaceAttr.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\FaceAttr.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\FaceAI\\FaceAttr.cs",
              "ViewState": "AQIAAAAAAAAAAAAAAADwvwAAAAAAAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-28T03:50:04.487Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "FaceManager.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\FaceManager.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\FaceAI\\FaceManager.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\FaceManager.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\FaceAI\\FaceManager.cs",
              "ViewState": "AQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-28T03:49:54.229Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "AlarmResetJob.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\SSG\\AlarmResetJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\SSG\\AlarmResetJob.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\SSG\\AlarmResetJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\SSG\\AlarmResetJob.cs",
              "ViewState": "AgIAABAAAAAAAAAAAAAAwBsAAAAAAAAAAAAAAA==",
              "Title": "Face.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\Face.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\FaceAI\\Face.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\Face.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\FaceAI\\Face.cs",
              "ViewState": "AQIAACkAAAAAAAAAAAAYwEEAAAArAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-25T03:40:57.559Z",
              "WhenOpened": "2025-04-28T03:49:48.428Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "SSGTwoJob.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\SSG\\SSGTwoJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\SSG\\SSGTwoJob.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\SSG\\SSGTwoJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\SSG\\SSGTwoJob.cs",
              "ViewState": "AgIAABsAAAAAAAAAAADwvx0AAAAEAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-25T03:27:19.551Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 10,
              "Title": "IAlarmResetHsyServer.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\IAlarmResetHsyServer.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ITelescopicService\\IAlarmResetHsyServer.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\IAlarmResetHsyServer.cs",
              "RelativeToolTip": "WIDESEAWCS_ITelescopicService\\IAlarmResetHsyServer.cs",
              "ViewState": "AgIAAAMAAAAAAAAAAADwvxMAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-25T06:40:30.15Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "Program.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Program.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Program.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Program.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Program.cs",
              "ViewState": "AgIAAHcAAAAAAAAAAAAiwJYAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-25T06:16:10.763Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "SSGOneJob.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\SSG\\SSGOneJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\SSG\\SSGOneJob.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\SSG\\SSGOneJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\SSG\\SSGOneJob.cs",
              "ViewState": "AgIAABIAAAAAAAAAAAAAACcAAAA3AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-25T03:27:13.297Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "Sys_UserService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_SystemServices\\Sys_UserService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_SystemServices\\Sys_UserService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_SystemServices\\Sys_UserService.cs",
              "RelativeToolTip": "WIDESEAWCS_SystemServices\\Sys_UserService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAWAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T09:19:43.403Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "AutofacPropertityModuleReg.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Filter\\AutofacPropertityModuleReg.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Filter\\AutofacPropertityModuleReg.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Filter\\AutofacPropertityModuleReg.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Filter\\AutofacPropertityModuleReg.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAJAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-25T08:52:15.117Z"
              "Title": "appsettings.json",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\appsettings.json",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\appsettings.json",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\appsettings.json",
              "RelativeToolTip": "WIDESEAWCS_Server\\appsettings.json",
              "ViewState": "AQIAAAoAAAAAAAAAAAAAABEAAAAYAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
              "WhenOpened": "2025-04-27T02:51:42.502Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "FaceRecognitionController .cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\FaceRecognitionController .cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\Telescopic\\FaceRecognitionController .cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\FaceRecognitionController .cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\Telescopic\\FaceRecognitionController .cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAABVAAAAAAAAAA==",
              "Title": "Sys_UserController.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\System\\Sys_UserController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\System\\Sys_UserController.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\System\\Sys_UserController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\System\\Sys_UserController.cs",
              "ViewState": "AQIAABQAAAAAAAAAAAAAACMAAAAmAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-16T02:30:26.795Z"
              "WhenOpened": "2025-04-27T02:48:46.616Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "ISys_UserService.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ISystemServices\\ISys_UserService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ISystemServices\\ISys_UserService.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ISystemServices\\ISys_UserService.cs",
              "RelativeToolTip": "WIDESEAWCS_ISystemServices\\ISys_UserService.cs",
              "ViewState": "AQIAADgAAAAAAAAAAAAiwE4AAAAIAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-27T02:47:49.281Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "FaceCompare.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\FaceCompare.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\FaceAI\\FaceCompare.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\FaceCompare.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\FaceAI\\FaceCompare.cs",
              "ViewState": "AQIAAAkAAAAAAAAAAAAlwBgAAAAWAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-27T02:39:43.91Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "Sys_UserService.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_SystemServices\\Sys_UserService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_SystemServices\\Sys_UserService.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_SystemServices\\Sys_UserService.cs",
              "RelativeToolTip": "WIDESEAWCS_SystemServices\\Sys_UserService.cs",
              "ViewState": "AQIAAAsBAAAAAAAAAAAgwBgBAAAYAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-27T02:32:59.781Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 10,
              "Title": "ParametersService.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\ParametersService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TelescopicService\\ParametersService.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\ParametersService.cs",
              "RelativeToolTip": "WIDESEAWCS_TelescopicService\\ParametersService.cs",
              "ViewState": "AQIAAFMAAAAAAAAAAAAUwAAAAAAAAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-27T02:32:42.77Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 11,
              "Title": "FaceRecognitionServer.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\FaceRecognitionServer.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\FaceRecognitionServer.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TelescopicService\\FaceRecognitionServer.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\FaceRecognitionServer.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\FaceRecognitionServer.cs",
              "RelativeToolTip": "WIDESEAWCS_TelescopicService\\FaceRecognitionServer.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
              "ViewState": "AQIAAAAAAAAAAAAAAAAAABIAAAAAAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-08T03:12:20.085Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "AlarmResetHsyController.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\AlarmResetHsyController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\Telescopic\\AlarmResetHsyController.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\AlarmResetHsyController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\Telescopic\\AlarmResetHsyController.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAiAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-25T06:42:50.119Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 8,
              "Title": "Dt_AlarmResetHsy.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\Telescopic\\Dt_AlarmResetHsy.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\Telescopic\\Dt_AlarmResetHsy.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\Telescopic\\Dt_AlarmResetHsy.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\Telescopic\\Dt_AlarmResetHsy.cs",
              "ViewState": "AgIAAAwAAAAAAAAAAADwvw8AAAAjAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-25T06:21:18.958Z"
              "WhenOpened": "2025-04-27T02:32:36.39Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 9,
              "Title": "AlarmResetHsyServer.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\AlarmResetHsyServer.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TelescopicService\\AlarmResetHsyServer.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\AlarmResetHsyServer.cs",
              "RelativeToolTip": "WIDESEAWCS_TelescopicService\\AlarmResetHsyServer.cs",
              "ViewState": "AgIAABIAAAAAAAAAAAAQwB8AAAAsAAAAAAAAAA==",
              "Title": "BaiDuFaceHelper.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\BaiDuFaceHelper.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\BaiDuFaceHelper.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\BaiDuFaceHelper.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\BaiDuFaceHelper.cs",
              "ViewState": "AQIAAAAAAAAAAAAAAAAuwAwAAAAgAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-25T06:40:56.943Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 12,
              "Title": "IMaintenanceTeamService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\IMaintenanceTeamService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ITelescopicService\\IMaintenanceTeamService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\IMaintenanceTeamService.cs",
              "RelativeToolTip": "WIDESEAWCS_ITelescopicService\\IMaintenanceTeamService.cs",
              "ViewState": "AgIAAAkAAAAAAAAAAAAswBYAAABOAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T08:57:55.497Z"
              "WhenOpened": "2025-04-27T02:31:43.641Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 13,
              "Title": "MaintenanceTeamService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\MaintenanceTeamService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TelescopicService\\MaintenanceTeamService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\MaintenanceTeamService.cs",
              "RelativeToolTip": "WIDESEAWCS_TelescopicService\\MaintenanceTeamService.cs",
              "ViewState": "AgIAABAAAAAAAAAAAAAywB4AAAASAAAAAAAAAA==",
              "Title": "FaceTrack.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\FaceTrack.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\FaceAI\\FaceTrack.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\FaceTrack.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\FaceAI\\FaceTrack.cs",
              "ViewState": "AQIAAAAAAAAAAAAAAAAAAAYAAAAQAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T08:11:35.284Z"
              "WhenOpened": "2025-04-27T02:23:48.682Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 14,
              "Title": "ParametersService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\ParametersService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TelescopicService\\ParametersService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\ParametersService.cs",
              "RelativeToolTip": "WIDESEAWCS_TelescopicService\\ParametersService.cs",
              "ViewState": "AgIAABEAAAAAAAAAAAAQwEQAAAAAAAAAAAAAAA==",
              "DocumentIndex": 12,
              "Title": "ImageUtil.cs",
              "DocumentMoniker": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\ImageUtil.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Common\\FaceAI\\ImageUtil.cs",
              "ToolTip": "E:\\\u9879\u76EE\u6E90\u7801\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\FaceAI\\ImageUtil.cs",
              "RelativeToolTip": "WIDESEAWCS_Common\\FaceAI\\ImageUtil.cs",
              "ViewState": "AQIAAC0AAAAAAAAAAAAIwEIAAAALAAAA",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-08T00:57:10.872Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 15,
              "Title": "ParametersController.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\ParametersController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\Telescopic\\ParametersController.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\ParametersController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\Telescopic\\ParametersController.cs",
              "ViewState": "AgIAAA4AAAAAAAAAAAAAwCkAAAAlAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-16T02:28:53.873Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 16,
              "Title": "Dt_Parameters.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Parameters.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Parameters.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Parameters.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Parameters.cs",
              "ViewState": "AgIAAAsAAAAAAAAAAAAwwAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-11T02:21:27.75Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 17,
              "Title": "WIDESEAWCS_Tasks.csproj",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAABCAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
              "WhenOpened": "2025-04-25T07:09:10.764Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 18,
              "Title": "LoginhsyController.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\LoginhsyController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\Telescopic\\LoginhsyController.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\LoginhsyController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\Telescopic\\LoginhsyController.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAABYAAAAQAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T09:00:37.146Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 20,
              "Title": "Dt_FaceRecognition.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\Telescopic\\Dt_FaceRecognition.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\Telescopic\\Dt_FaceRecognition.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\Telescopic\\Dt_FaceRecognition.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\Telescopic\\Dt_FaceRecognition.cs",
              "ViewState": "AgIAAAYAAAAAAAAAAADwvxcAAAAGAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-11T02:21:29.966Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 21,
              "Title": "Dt_Maintenance.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Maintenance.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Maintenance.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Maintenance.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Maintenance.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAsAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-09T02:16:51.887Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 19,
              "Title": "IFaceRecognitionServer .cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\IFaceRecognitionServer .cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ITelescopicService\\IFaceRecognitionServer .cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\IFaceRecognitionServer .cs",
              "RelativeToolTip": "WIDESEAWCS_ITelescopicService\\IFaceRecognitionServer .cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwsAAAAlAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T08:20:24.254Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 22,
              "Title": "OHTJob.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\OHT\\OHTJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\OHT\\OHTJob.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\OHT\\OHTJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\OHT\\OHTJob.cs",
              "ViewState": "AgIAAC0BAAAAAAAAAAAkwAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-25T03:39:57.683Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 24,
              "Title": "IParametersService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\IParametersService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ITelescopicService\\IParametersService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\IParametersService.cs",
              "RelativeToolTip": "WIDESEAWCS_ITelescopicService\\IParametersService.cs",
              "ViewState": "AgIAAA4AAAAAAAAAAAAIwB4AAAAMAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-08T02:55:53.764Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 25,
              "Title": "IMaintenanceService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\IMaintenanceService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ITelescopicService\\IMaintenanceService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\IMaintenanceService.cs",
              "RelativeToolTip": "WIDESEAWCS_ITelescopicService\\IMaintenanceService.cs",
              "ViewState": "AgIAABsAAAAAAAAAAAAswDsAAAAhAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T08:20:27.319Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 23,
              "Title": "OHTEnum.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\OHT\\OHTEnum.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\OHT\\OHTEnum.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\OHT\\OHTEnum.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\OHT\\OHTEnum.cs",
              "ViewState": "AgIAAEAAAAAAAAAAAAAQwAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-16T02:29:35.57Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 26,
              "Title": "ILoginhsyService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\ILoginhsyService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ITelescopicService\\ILoginhsyService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITelescopicService\\ILoginhsyService.cs",
              "RelativeToolTip": "WIDESEAWCS_ITelescopicService\\ILoginhsyService.cs",
              "ViewState": "AgIAAAkAAAAAAAAAAAAAABUAAABBAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T08:20:25.166Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 27,
              "Title": "LocationInfoService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_WMSPart\\LocationInfoService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_WMSPart\\LocationInfoService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_WMSPart\\LocationInfoService.cs",
              "RelativeToolTip": "WIDESEAWCS_WMSPart\\LocationInfoService.cs",
              "ViewState": "AgIAAKYAAAAAAAAAAAAmwK8AAAANAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-21T07:03:59.4Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 29,
              "Title": "StockInfoService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_WMSPart\\StockInfoService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_WMSPart\\StockInfoService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_WMSPart\\StockInfoService.cs",
              "RelativeToolTip": "WIDESEAWCS_WMSPart\\StockInfoService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-21T07:03:53.753Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 28,
              "Title": "StockInfoDetailService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_WMSPart\\StockInfoDetailService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_WMSPart\\StockInfoDetailService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_WMSPart\\StockInfoDetailService.cs",
              "RelativeToolTip": "WIDESEAWCS_WMSPart\\StockInfoDetailService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-21T07:03:57.358Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 31,
              "Title": "LocationInfoController.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\WMSPart\\LocationInfoController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\WMSPart\\LocationInfoController.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\WMSPart\\LocationInfoController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\WMSPart\\LocationInfoController.cs",
              "ViewState": "AgIAAAwAAAAAAAAAAADwvxIAAAATAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-21T05:44:52.618Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 32,
              "Title": "TaskService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-21T05:44:32.387Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 30,
              "Title": "LoginhsyService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\LoginhsyService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TelescopicService\\LoginhsyService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\LoginhsyService.cs",
              "RelativeToolTip": "WIDESEAWCS_TelescopicService\\LoginhsyService.cs",
              "ViewState": "AgIAABgAAAAAAAAAAABPwCoAAABHAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T08:45:18.979Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 33,
              "Title": "TaskhtyService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskhtyService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskhtyService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskhtyService.cs",
              "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskhtyService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-21T05:44:31.722Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 34,
              "Title": "TaskExecuteDetailService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskExecuteDetailService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskExecuteDetailService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskExecuteDetailService.cs",
              "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskExecuteDetailService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-21T05:44:30.802Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 35,
              "Title": "ITaskhtyService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITaskInfoService\\ITaskhtyService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ITaskInfoService\\ITaskhtyService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITaskInfoService\\ITaskhtyService.cs",
              "RelativeToolTip": "WIDESEAWCS_ITaskInfoService\\ITaskhtyService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-21T05:44:28.126Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 36,
              "Title": "ITaskExecuteDetailService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITaskInfoService\\ITaskExecuteDetailService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ITaskInfoService\\ITaskExecuteDetailService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ITaskInfoService\\ITaskExecuteDetailService.cs",
              "RelativeToolTip": "WIDESEAWCS_ITaskInfoService\\ITaskExecuteDetailService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-21T05:44:25.811Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 38,
              "Title": "DeviceInfoController.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\QuartzJob\\DeviceInfoController.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAABAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-16T02:32:15.164Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 37,
              "Title": "GZJJob.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\GZJ\\GZJJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\GZJ\\GZJJob.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\GZJ\\GZJJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\GZJ\\GZJJob.cs",
              "ViewState": "AgIAAB4AAAAAAAAAAABIwAAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-16T02:29:23.036Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 44,
              "Title": "MaintenanceController.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\MaintenanceController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\Telescopic\\MaintenanceController.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\MaintenanceController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\Telescopic\\MaintenanceController.cs",
              "ViewState": "AgIAAEEAAAAAAAAAAAAcwFUAAAAzAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T09:02:48.767Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 39,
              "Title": "BatchController.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\System\\BatchController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\System\\BatchController.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\System\\BatchController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\System\\BatchController.cs",
              "ViewState": "AgIAACEAAAAAAAAAAAAcwC0AAAAWAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T08:13:37.986Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 48,
              "Title": "AddUserDTO.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_DTO\\System\\AddUserDTO.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_DTO\\System\\AddUserDTO.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_DTO\\System\\AddUserDTO.cs",
              "RelativeToolTip": "WIDESEAWCS_DTO\\System\\AddUserDTO.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-11T03:39:28.112Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 41,
              "Title": "Sys_UserController.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\System\\Sys_UserController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\System\\Sys_UserController.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\System\\Sys_UserController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\System\\Sys_UserController.cs",
              "ViewState": "AgIAAN0AAAAAAAAAAABIwO8AAAAzAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-08T01:03:30.746Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 40,
              "Title": "ISys_UserService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ISystemServices\\ISys_UserService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_ISystemServices\\ISys_UserService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_ISystemServices\\ISys_UserService.cs",
              "RelativeToolTip": "WIDESEAWCS_ISystemServices\\ISys_UserService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAA2AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-08T01:02:33.62Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 49,
              "Title": "Sys_User.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\System\\Sys_User.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\System\\Sys_User.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\System\\Sys_User.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\System\\Sys_User.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-11T03:40:33.616Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 42,
              "Title": "appsettings.json",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\appsettings.json",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\appsettings.json",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\appsettings.json",
              "RelativeToolTip": "WIDESEAWCS_Server\\appsettings.json",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAoAAAAnAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
              "WhenOpened": "2025-04-09T08:11:07.528Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 43,
              "Title": "MaintenanceService.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\MaintenanceService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TelescopicService\\MaintenanceService.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TelescopicService\\MaintenanceService.cs",
              "RelativeToolTip": "WIDESEAWCS_TelescopicService\\MaintenanceService.cs",
              "ViewState": "AgIAAAEBAAAAAAAAAAAowEoBAABWAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T08:11:35.497Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 45,
              "Title": "MaintenanceTeamController.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\MaintenanceTeamController.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Controllers\\Telescopic\\MaintenanceTeamController.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Controllers\\Telescopic\\MaintenanceTeamController.cs",
              "RelativeToolTip": "WIDESEAWCS_Server\\Controllers\\Telescopic\\MaintenanceTeamController.cs",
              "ViewState": "AgIAAAcAAAAAAAAAAAAEwB4AAAAzAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-07T09:04:39.138Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 46,
              "Title": "PaginationDTO.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_DTO\\Telescopic\\PaginationDTO.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_DTO\\Telescopic\\PaginationDTO.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_DTO\\Telescopic\\PaginationDTO.cs",
              "RelativeToolTip": "WIDESEAWCS_DTO\\Telescopic\\PaginationDTO.cs",
              "ViewState": "AgIAAB0AAAAAAAAAAAAgwAgAAAARAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-08T02:27:59.467Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 47,
              "Title": "Dt_Loginhsy.cs",
              "DocumentMoniker": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Loginhsy.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Loginhsy.cs",
              "ToolTip": "E:\\\u4F38\u7F29\u6746\\ShenSuoGanKongZhi\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Loginhsy.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\Telescopic\\Dt_Loginhsy.cs",
              "ViewState": "AgIAABMAAAAAAAAAAAAiwCMAAABEAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-04-08T01:06:18.439Z"
              "WhenOpened": "2025-04-27T02:24:11.264Z"
            }
          ]
        }
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/BaiDuFaceHelper.cs
@@ -6,11 +6,13 @@
using System.Net;
using System.Text;
using System.Threading.Tasks;
using FaceAI;
namespace WIDESEAWCS_Common
{
    public class BaiDuFaceHelper
    {
        #region äººè„¸è¯†åˆ«API
        /// <summary>
        /// èŽ·å–AccessToken
        /// </summary>
@@ -62,7 +64,7 @@
            catch { return ""; }
        }
        /// <summary>
        /// äººè„¸æ£€æµ‹ä¸Žå±žæ€§åˆ†æž
        /// </summary>
@@ -76,7 +78,7 @@
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "POST";
            request.KeepAlive = true;
            String str = "{\"image\":\""+ imgbase64 + "\",\"image_type\":\"BASE64\"}";
            String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\"}";
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
@@ -101,7 +103,7 @@
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.KeepAlive = true;
            String str = "{\"group_id\":\""+ group + "\"}";
            String str = "{\"group_id\":\"" + group + "\"}";
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
@@ -172,7 +174,7 @@
            string result = reader.ReadToEnd();
            NLog.LogManager.GetCurrentClassLogger().Trace("人脸注册:" + result);
            CreateUserResult res= JsonConvert.DeserializeObject<CreateUserResult>(result);//需要将log_id和face_token保存到用户表中,在人脸删除中需要用到
            CreateUserResult res = JsonConvert.DeserializeObject<CreateUserResult>(result);//需要将log_id和face_token保存到用户表中,在人脸删除中需要用到
            return res;
        }
@@ -229,7 +231,7 @@
        /// äººè„¸æœç´¢
        /// </summary>
        /// <returns></returns>
        public static SearchResult FaceSearch(string path,string group_id_list)
        public static SearchResult FaceSearch(string path, string group_id_list)
        {
            string token = GetAccessToken();
            var imgbase64 = GetFileContentAsBase64(path);
@@ -239,7 +241,7 @@
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "POST";
            request.KeepAlive = true;
            String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\",\"group_id_list\":\""+ group_id_list + "\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}";
            String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\",\"group_id_list\":\"" + group_id_list + "\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}";
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
@@ -252,6 +254,7 @@
            return searchResult;
        }
        #endregion
    }
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/DevEnum.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
namespace FaceAI
{
    [ComVisible(false)]
    public class FilterCategory     // uuids.h  :  CLSID_*
    {
        /// <summary> CLSID_AudioInputDeviceCategory, audio capture category </summary>
        public static readonly Guid AudioInputDevice = new Guid(0x33d9a762, 0x90c8, 0x11d0, 0xbd, 0x43, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
        /// <summary> CLSID_VideoInputDeviceCategory, video capture category </summary>
        public static readonly Guid VideoInputDevice = new Guid(0x860BB310, 0x5D01, 0x11d0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86);
    }
    [ComVisible(false)]
    public class Clsid      // uuids.h  :  CLSID_*
    {
        /// <summary> CLSID_SystemDeviceEnum for ICreateDevEnum </summary>
        public static readonly Guid SystemDeviceEnum = new Guid(0x62BE5D10, 0x60EB, 0x11d0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86);
        /// <summary> CLSID_FilterGraph, filter Graph </summary>
        public static readonly Guid FilterGraph = new Guid(0xe436ebb3, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
        /// <summary> CLSID_CaptureGraphBuilder2, new Capture graph building </summary>
        public static readonly Guid CaptureGraphBuilder2 = new Guid(0xBF87B6E1, 0x8C27, 0x11d0, 0xB3, 0xF0, 0x0, 0xAA, 0x00, 0x37, 0x61, 0xC5);
        /// <summary> CLSID_SampleGrabber, Sample Grabber filter </summary>
        public static readonly Guid SampleGrabber = new Guid(0xC1F400A0, 0x3F08, 0x11D3, 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37);
        /// <summary> CLSID_DvdGraphBuilder,  DVD graph builder </summary>
        public static readonly Guid DvdGraphBuilder = new Guid(0xFCC152B7, 0xF372, 0x11d0, 0x8E, 0x00, 0x00, 0xC0, 0x4F, 0xD7, 0xC0, 0x8B);
    }
    [ComVisible(false)]
    public class DevEnum
    {
        public static bool GetDevicesOfCat(Guid cat, out ArrayList devs)
        {
            devs = null;
            int hr;
            object comObj = null;
            ICreateDevEnum enumDev = null;
            IEnumMoniker enumMon = null;
            IMoniker[] mon = new IMoniker[1];
            try
            {
                Type srvType = Type.GetTypeFromCLSID(Clsid.SystemDeviceEnum);
                if (srvType == null)
                    throw new NotImplementedException("System Device Enumerator");
                comObj = Activator.CreateInstance(srvType);
                enumDev = (ICreateDevEnum)comObj;
                hr = enumDev.CreateClassEnumerator(ref cat, out enumMon, 0);
                if (hr != 0)
                    throw new NotSupportedException("No devices of the category");
                int /*f, */count = 0;
                IntPtr ptr = new IntPtr();
                do
                {
                    hr = enumMon.Next(1, mon, ptr);
                    if ((hr != 0) || (mon[0] == null))
                        break;
                    DsDevice dev = new DsDevice();
                    GetFriendlyName(mon[0], ref dev.Name, ref dev.Path);
                    if (devs == null)
                        devs = new ArrayList();
                    dev.id = count;
                    dev.Mon = mon[0]; mon[0] = null;
                    devs.Add(dev); dev = null;
                    count++;
                }
                while (true);
                return count > 0;
            }
            catch (Exception)
            {
                if (devs != null)
                {
                    foreach (DsDevice d in devs)
                        d.Dispose();
                    devs = null;
                }
                return false;
            }
            finally
            {
                enumDev = null;
                if (mon[0] != null)
                    Marshal.ReleaseComObject(mon[0]); mon[0] = null;
                if (enumMon != null)
                    Marshal.ReleaseComObject(enumMon); enumMon = null;
                if (comObj != null)
                    Marshal.ReleaseComObject(comObj); comObj = null;
            }
        }
        private static bool GetFriendlyName(IMoniker mon, ref string devname, ref string devpath)
        {
            object bagObj = null;
            IPropertyBag bag = null;
            try
            {
                Guid bagId = typeof(IPropertyBag).GUID;
                mon.BindToStorage(null, null, ref bagId, out bagObj);
                bag = (IPropertyBag)bagObj;
                object val = "";
                int hr = bag.Read("Description", ref val, IntPtr.Zero);
                if(hr != 0)
                    hr = bag.Read("FriendlyName", ref val, IntPtr.Zero);
                if (hr != 0)
                    Marshal.ThrowExceptionForHR(hr);
                devname = val as string;
                if ((devname == null) || (devname.Length < 1))
                    throw new NotImplementedException("Device FriendlyName");
                val = "";
                hr = bag.Read("DevicePath", ref val, IntPtr.Zero);
                if (hr != 0)
                    Marshal.ThrowExceptionForHR(hr);
                devpath = val as string;
                if((devpath == null) || (devpath.Length < 1))
                    throw new NotImplementedException("Device Path");
                return true;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                bag = null;
                if (bagObj != null)
                    Marshal.ReleaseComObject(bagObj); bagObj = null;
            }
        }
    }
    [ComVisible(false)]
    public class DsDevice : IDisposable
    {
        public int id;
        public string Name;
        public string Path;
        public IMoniker Mon;
        public void Dispose()
        {
            if (Mon != null)
                Marshal.ReleaseComObject(Mon); Mon = null;
        }
    }
    [ComVisible(true), ComImport,
    Guid("29840822-5B84-11D0-BD3B-00A0C911CE86"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface ICreateDevEnum
    {
        [PreserveSig]
        int CreateClassEnumerator(
        [In]                                            ref Guid pType,
        [Out]                                       out IEnumMoniker ppEnumMoniker,
        [In]                                            int dwFlags);
    }
    [ComVisible(true), ComImport,
    Guid("55272A00-42CB-11CE-8135-00AA004BB851"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IPropertyBag
    {
        [PreserveSig]
        int Read(
        [In, MarshalAs(UnmanagedType.LPWStr)]           string pszPropName,
        [In, Out, MarshalAs(UnmanagedType.Struct)]  ref object pVar,
        IntPtr pErrorLog);
        [PreserveSig]
        int Write(
        [In, MarshalAs(UnmanagedType.LPWStr)]           string pszPropName,
        [In, MarshalAs(UnmanagedType.Struct)]       ref object pVar);
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/Face.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.IO;
using System.Threading;
using OpenCvSharp;
// sdk使用注意事项,使用sdk前,请参考文档进行授权激活,否则
// sdk初始化可能失败,可通过打开日志face_conf.json,字段改为true。
// æŸ¥æ‰¾æ˜¯å¦é€šè¿‡äº†æŽˆæƒæ¿€æ´»æˆ–激活失败的原因
// äººè„¸c#入口类
namespace FaceAI
{
    public class Face
    {
        // sdk初始化
        [DllImport("BaiduFaceApi.dll", EntryPoint = "sdk_init", CharSet =CharSet.Ansi
            , CallingConvention =CallingConvention.Cdecl)]
        public static extern int sdk_init(string model_path);
        // æ˜¯å¦æŽˆæƒ
        [DllImport("BaiduFaceApi.dll", EntryPoint = "is_auth", CharSet = CharSet.Ansi
               , CallingConvention = CallingConvention.Cdecl)]
        private static extern bool is_auth();
        // sdk销毁
        [DllImport("BaiduFaceApi.dll", EntryPoint = "sdk_destroy" , CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        private static extern void sdk_destroy();
        // èŽ·å–è®¾å¤‡æŒ‡çº¹
        [DllImport("BaiduFaceApi.dll", EntryPoint = "get_device_id", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr get_device_id();
        // èŽ·å–sdk版本号
        [DllImport("BaiduFaceApi.dll", EntryPoint = "sdk_version", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr sdk_version();
        // èŽ·å–sdk信息如设备指纹,版本号
        static void get_sdk_info()
        {
            // èŽ·å–è®¾å¤‡æŒ‡çº¹
            IntPtr ptr = get_device_id();
            string buf = Marshal.PtrToStringAnsi(ptr);
            Console.WriteLine("device id is:" + buf);
            // èŽ·å–sdk版本号
            IntPtr ptr_v = sdk_version();
            string vbuf = Marshal.PtrToStringAnsi(ptr_v);
            Console.WriteLine("sdk version is:" + vbuf);
        }
        // äººè„¸c#入口方法
        public static void Main()
        {
            //Console.WriteLine("in main");
            // model_path为模型文件夹路径,即models文件夹(里面存的是人脸识别的模型文件)
            // ä¼ ç©ºä¸ºé‡‡ç”¨é»˜è®¤è·¯å¾„,若想定置化路径,请填写全局路径如:d:\\face ï¼ˆmodels模型文件夹目录放置后为d:\\face\\models)
            // è‹¥æ¨¡åž‹æ–‡ä»¶å¤¹é‡‡ç”¨å®šç½®åŒ–路径,则激活文件(license.ini, license.key)也可采用定制化路径放置到该目录如d:\\face\\license
            // äº¦å¯åœ¨æ¿€æ´»æ–‡ä»¶é»˜è®¤ç”Ÿæˆçš„路径
            string model_path = null;
           // string model_path="d:\\face";
            long time_begin = TimeUtil.get_time_stamp();
            int n = sdk_init(model_path);
            long time_end = TimeUtil.get_time_stamp();
            Console.WriteLine("sdk init cost {0:D}", time_end- time_begin);
            //若没通过初始化,则n不为0, è¿”回的错误码及原因可参考说明文档
            if (n != 0)
            {
                Console.WriteLine("sdk init fail and errcode is {0:D}", n);
                Console.ReadLine();
                return;
             }
            Console.WriteLine("Main: æˆåŠŸ");
            // èŽ·å–è®¾å¤‡æŒ‡çº¹
            get_sdk_info();
            // éªŒè¯æ˜¯å¦æŽˆæƒ
            bool authed = is_auth();
            Console.WriteLine("authed res is:"+authed);
            long t_begin = TimeUtil.get_time_stamp();
            // ä»¥ä¸‹ä¸ºdemo示例,请参考FaceDemo打开相关注释测试验证
            //FaceDemo demo = new FaceDemo();
            //demo.face_demo();
            long t_end = TimeUtil.get_time_stamp();
            Console.WriteLine("time cost is:"+(t_end-t_begin));
            // ä½¿ç”¨å®Œæ¯•,销毁sdk,释放内存
            sdk_destroy();
            Console.WriteLine("end main");
            Console.ReadLine();
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceAttr.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,109 @@
using System;
using System.Runtime.InteropServices;
using OpenCvSharp;
namespace FaceAI
{
    /**
         * @brief   äººè„¸è¡¨æƒ…属性枚举
         */
    enum BDFaceAttributeEmotionType
    {
        BDFACE_ATTRIBUTE_EMOTION_FROWN = 0,     // çš±çœ‰
        BDFACE_ATTRIBUTE_EMOTION_SMILE = 1,     // ç¬‘
        BDFACE_ATTRIBUTE_EMOTION_CALM = 2,      // å¹³é™
    };
    /**
     * @brief   äººè„¸ç§æ—å±žæ€§æžšä¸¾
     */
    enum BDFaceRace
    {
        BDFACE_RACE_YELLOW = 0, // é»„种人
        BDFACE_RACE_WHITE = 1,  // ç™½ç§äºº
        BDFACE_RACE_BLACK = 2,  // é»‘种人
        BDFACE_RACE_INDIAN = 3, // å°ç¬¬å®‰äºº
    };
    /**
     * @brief   çœ¼é•œçŠ¶æ€å±žæ€§æžšä¸¾
     */
    enum BDFaceGlasses
    {
        BDFACE_NO_GLASSES = 0,   // æ— çœ¼é•œ
        BDFACE_GLASSES = 1,      // æœ‰çœ¼é•œ
        BDFACE_SUN_GLASSES = 2,  // å¢¨é•œ
    };
    /**
     * @brief   æ€§åˆ«å±žæ€§æžšä¸¾
     */
    enum BDFaceGender
    {
        BDFACE_GENDER_FEMAILE = 0, // å¥³æ€§
        BDFACE_GENDER_MALE = 1,    // ç”·æ€§
    };
    /**
     * @brief   äººè„¸å±žæ€§ç»“构体
     */
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    struct BDFaceAttribute
    {
        public int age;                            // å¹´é¾„
        public BDFaceRace race;                    // ç§æ—
        public BDFaceAttributeEmotionType emotion; // è¡¨æƒ…
        public BDFaceGlasses glasses;              // æˆ´çœ¼é•œçŠ¶æ€
        public BDFaceGender gender;                // æ€§åˆ«
    };
    // äººè„¸å±žæ€§ç¤ºä¾‹åŠæŽ¥å£
    class FaceAttr
    {
        // èŽ·å–äººè„¸å±žæ€§
        [DllImport("BaiduFaceApi.dll", EntryPoint = "face_attr", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        public static extern int face_attr(IntPtr ptr, IntPtr mat);
        // æµ‹è¯•获取人脸属性
        public void test_get_face_attr()
        {
            int max_face_num = 5; // è®¾ç½®æœ€å¤šæ£€æµ‹è·Ÿè¸ªäººæ•°ï¼ˆå¤šäººè„¸æ£€æµ‹ï¼‰ï¼Œé»˜è®¤ä¸º1,最多可设为50
            BDFaceAttribute[] attr_info = new BDFaceAttribute[max_face_num];
            int size = Marshal.SizeOf(typeof(BDFaceAttribute));
            IntPtr ptT = Marshal.AllocHGlobal(size * max_face_num);
            string img_path = "../images/rgb.png";
            Mat mat = Cv2.ImRead(img_path);
            int faceNum = face_attr(ptT, mat.CvPtr);
            Console.WriteLine("faceNum is:" + faceNum);
            for (int index = 0; index < faceNum; index++)
            {
                IntPtr ptr = new IntPtr();
                if (8 == IntPtr.Size)
                {
                    ptr = (IntPtr)(ptT.ToInt64() + size * index);
                }
                else if (4 == IntPtr.Size)
                {
                    ptr = (IntPtr)(ptT.ToInt32() + size * index);
                }
                attr_info[index] = (BDFaceAttribute)Marshal.PtrToStructure(ptr, typeof(BDFaceAttribute));
                // å¹´é¾„
                Console.WriteLine("age is {0}:", attr_info[index].age);
                // ç§æ—
                Console.WriteLine("race is:{0}", attr_info[index].race);
                // è¡¨æƒ…
                Console.WriteLine("emotion is:{0}", attr_info[index].emotion);
                // æˆ´çœ¼é•œçŠ¶æ€
                Console.WriteLine("glasses is:{0}", attr_info[index].glasses);
                // æ€§åˆ«
                Console.WriteLine("gender is:{0}", attr_info[index].gender);
            }
            Marshal.FreeHGlobal(ptT);
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceCompare.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,781 @@
using System;
using System.Runtime.InteropServices;
using System.IO;
using OpenCvSharp;
// äººè„¸æ¯”对(备注:人脸比对,实际上是人脸的特征值比对,提取出人脸特征值,用compare_feature方法比对)
namespace FaceAI
{
    // äººè„¸æ¯”较1:1、1:N、抽取人脸特征值、按特征值比较等
    public class FaceCompare
    {
        //  æå–人脸特征值(传图片文件路径)
        /// <summary>
        /// æå–人脸特征值,为512个浮点值,已加密
        /// </summary>
        /// <param name="file_name">图片信息,数据大小小于10M,传入图片文件路径</param>
        /// <param name="length">通过引用返回特征值的长度,若为2048表示提取正确,其他值表示提取了错误的特征值</param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "get_face_feature", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr get_face_feature(string file_name, ref int length);
        // æå–人脸特征值(传二进制图片buffer)
        /// <summary>
        /// æå–人脸特征值,为2048个byte (传入二进制图片buffer)
        /// </summary>
        /// <param name="buf"></param>
        /// <param name="size"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "get_face_feature_by_buf", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr get_face_feature_by_buf(byte[] buf, int size, ref int length);
        //// èŽ·å–äººè„¸ç‰¹å¾å€¼ï¼ˆä¼ å…¥opencv视频帧及人脸信息,适应于多人脸)
        ///// <summary>
        ///// èŽ·å–äººè„¸ç‰¹å¾å€¼ï¼ˆä¼ å…¥opencv视频帧及人脸信息,适应于多人脸)
        ///// </summary>
        ///// <param name="mat"></param>
        ///// <param name="info"></param>
        ///// <param name="feaptr"></param>
        ///// <returns></returns>
        //[DllImport("BaiduFaceApi.dll", EntryPoint = "get_face_feature_by_face", CharSet = CharSet.Ansi
        //    , CallingConvention = CallingConvention.Cdecl)]
        //public static extern int get_face_feature_by_face(IntPtr mat, ref TrackFaceInfo info, ref IntPtr feaptr);
        // äººè„¸1:1比对(传图片文件路径)
        /// <summary>
        /// äººè„¸å¯¹æ¯”接口(传入图片文件路径)
        /// </summary>
        /// <param name="file_name1">需要对比的第一张图片,小于10M,传入图片文件路径</param>
        /// <param name="file_name2">需要对比的第二张图片,小于10M,传入图片文件路径</param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "match", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr match(string file_name1, string file_name2);
        // äººè„¸1:1比对(传二进制图片buffer)
        /// <summary>
        /// äººè„¸å¯¹æ¯”接口(传入二进制图片buffer)
        /// </summary>
        /// <param name="buf1">需要对比的第一张图片,小于10M</param>
        /// <param name="size1">图片1的大小</param>
        /// <param name="buf2">需要对比的第二张图片,小于10M</param>
        /// <param name="size2">图片2的大小</param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "match_by_buf", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr match_by_buf(byte[] buf1, int size1, byte[] buf2, int size2);
        // äººè„¸1:1比对(传opencv视频帧)
        /// <summary>
        /// äººè„¸1:1比对(传opencv视频帧)
        /// </summary>
        /// <param name="img1"></param>
        /// <param name="img2"></param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "match_by_mat", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr match_by_mat(IntPtr img1, IntPtr img2);// byte[] buf1, int size1, byte[] buf2, int size2);
        // äººè„¸1:1比对(传人脸特征值和二进制图片buffer)
        /// <summary>
        /// äººè„¸å¯¹æ¯”接口(传入二进制图片buffer)
        /// </summary>
        /// <param name="feature">文件特征</param>
        /// <param name="fea_len"></param>
        /// <param name="buf2"></param>
        /// <param name="size2"></param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "match_by_feature", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr match_by_feature(byte[] feature, int fea_len, byte[] buf2, int size2);
        // ç‰¹å¾å€¼æ¯”对(传2个人脸的特征值)
        /// <summary>
        /// ç‰¹å¾å€¼æ¯”对
        /// </summary>
        /// <param name="f1"></param>
        /// <param name="f1_len"></param>
        /// <param name="f2"></param>
        /// <param name="f2_len"></param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "compare_feature", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        private static extern float compare_feature(byte[] f1, int f1_len, byte[] f2, int f2_len);
        // 1:N人脸识别(传图片文件路径和库里的比对)
        /// <summary>
        /// äººè„¸è¯†åˆ«ï¼Œæä¾›1:N查找 (传入图片文件路径)
        /// </summary>
        /// <param name="image">图片信息,数据大小小于10M,传入图片文件路径</param>
        /// <param name="group_id_list">组id列表。默认至少填写一个group_id,从指定的group中进行查找。需要同时查询多个group,用逗号分隔,上限10个</param>
        /// <param name="user_id">用户id,若指定了某个user,则只会与指定group下的这个user进行对比;若user_id传空字符串” â€ï¼Œåˆ™ä¼šä¸Žæ­¤group下的所有user进行1:N识别</param>
        /// <param name="user_top_num">识别后返回的用户top数,默认为1,最多返回50个结果</param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "identify", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr identify(string image, string group_id_list, string user_id, int user_top_num = 1);
        // 1:N人脸识别(传图片二进制文件buffer和库里的比对)
        /// <summary>
        /// äººè„¸è¯†åˆ«ï¼Œæä¾›1:N查找 (传入二进制图片buffer)
        /// </summary>
        /// <param name="buf">二进制图片信息,数据大小小于10M</param>
        /// <param name="size">图片大小</param>
        /// <param name="group_id_list">组id列表。默认至少填写一个group_id,从指定的group中进行查找。需要同时查询多个group,用逗号分隔,上限10个</param>
        /// <param name="user_id">用户id,若指定了某个user,则只会与指定group下的这个user进行对比;若user_id传空字符串” â€ï¼Œåˆ™ä¼šä¸Žæ­¤group下的所有user进行1:N识别</param>
        /// <param name="user_top_num">识别后返回的用户top数,默认为1,最多返回50个结果</param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "identify_by_buf", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr identify_by_buf(byte[] buf, int size, string group_id_list,
            string user_id, int user_top_num = 1);
        // 1:N人脸识别(传人脸特征值和库里的比对)
        /// <summary>
        /// 1:N人脸识别(传人脸特征值和库里的比对)
        /// </summary>
        /// <param name="feature"></param>
        /// <param name="fea_len"></param>
        /// <param name="group_id_list">组id列表。默认至少填写一个group_id,从指定的group中进行查找。需要同时查询多个group,用逗号分隔,上限10个</param>
        /// <param name="user_id">用户id,若指定了某个user,则只会与指定group下的这个user进行对比;若user_id传空字符串” â€ï¼Œåˆ™ä¼šä¸Žæ­¤group下的所有user进行1:N识别</param>
        /// <param name="user_top_num">识别后返回的用户top数,默认为1,最多返回50个结果</param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "identify_by_feature", CharSet = CharSet.Ansi
          , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr identify_by_feature(byte[] feature, int fea_len, string group_id_list,
            string user_id, int user_top_num = 1);
        // æå‰åŠ è½½åº“é‡Œæ‰€æœ‰æ•°æ®åˆ°å†…å­˜ä¸­
        /// <summary>
        /// æå‰åŠ è½½åº“é‡Œæ‰€æœ‰æ•°æ®åˆ°å†…å­˜ä¸­
        /// </summary>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "load_db_face", CharSet = CharSet.Ansi
          , CallingConvention = CallingConvention.Cdecl)]
        public static extern bool load_db_face();
        // 1:N人脸识别(传人脸图片文件和内存已加载的整个库数据比对)
        /// <summary>
        /// 1:N人脸识别(传人脸图片文件和内存已加载的整个库数据比对)
        /// </summary>
        /// <param name="image"></param>
        /// <param name="user_top_num"></param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "identify_with_all", CharSet = CharSet.Ansi
          , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr identify_with_all(string image, int user_top_num = 1);
        // 1:N人脸识别(传人脸图片文件和内存已加载的整个库数据比对)
        /// <summary>
        ///
        /// </summary>
        /// <param name="image">图片的二进制文件</param>
        /// <param name="size"></param>
        /// <param name="user_top_num"></param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "identify_by_buf_with_all", CharSet = CharSet.Ansi
          , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr identify_by_buf_with_all(byte[] image, int size, int user_top_num = 1);
        // 1:N人脸识别(传人脸特征值和内存已加载的整个库数据比对)
        /// <summary>
        /// 1:N人脸识别(传人脸特征值和内存已加载的整个库数据比对)
        /// </summary>
        /// <param name="feature"></param>
        /// <param name="fea_len"></param>
        /// <param name="user_top_num"></param>
        /// <returns></returns>
        [DllImport("BaiduFaceApi.dll", EntryPoint = "identify_by_feature_with_all", CharSet = CharSet.Ansi
          , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr identify_by_feature_with_all(byte[] feature, int fea_len, int user_top_num = 1);
        // æµ‹è¯•获取人脸特征值(2048个byte)
        public void test_get_face_feature()
        {
            byte[] fea = new byte[2048];
            string file_name = "G:\\Development\\Application\\testface\\img\\beckham\\2.jpg";
            int len = 0;
            IntPtr ptr = get_face_feature(file_name, ref len);
            if (ptr == IntPtr.Zero)
            {
                Console.WriteLine("get face feature error");
            }
            else
            {
                if (len == 2048)
                {
                    Console.WriteLine("get face feature success");
                    Marshal.Copy(ptr, fea, 0, 2048);
                    // å¯ä¿å­˜ç‰¹å¾å€¼2048个字节的fea到文件中
                    // FileUtil.byte2file("G:\\Development\\Application\\testface\\img\\beckham\\fea1.txt",fea, 2048);
                }
                else
                {
                    Console.WriteLine("get face feature error");
                }
            }
        }
        /// <summary>
        /// èŽ·å–äººè„¸ç‰¹å¾å€¼(2048个byte)
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public string GetFaceFeature(string fileName)
        {
            try
            {
                byte[] fea = new byte[2048];
                string file_name = fileName == null ? fileName : "G:\\Development\\Application\\testface\\img\\beckham\\2.jpg";
                int len = 0;
                IntPtr ptr = get_face_feature(file_name, ref len);
                if (ptr == IntPtr.Zero)
                {
                    Console.WriteLine("get face feature error");
                    return "error";
                }
                else
                {
                    if (len == 2048)
                    {
                        Console.WriteLine("get face feature success");
                        Marshal.Copy(ptr, fea, 0, 2048);
                        return fea.ToString();
                        // å¯ä¿å­˜ç‰¹å¾å€¼2048个字节的fea到文件中
                        // FileUtil.byte2file("G:\\Development\\Application\\testface\\img\\beckham\\fea1.txt",fea, 2048);
                    }
                    else
                    {
                        Console.WriteLine("get face feature error");
                        return "error";
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        /// <summary>
        /// èŽ·å–äººè„¸ç‰¹å¾å€¼ 2048Byte
        /// </summary>
        /// <param name="file_name">图片信息,数据大小小于10M,传入图片文件路径</param>
        /// <param name="length">通过引用返回特征值的长度,若为2048表示提取正确,其他值表示提取了错误的特征值</param>
        /// <returns></returns>
        public string GetFaceFeature(string file_name, ref int length)
        {
            byte[] fea = new byte[2048];
            int len = length == 0 ? 0 : length; //defalut=0
            string result = "";
            IntPtr ptr = get_face_feature(file_name, ref len);
            if (ptr == IntPtr.Zero)
            {
                result = ("get face feature error");
            }
            else
            {
                if (len == 2048)
                {
                    result = ("get face feature success");
                    Marshal.Copy(ptr, fea, 0, 2048);
                    // å¯ä¿å­˜ç‰¹å¾å€¼2048个字节的fea到文件中
                    // FileUtil.byte2file("G:\\Development\\Application\\testface\\img\\beckham\\fea1.txt",fea, 2048);
                }
                else
                {
                    result = ("get face feature error");
                }
            }
            return result;
        }
        //// æµ‹è¯•获取人脸特征值(2048个byte)
        //public void test_get_face_feature_by_buf()
        //{
        //    byte[] fea = new byte[2048];
        //    System.Drawing.Image img = System.Drawing.Image.FromFile("G:\\Development\\Application\\testface\\img\\beckham\\2.jpg");
        //    byte[] img_bytes = ImageUtil.img2byte(img);
        //    int len = 0;
        //    IntPtr ptr = get_face_feature_by_buf(img_bytes, img_bytes.Length, ref len);
        //    if (ptr == IntPtr.Zero)
        //    {
        //        Console.WriteLine("get face feature error");
        //    }
        //    else
        //    {
        //        if (len == 2048)
        //        {
        //            Console.WriteLine("get face feature success");
        //            Marshal.Copy(ptr, fea, 0, 2048);
        //            // å¯ä¿å­˜ç‰¹å¾å€¼2048个字节的fea到文件中
        //            //  FileUtil.byte2file("G:\\Development\\Application\\testface\\img\\beckham\\fea2.txt",fea, 2048);
        //        }
        //        else
        //        {
        //            Console.WriteLine("get face feature error");
        //        }
        //    }
        //}
        ///// <summary>
        ///// èŽ·å–äººè„¸ç‰¹å¾å€¼ 2048byte
        ///// </summary>
        ///// <param name="filePath"></param>
        ///// <returns></returns>
        //public string GetFaceFeatureByBuffer(string filePath)
        //{
        //    byte[] fea = new byte[2048];
        //    string result = "";
        //    System.Drawing.Image img = System.Drawing.Image.FromFile(filePath);
        //    byte[] img_bytes = ImageUtil.img2byte(img);
        //    int len = 0;
        //    IntPtr ptr = get_face_feature_by_buf(img_bytes, img_bytes.Length, ref len);
        //    if (ptr == IntPtr.Zero)
        //    {
        //        result = ("get face feature error");
        //    }
        //    else
        //    {
        //        if (len == 2048)
        //        {
        //            result = ("get face feature success");
        //            Marshal.Copy(ptr, fea, 0, 2048);
        //            // å¯ä¿å­˜ç‰¹å¾å€¼2048个字节的fea到文件中
        //            //  FileUtil.byte2file("G:\\Development\\Application\\testface\\img\\beckham\\fea2.txt",fea, 2048);
        //        }
        //        else
        //        {
        //            result = ("get face feature error");
        //        }
        //    }
        //    return result;
        //}
        // æµ‹è¯•1:1比较,传入图片文件路径
        public void test_match()
        {
            string file1 = "G:\\Development\\Application\\testface\\img\\beckham\\1.jpg";
            string file2 = "G:\\Development\\Application\\testface\\img\\beckham\\9.jpg";
            IntPtr ptr = match(file1, file2);
            string buf = Marshal.PtrToStringAnsi(ptr);
            Console.WriteLine("match res is:" + buf);
        }
        /// <summary>
        /// 1:1比较 ä¼ å…¥å›¾ç‰‡æ–‡ä»¶è·¯å¾„
        /// </summary>
        /// <param name="file1"></param>
        /// <param name="file2"></param>
        /// <returns></returns>
        public string FaceMatch(string file1, string file2)
        {
            IntPtr ptr = match(file1, file2);
            string buf = Marshal.PtrToStringAnsi(ptr);
            Console.WriteLine("match res is:" + buf);
            return buf;
        }
        // æµ‹è¯•1:1比较,传入图片文件二进制buffer
        //public void test_match_by_buf()
        //{
        //    System.Drawing.Image img1 = System.Drawing.Image.FromFile("d:\\444.bmp");
        //    byte[] img_bytes1 = ImageUtil.img2byte(img1);
        //    System.Drawing.Image img2 = System.Drawing.Image.FromFile("d:\\555.png");
        //    byte[] img_bytes2 = ImageUtil.img2byte(img2);
        //    Console.WriteLine("IntPtr ptr = match_by_buf");
        //    IntPtr ptr = match_by_buf(img_bytes1, img_bytes1.Length, img_bytes2, img_bytes2.Length);
        //    string buf = Marshal.PtrToStringAnsi(ptr);
        //    Console.WriteLine("match_by_buf res is:" + buf);
        //}
        /// <summary>
        /// 1:1比较 ä¼ å›¾ç‰‡äºŒè¿›åˆ¶Buffer
        /// </summary>
        /// <param name="file1"></param>
        /// <param name="file2"></param>
        /// <returns></returns>
        public string FaceMatchByBuffer(byte[] file1, byte[] file2)
        {
            // System.Drawing.Image img1 = System.Drawing.Image.FromFile(file1);
            byte[] img_bytes1 = file1; // ImageUtil.img2byte(img1);
            // System.Drawing.Image img2 = System.Drawing.Image.FromFile(file2);
            byte[] img_bytes2 = file2; // ImageUtil.img2byte(img2);
            Console.WriteLine("IntPtr ptr = match_by_buf");
            IntPtr ptr = match_by_buf(img_bytes1, img_bytes1.Length, img_bytes2, img_bytes2.Length);
            string buf = Marshal.PtrToStringAnsi(ptr);
            return ("match_by_buf res is:" + buf);
        }
        // æµ‹è¯•1:1比较,传入opencv视频帧
        public void test_match_by_mat()
        {
            Mat img1 = Cv2.ImRead("d:\\444.bmp");
            Mat img2 = Cv2.ImRead("d:\\555.png");
            IntPtr ptr = match_by_mat(img1.CvPtr, img2.CvPtr);// img_bytes1, img_bytes1.Length, img_bytes2, img_bytes2.Length);
            string buf = Marshal.PtrToStringAnsi(ptr);
            Console.WriteLine("match_by_buf res is:" + buf);
        }
        /// <summary>
        /// 1:1比较,传入opencv视频帧
        /// </summary>
        /// <param name="file1"></param>
        /// <param name="file2"></param>
        /// <returns></returns>
        public string FaceMatchByMat(string file1, string file2)
        {
            Mat img1 = Cv2.ImRead(file1);
            Mat img2 = Cv2.ImRead(file2);
            IntPtr ptr = match_by_mat(img1.CvPtr, img2.CvPtr);// img_bytes1, img_bytes1.Length, img_bytes2, img_bytes2.Length);
            string buf = Marshal.PtrToStringAnsi(ptr);
            return ("match_by_buf res is:" + buf);
        }
        // æµ‹è¯•根据特征值和图片二进制buf比较
        //public void test_match_by_feature()
        //{
        //    // èŽ·å–ç‰¹å¾å€¼2048个字节
        //    byte[] fea = new byte[2048];
        //    string file_name = "G:\\Development\\Application\\testface\\img\\beckham\\2.jpg";
        //    int len = 0;
        //    IntPtr ptr = get_face_feature(file_name, ref len);
        //    if (len != 2048)
        //    {
        //        Console.WriteLine("get face feature error!");
        //        return;
        //    }
        //    Marshal.Copy(ptr, fea, 0, 2048);
        //    // èŽ·å–å›¾ç‰‡äºŒè¿›åˆ¶buffer
        //    System.Drawing.Image img2 = System.Drawing.Image.FromFile("G:\\Development\\Application\\testface\\img\\beckham\\8.jpg");
        //    byte[] img_bytes2 = ImageUtil.img2byte(img2);
        //    IntPtr ptr_res = match_by_feature(fea, fea.Length, img_bytes2, img_bytes2.Length);
        //    string buf = Marshal.PtrToStringAnsi(ptr_res);
        //    Console.WriteLine("match_by_feature res is:" + buf);
        //}
        /// <summary>
        /// æ ¹æ®ç‰¹å¾å€¼å’Œå›¾ç‰‡äºŒè¿›åˆ¶buf比较
        /// </summary>
        /// <param name="file_name">需要对比的特征值</param>
        /// <param name="file_buffer">需要对比的第二张图片,小于10M</param>
        /// <returns></returns>
        public string FaceMatchByFeature(byte[] file_name, byte[] file_buffer)
        {
            // èŽ·å–ç‰¹å¾å€¼2048个字节
            byte[] fea = file_name; // new byte[2048];
            //int len = 0;
            //IntPtr ptr = get_face_feature(file_name, ref len);
            //if (len != 2048)
            //{
            //    return ("get face feature error!");
            //}
            //Marshal.Copy(ptr, fea, 0, 2048);
            //// èŽ·å–å›¾ç‰‡äºŒè¿›åˆ¶buffer
            //System.Drawing.Image img2 = System.Drawing.Image.FromFile(file_buffer);
            byte[] img_bytes2 = file_buffer; // ImageUtil.img2byte(img2);
            IntPtr ptr_res = match_by_feature(fea, fea.Length, img_bytes2, img_bytes2.Length);
            string buf = Marshal.PtrToStringAnsi(ptr_res);
            Console.WriteLine("match_by_feature res is:" + buf);
            return buf;
        }
        // æµ‹è¯•1:N比较,传入图片文件路径
        public /*void*/string test_identify(string str, string usr_grp, string usr_id)
        {
            string file1 = str;//"G:\\Development\\Application\\testface\\img\\beckham\\6.jpg";
            string user_group = usr_grp;//"test_group";
            string user_id = usr_id;//"test_user";
            IntPtr ptr = identify(file1, user_group, user_id);
            string buf = Marshal.PtrToStringAnsi(ptr);
            Console.WriteLine("identify res is:" + buf);
            return buf;
        }
        /// <summary>
        /// 1:N比较,传入图片文件路径
        /// </summary>
        /// <param name="file">图片信息,数据大小小于10M,传入图片文件路径</param>
        /// <param name="user_group">组id列表。默认至少填写一个group_id,从指定的group中进行查找。需要同时查询多个group,用逗号分隔,上限10个</param>
        /// <param name="user_id">用户id,若指定了某个user,则只会与指定group下的这个user进行对比;若user_id传空字符串” â€ï¼Œåˆ™ä¼šä¸Žæ­¤group下的所有user进行1:N识别</param>
        /// <returns></returns>
        public static string FaceIdentify(string file, string user_group, string user_id)
        {
            string file1 = file;
            IntPtr ptr = identify(file1, user_group, user_id);
            string buf = Marshal.PtrToStringAnsi(ptr);
            Console.WriteLine("identify res is:" + buf);
            return buf;
        }
        // æµ‹è¯•1:N比较,传入图片文件二进制buffer
        //public void test_identify_by_buf(string str, string usr_grp, string usr_id)
        //{
        //    System.Drawing.Image img = System.Drawing.Image.FromFile(str);//"G:\\Development\\Application\\testface\\img\\beckham\\2.jpg");
        //    byte[] img_bytes = ImageUtil.img2byte(img);
        //    string user_group = usr_grp;//"test_group";
        //    string user_id = usr_id;// "test_user";
        //    IntPtr ptr = identify_by_buf(img_bytes, img_bytes.Length, user_group, user_id);
        //    string buf = Marshal.PtrToStringAnsi(ptr);
        //    Console.WriteLine("identify_by_buf res is:" + buf);
        //}
        /// <summary>
        /// 1:N比较,传入图片文件二进制buffer
        /// </summary>
        /// <param name="str">二进制图片信息,数据大小小于10M</param>
        /// <param name="usr_grp">组id列表。默认至少填写一个group_id,从指定的group中进行查找。需要同时查询多个group,用逗号分隔,上限10个</param>
        /// <param name="usr_id">用户id,若指定了某个user,则只会与指定group下的这个user进行对比;若user_id传空字符串” â€ï¼Œåˆ™ä¼šä¸Žæ­¤group下的所有user进行1:N识别</param>
        /// <returns></returns>
        public string FaceIdentifyByBuffer(byte[] str, string usr_grp, string usr_id)
        {
            // System.Drawing.Image img = System.Drawing.Image.FromFile(str);
            byte[] img_bytes = str; // ImageUtil.img2byte(img);
            string user_group = usr_grp;//"test_group";
            string user_id = usr_id;// "test_user";
            IntPtr ptr = identify_by_buf(img_bytes, img_bytes.Length, user_group, user_id);
            string buf = Marshal.PtrToStringAnsi(ptr);
            Console.WriteLine("identify_by_buf res is:" + buf);
            return buf;
        }
        // æµ‹è¯•1:N比较,传入提取的人脸特征值
        public void test_identify_by_feature()
        {
            // èŽ·å–ç‰¹å¾å€¼2048个字节
            byte[] fea = new byte[2048];
            string file_name = "G:\\Development\\Application\\testface\\img\\beckham\\2.jpg";
            int len = 0;
            IntPtr ptr = get_face_feature(file_name, ref len);
            if (len != 2048)
            {
                Console.WriteLine("get face feature error!");
                return;
            }
            Marshal.Copy(ptr, fea, 0, 2048);
            string user_group = "test_group";
            string user_id = "test_user";
            IntPtr ptr_res = identify_by_feature(fea, fea.Length, user_group, user_id);
            string buf = Marshal.PtrToStringAnsi(ptr_res);
            Console.WriteLine("identify_by_feature res is:" + buf);
        }
        /// <summary>
        /// 1:N比较,传入提取的人脸特征值
        /// </summary>
        /// <param name="file_name">传入图片特征</param>
        /// <param name="userGroup">组id列表。默认至少填写一个group_id,从指定的group中进行查找。需要同时查询多个group,用逗号分隔,上限10个</param>
        /// <param name="userId">用户id,若指定了某个user,则只会与指定group下的这个user进行对比;若user_id传空字符串” â€ï¼Œåˆ™ä¼šä¸Žæ­¤group下的所有user进行1:N识别</param>
        ///
        public static string FaceIdentifyByFeature(string file_name, string userGroup, string userId)
        {
            // èŽ·å–ç‰¹å¾å€¼2048个字节
            byte[] fea = new byte[2048];
            int len = 0;
            IntPtr ptr = get_face_feature(file_name, ref len);
            if (len != 2048)
            {
                return ("get face feature error!");
            }
            Marshal.Copy(ptr, fea, 0, 2048);
            string user_group = userGroup == null ? "test_group" : userGroup;
            string user_id = userId == null ? "test_user" : userId;
            IntPtr ptr_res = identify_by_feature(fea, fea.Length, user_group, user_id);
            string buf = Marshal.PtrToStringAnsi(ptr_res);
            Console.WriteLine("identify_by_feature res is:" + buf);
            return buf;
        }
        // é€šè¿‡ç‰¹å¾å€¼æ¯”对(1:1)
        public void test_compare_feature()
        {
            // èŽ·å–ç‰¹å¾å€¼1   å…±2048个字节
            byte[] fea1 = new byte[2048];
            string file_name1 = "G:\\Development\\Application\\testface\\img\\beckham\\2.jpg";
            int len1 = 0;
            IntPtr ptr1 = get_face_feature(file_name1, ref len1);
            if (len1 != 2048)
            {
                Console.WriteLine("get face feature error!");
                return;
            }
            Marshal.Copy(ptr1, fea1, 0, 2048);
            // èŽ·å–ç‰¹å¾å€¼2   å…±2048个字节
            byte[] fea2 = new byte[2048];
            string file_name2 = "G:\\Development\\Application\\testface\\img\\beckham\\8.jpg";
            int len2 = 0;
            IntPtr ptr2 = get_face_feature(file_name2, ref len2);
            if (len2 != 2048)
            {
                Console.WriteLine("get face feature error!");
                return;
            }
            Marshal.Copy(ptr2, fea2, 0, 2048);
            // æ¯”对
            float score = compare_feature(fea1, len1, fea2, len2);
            Console.WriteLine("compare_feature score is:" + score);
        }
        /// <summary>
        /// é€šè¿‡ç‰¹å¾å€¼æ¯”对(1:1) å¯¹äººè„¸ç‰¹å¾å€¼è¿›è¡Œæ¯”较,可返回人脸特征相似分值(百分制)
        /// </summary>
        /// <param name="file_name1">2048个byte数组的特征值(传图片路径)</param>
        /// <param name="file_name2">2048个byte数组的特征值(传图片路径)</param>
        /// <returns></returns>
        public static string FaceCompareFeature(string file_name1, string file_name2)
        {
            string mes = "入:";
            try
            {
                // èŽ·å–ç‰¹å¾å€¼1   å…±2048个字节
                byte[] fea1 = new byte[2048];
                int len1 = 0;
                IntPtr ptr1 = get_face_feature(file_name1, ref len1);
                if (len1 != 2048)
                {
                    return mes += "get face feature error!";
                }
                Marshal.Copy(ptr1, fea1, 0, 2048);
                // èŽ·å–ç‰¹å¾å€¼2   å…±2048个字节
                byte[] fea2 = new byte[2048];
                int len2 = 0;
                IntPtr ptr2 = get_face_feature(file_name2, ref len2);
                if (len2 != 2048)
                {
                    return mes += "get face feature error!";
                }
                Marshal.Copy(ptr2, fea2, 0, 2048);
                // æ¯”对
                // len1 ç‰¹å¾å€¼1的长度
                float score = compare_feature(fea1, len1, fea2, len2);
                Console.WriteLine("compare_feature score is:" + score);
                return mes += score.ToString();
            }
            catch (Exception ex)
            {
                return mes += ex;
            }
        }
        /// <summary>
        /// é€šè¿‡ç‰¹å¾å€¼æ¯”对(1:1) å¯¹äººè„¸ç‰¹å¾å€¼è¿›è¡Œæ¯”较,可返回人脸特征相似分值(百分制)
        /// </summary>
        /// <param name="face1">2048个byte数组的特征值</param>
        /// <param name="face2">2048个byte数组的特征值</param>
        /// <returns></returns>
        public string FaceCompareFeatureByBuffer(byte[] face1, byte[] face2)
        {
            if (face1.Length == 2048 && face2.Length == 2048)
            {
                // èŽ·å–ç‰¹å¾å€¼1   å…±2048个字节
                byte[] fea1 = new byte[2048];
                fea1 = face1;
                int len1 = 0;
                // èŽ·å–ç‰¹å¾å€¼1   å…±2048个字节
                byte[] fea2 = new byte[2048];
                fea2 = face2;
                int len2 = 0;
                // æ¯”对
                // len1 ç‰¹å¾å€¼1的长度
                float score = compare_feature(fea1, len1, fea2, len2);
                Console.WriteLine("compare_feature score is:" + score);
                return score.ToString();
            }
            else
            {
                return "byte should be 2048";
            }
        }
        // æµ‹è¯•1:N比较,传入提取的人脸特征值和已加载的内存中整个库比较
        public void test_identify_by_feature_with_all()
        {
            // åŠ è½½æ•´ä¸ªæ•°æ®åº“åˆ°å†…å­˜ä¸­
            load_db_face();
            // èŽ·å–ç‰¹å¾å€¼2048个字节
            byte[] fea = new byte[2048];
            string file_name = "G:\\Development\\Application\\testface\\img\\beckham\\2.jpg";
            int len = 0;
            IntPtr ptr = get_face_feature(file_name, ref len);
            if (len != 2048)
            {
                Console.WriteLine("get face feature error!");
                return;
            }
            Marshal.Copy(ptr, fea, 0, 2048);
            IntPtr ptr_res = identify_by_feature_with_all(fea, fea.Length);
            string buf = Marshal.PtrToStringAnsi(ptr_res);
            Console.WriteLine("identify_by_feature_with_all res is:" + buf);
        }
        /// <summary>
        /// 1:N比较,传入提取的人脸特征值和已加载的内存中整个库比较
        /// </summary>
        /// <param name="file_name">传入人脸文件特征值</param>
        /// <returns></returns>
        public string FaceIdentifyByFeatureWithAll(byte[] file_name)
        {
            // åŠ è½½æ•´ä¸ªæ•°æ®åº“åˆ°å†…å­˜ä¸­
            load_db_face();
            // èŽ·å–ç‰¹å¾å€¼2048个字节
            byte[] fea = new byte[2048];
            fea = file_name;
            int len = 0;
            //IntPtr ptr = get_face_feature(file_name, ref len);
            //if (len != 2048)
            //{
            //    Console.WriteLine("get face feature error!");
            //    return "error";
            //}
            // Marshal.Copy(ptr, fea, 0, 2048);
            IntPtr ptr_res = identify_by_feature_with_all(fea, fea.Length);
            string buf = Marshal.PtrToStringAnsi(ptr_res);
            Console.WriteLine("identify_by_feature_with_all res is:" + buf);
            return buf;
        }
        // æµ‹è¯•1:N比较,传入图片文件路径和已加载的内存中整个库比较
        public void test_identify_with_all()
        {
            // åŠ è½½æ•´ä¸ªæ•°æ®åº“åˆ°å†…å­˜ä¸­
            load_db_face();
            // 1:N
            string file1 = "G:\\Development\\Application\\testface\\img\\beckham\\3.jpg";
            IntPtr ptr = identify_with_all(file1);
            string buf = Marshal.PtrToStringAnsi(ptr);
            Console.WriteLine("identify_with_all res is:" + buf);
        }
        /// <summary>
        /// 1:N比较,传入图片文件路径和已加载的内存中整个库比较
        /// </summary>
        /// <param name="file1">传入图片路径</param>
        /// <returns></returns>
        public string FaceIndentifyWithAll(string file1)
        {
            // åŠ è½½æ•´ä¸ªæ•°æ®åº“åˆ°å†…å­˜ä¸­
            load_db_face();
            // 1:N
            IntPtr ptr = identify_with_all(file1);
            string buf = Marshal.PtrToStringAnsi(ptr);
            Console.WriteLine("identify_with_all res is:" + buf);
            return buf;
        }
        /// <summary>
        /// 1:N比较,传入图片文件二进制buffer和已加载的内存中整个库比较
        /// </summary>
        /// <param name="file_name"></param>
        /// <returns></returns>
        public string FaceIdentifyByBufferWithAll(byte[] file_name)
        {
            // åŠ è½½æ•´ä¸ªæ•°æ®åº“åˆ°å†…å­˜ä¸­
            load_db_face();
            // 1:N
            // System.Drawing.Image img = System.Drawing.Image.FromFile(file_name);
            byte[] img_bytes = file_name;// ImageUtil.img2byte(img);
            IntPtr ptr = identify_by_buf_with_all(img_bytes, img_bytes.Length);
            string buf = Marshal.PtrToStringAnsi(ptr);
            Console.WriteLine("identify_by_buf_with_all res is:" + buf);
            return buf;
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceDraw.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,151 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
// ç»˜åˆ¶ç±»ï¼Œç”»äººè„¸æ¡†ï¼Œç”»å…³é”®ç‚¹ç­‰
namespace FaceAI
{
    class FaceDraw
    {
        // ç”»äººè„¸æ¡†
        public static int draw_rects(ref Mat img, int face_num, BDFaceBBox[] info)
        {
            if (face_num <= 0)
            {
                return 0;
            }
            Scalar color = new Scalar(0, 255, 0);
            for (int i = 0; i < face_num; i++)
            {
                int x = Convert.ToInt32(info[i].center_x - info[i].width / 2.0);
                int y = Convert.ToInt32(info[i].center_y - info[i].height / 2.0);
                int w = Convert.ToInt32(info[i].width);
                int h = Convert.ToInt32(info[i].height);
                Rect rect = new Rect(x, y, w, h);
                Cv2.Rectangle(img, rect, color);
            }
            return 0;
        }
        // ç”»äººè„¸æ¡†
        public static int draw_rects(ref Mat img, int face_num, BDFaceTrackInfo[] track_info)
        {
            if (face_num <= 0)
            {
                return 0;
            }
            Scalar color = new Scalar(0, 255, 0);
            for(int i = 0; i < face_num; i++)
            {
                int x = Convert.ToInt32(track_info[i].box.center_x- track_info[i].box.width / 2.0);
                int y = Convert.ToInt32(track_info[i].box.center_y - track_info[i].box.height / 2.0);
                int w = Convert.ToInt32(track_info[i].box.width);
                int h = Convert.ToInt32(track_info[i].box.height);
                Rect rect = new Rect(x,y,w,h);
                Cv2.Rectangle(img, rect, color);
            }
            return 0;
        }
        // ç”»äººè„¸å…³é”®ç‚¹
        public static int draw_shape(ref Mat img, int face_num, BDFaceTrackInfo[] track_info)
        {
            if (face_num <= 0)
            {
                return 0;
            }
            int face_id = 0;
            Scalar color = new Scalar(0, 255, 255);
            Scalar color2 = new Scalar(0, 0, 255);
            for (int i = 0; i < face_num; ++i)
            {
                int point_size = track_info[i].landmark.size / 2;
                int radius = 2;
                face_id = track_info[i].face_id;
                for (int j = 0; j < point_size; ++j)
                {
                    Cv2.Circle(img, (int)track_info[i].landmark.data[j * 2], (int)track_info[i].landmark.data[j * 2 + 1], radius, color);
                }
                if (point_size == 72)
                {
                    const int components = 9;
                    int[] comp1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
                    int[] comp2 = { 13, 14, 15, 16, 17, 18, 19, 20, 13, 21 };
                    int[] comp3 = { 22, 23, 24, 25, 26, 27, 28, 29, 22 };
                    int[] comp4 = { 30, 31, 32, 33, 34, 35, 36, 37, 30, 38 };
                    int[] comp5 = { 39, 40, 41, 42, 43, 44, 45, 46, 39 };
                    int[] comp6 = { 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 47 };
                    int[] comp7 = { 51, 57, 52 };
                    int[] comp8 = { 58, 59, 60, 61, 62, 63, 64, 65, 58 };
                    int[] comp9 = { 58, 66, 67, 68, 62, 69, 70, 71, 58 };
                    int[][] idx = { comp1, comp2, comp3, comp4, comp5, comp6, comp7, comp8, comp9 };
                    int[] npoints = { 13, 10, 9, 10, 9, 11, 3, 9, 9 };
                    for (int m = 0; m < components; ++m)
                    {
                        for (int n = 0; n < npoints[m] - 1; ++n)
                        {
                            Point p1 = new Point(track_info[i].landmark.data[idx[m][n] * 2], track_info[i].landmark.data[idx[m][n] * 2 + 1]);
                            Point p2 = new Point(track_info[i].landmark.data[idx[m][n + 1] * 2], track_info[i].landmark.data[idx[m][n + 1] * 2 + 1]);
                            Cv2.Line(img, p1, p2, color2);
                        }
                    }
                }
                string s_face_id = face_id.ToString();
                double font_scale = 2;
                Point pos = new Point(track_info[i].box.center_x, track_info[i].box.center_y);
                Cv2.PutText(img, s_face_id, pos, HersheyFonts.HersheyComplex, font_scale, new Scalar(0, 255, 255));
            }
            return 0;
        }
        // ç”»äººè„¸å…³é”®ç‚¹
        public static int draw_landmark(ref Mat img, int face_num, BDFaceLandmark[] landmark)
        {
            if (face_num <= 0)
            {
                return 0;
            }
            Scalar color = new Scalar(0, 255, 255);
            Scalar color2 = new Scalar(0, 0, 255);
            for (int i = 0; i < face_num; ++i)
            {
                int point_size = landmark[i].size / 2;
                int radius = 2;
                for (int j = 0; j < point_size; ++j)
                {
                    Cv2.Circle(img, (int)landmark[i].data[j * 2], (int)landmark[i].data[j * 2 + 1], radius, color);
                }
                if (point_size == 72)
                {
                    const int components = 9;
                    int[] comp1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
                    int[] comp2 = { 13, 14, 15, 16, 17, 18, 19, 20, 13, 21 };
                    int[] comp3 = { 22, 23, 24, 25, 26, 27, 28, 29, 22 };
                    int[] comp4 = { 30, 31, 32, 33, 34, 35, 36, 37, 30, 38 };
                    int[] comp5 = { 39, 40, 41, 42, 43, 44, 45, 46, 39 };
                    int[] comp6 = { 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 47 };
                    int[] comp7 = { 51, 57, 52 };
                    int[] comp8 = { 58, 59, 60, 61, 62, 63, 64, 65, 58 };
                    int[] comp9 = { 58, 66, 67, 68, 62, 69, 70, 71, 58 };
                    int[][] idx = { comp1, comp2, comp3, comp4, comp5, comp6, comp7, comp8, comp9 };
                    int[] npoints = { 13, 10, 9, 10, 9, 11, 3, 9, 9 };
                    for (int m = 0; m < components; ++m)
                    {
                        for (int n = 0; n < npoints[m] - 1; ++n)
                        {
                            Point p1 = new Point(landmark[i].data[idx[m][n] * 2], landmark[i].data[idx[m][n] * 2 + 1]);
                            Point p2 = new Point(landmark[i].data[idx[m][n + 1] * 2], landmark[i].data[idx[m][n + 1] * 2 + 1]);
                            Cv2.Line(img, p1, p2, color2);
                        }
                    }
                }
            }
            return 0;
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceFeature.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.IO;
using OpenCvSharp;
// æå–人脸特征值
namespace FaceAI
{
    // äººè„¸ç‰¹å¾å€¼ç»“构体
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct BDFaceFeature
    {
        public int size;
        // äººè„¸çš„特征值,提取出来后是128个float的浮点值
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
        public float[] data;// = new float[128];
    }
    // äººè„¸ç‰¹å¾å€¼ç»“构体
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct BDDepthFeature
    {
        public int size;
        // äººè„¸çš„æ·±åº¦ç‰¹å¾å€¼ï¼Œæå–出来后是256个float的浮点值
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
        public float[] data;// = new float[256];
    }
    class FaceFeature
    {
        // æå–人脸特征值
        [DllImport("BaiduFaceApi.dll", EntryPoint = "face_feature", CharSet = CharSet.Ansi
            , CallingConvention = CallingConvention.Cdecl)]
        // è¿”回num为特征值的人数,type为0表示提取生活照的特征值,1表示nir的特征值
        public static extern int face_feature(IntPtr feature, IntPtr box, IntPtr mat, int type);
        public void test_face_feature()
        {
            long t_begin = TimeUtil.get_time_stamp();
            BDFaceFeature[] fea1 = test_get_face_feature_by_path("../images/2.jpg");
            long t_end = TimeUtil.get_time_stamp();
            Console.WriteLine("get feature time cost is:" + (t_end - t_begin));
        }
        // èŽ·å–ç‰¹å¾å€¼ï¼Œä¼ å…¥å›¾ç‰‡è·¯å¾„
        public BDFaceFeature[] test_get_face_feature_by_path(string img_path)
        {
            // ç‰¹å¾å€¼çš„长度,128个float值
            int dim_count = 128;
            Mat mat = Cv2.ImRead(img_path);
            // å‡è®¾æå–的人数,需要比实际的人数多,因为需要提取分配内存
            int faceNum = 5;
            BDFaceFeature[] feaList = new BDFaceFeature[faceNum];
            for(int i = 0; i < faceNum; i++)
            {
                feaList[i].data = new float[dim_count];
                feaList[i].size = 0;
            }
            if (mat.Empty())
            {
                return null;
            }
            int sizeFeature = Marshal.SizeOf(typeof(BDFaceFeature));
            IntPtr ptFea = Marshal.AllocHGlobal(sizeFeature * faceNum);
            // æž„造返回的人脸框数据
            BDFaceBBox[] info = new BDFaceBBox[faceNum];
            int sizeBox = Marshal.SizeOf(typeof(BDFaceBBox));
            IntPtr ptBox = Marshal.AllocHGlobal(sizeBox * faceNum);
            // è¿”回num为特征值的人数,type为0表示提取生活照的特征值,1表示证件照的特征值,2表示nir的特征值
            int type = 0;
            int num = face_feature(ptFea, ptBox, mat.CvPtr, type);
            if (num <= 0)
            {
                return null;
            }
            Console.WriteLine("face num is:{0}", num);
            // è¯·ç¡®ä¿faceNum大于num, faceNum为c#期望的检测人数,需要预先分配内存,否则无法获取
            if (num > faceNum)
            {
                num = faceNum;
            }
            for (int index = 0; index < num; index++)
            {
                IntPtr ptrF = new IntPtr();
                IntPtr ptrB = new IntPtr();
                if (8 == IntPtr.Size)
                {
                    ptrF = (IntPtr)(ptFea.ToInt64() + sizeFeature * index);
                    ptrB = (IntPtr)(ptBox.ToInt64() + sizeBox * index);
                }
                else if (4 == IntPtr.Size)
                {
                    ptrF = (IntPtr)(ptFea.ToInt32() + sizeFeature * index);
                    ptrB = (IntPtr)(ptBox.ToInt32() + sizeBox * index);
                }
                feaList[index] = (BDFaceFeature)Marshal.PtrToStructure(ptrF, typeof(BDFaceFeature));
                Console.WriteLine("feaList[index].size is:{0}", feaList[index].size);
                for (int k = 0; k < feaList[index].size; k++)
                {
                    Console.WriteLine("feature is {0}:", feaList[index].data[k]);
                }
                info[index] = (BDFaceBBox)Marshal.PtrToStructure(ptrB, typeof(BDFaceBBox));
                // ç´¢å¼•值
                Console.WriteLine("detect score is:{0}", info[index].index);
                // ç½®ä¿¡åº¦
                Console.WriteLine("detect score is:{0}", info[index].score);
                // äººè„¸å®½åº¦
                Console.WriteLine("detect mWidth is:{0}", info[index].width);
                // ä¸­å¿ƒç‚¹X,Y坐标
                Console.WriteLine("detect mCenter_x is:{0}", info[index].center_x);
                Console.WriteLine("detect mCenter_y is:{0}", info[index].center_y);
            }
            // ç»˜åˆ¶äººè„¸æ¡†
            FaceDraw.draw_rects(ref mat, faceNum, info);
            //mat.ImWrite("detect.jpg");
            mat.Release();
            return feaList;
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceLiveness.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,548 @@
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);
        // å•目近红外静默活体检测
        [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);
        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; // æ´»ä½“仅返回一个人脸,多人取最大人脸
            BDFaceBBox[] box_info = new BDFaceBBox[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();
            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);
                }
                box_info[index] = (BDFaceBBox)Marshal.PtrToStructure(ptr, typeof(BDFaceBBox));
                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);
            }
            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);
                }
                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 è¿”回的人脸数据
            BDFaceBBox[] rgb_box_info = new BDFaceBBox[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];
            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;
            }
            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;
                    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++)
                    {
                        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_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();
                    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;//取最大人脸的活体
            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];
            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);
                    }
                    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);
                }
                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");
            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);
            BDFaceBBox[] box_info = new BDFaceBBox[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);
                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));
                    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));
                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();
        }
        // åŒç›®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();
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,209 @@
using System;
using System.Runtime.InteropServices;
using OpenCvSharp;
/**
 *  å¤‡æ³¨ï¼ˆäººè„¸æ•°æ®åº“管理说明):
 *  äººè„¸æ•°æ®åº“为采用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)]
        private 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)]
        private 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)]
        private 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)]
        private static extern IntPtr user_delete(string user_id, string group_id);
        // ç»„添加
        [DllImport("BaiduFaceApi.dll", EntryPoint = "group_add", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr group_add(string group_id);
        // ç»„删除
        [DllImport("BaiduFaceApi.dll", EntryPoint = "group_delete", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr group_delete(string group_id);
        // æŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯
        [DllImport("BaiduFaceApi.dll", EntryPoint = "get_user_info", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        private 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)]
        private 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)]
        private 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)]
        private 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)]
        private 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);
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FaceTrack.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,221 @@
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");
        }
     }
 }
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/FileUtil.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace FaceAI
{
    class FileUtil
    {
        // æŠŠbyte保存成二进制文件
        public static void byte2file(string file_name, byte[] b, int len)
        {
            FileStream fs = new FileStream(file_name, FileMode.OpenOrCreate);
            BinaryWriter bw = new BinaryWriter(fs);
            bw.Write(b, 0, len);
            bw.Close();
            fs.Close();
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/HjimiCamera.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
using System;
using System.IO;
using System.Collections;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using OpenCvSharp;
namespace FaceAI
{
    class HjimiCamera
    {
        // åŽæ°è‰¾ç±³ èŽ·å–æ‘„åƒå¤´è®¾å¤‡å¯¹è±¡
        [DllImport("AimiCamera.dll", EntryPoint = "new_hjimi", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr new_hjimi();
        // åŽæ°è‰¾ç±³ é‡Šæ”¾æ‘„像头设备对象
        [DllImport("AimiCamera.dll", EntryPoint = "hjimi_release", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        public static extern void hjimi_release(IntPtr hjimi);
        // åŽæ°è‰¾ç±³ æ‰“开摄像头设备对象  ä¼ å…¥opencv视频帧rgb和depth的mat
        [DllImport("AimiCamera.dll", EntryPoint = "open_hjimimat", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        public static extern bool open_hjimimat(IntPtr hjimi, IntPtr rgb_mat, IntPtr depth_mat);
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/ImageUtil.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
using System;
using System.IO;
using OpenCvSharp;
using System.Drawing;
namespace FaceAI
{
    class ImageUtil
    {
        // å›¾ç‰‡æ–‡ä»¶è½¬Base64String
        public static string img2byte(string filePath)
        {
            // åªä¿ç•™æ–‡ä»¶åï¼Œé¿å…è·¯å¾„错误
            string fileName = Path.GetFileName(filePath);
            // èŽ·å–æ–‡ä»¶çš„å®Œæ•´è·¯å¾„
            string fullPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "image", fileName);
            if (!File.Exists(fullPath))
            {
                throw new FileNotFoundException("文件不存在:" + fullPath);
            }
            using (FileStream filestream = new FileStream(fullPath, FileMode.Open, FileAccess.Read))
            {
                byte[] arr = new byte[filestream.Length];
                filestream.Read(arr, 0, arr.Length);
                return Convert.ToBase64String(arr);
            }
            ////将Image转换成流数据,并保存为byte[]
            //MemoryStream mstream = new MemoryStream();
            //img.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg);
            //byte[] byData = new Byte[mstream.Length];
            //mstream.Position = 0;
            //mstream.Read(byData, 0, byData.Length);
            //mstream.Close();
            //return byData;
        }
        // å›¾ç‰‡æ–‡ä»¶è½¬bytes
        public static byte[] get_img_data(string img_path)
        {
            //根据图片文件的路径使用文件流打开,并保存为byte[]
            FileStream fs = new FileStream(img_path, FileMode.Open);//可以是其他重载方法
            byte[] byData = new byte[fs.Length];
            fs.Read(byData, 0, byData.Length);
            fs.Close();
            return byData;
        }
        // bytes转图片文件
        //public static void byte2img(byte[] b, int len, string file_name)
        //{
        //    MemoryStream ms = new MemoryStream(b);
        //    ms.Position = 0;
        //    System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
        //    img.Save(file_name);
        //    ms.Close();
        //}
        //// äºŒè¿›åˆ¶byte图片流转mat示例
        //public static Mat image2mat(string img_path)
        //{
        //    System.Drawing.Image img = System.Drawing.Image.FromFile(img_path);
        //    byte[] img_bytes = ImageUtil.img2byte(img);
        //    Mat mat = Cv2.ImDecode(img_bytes, ImreadModes.Color);
        //    return mat;
        //}
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/OrbeCamera.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
// é€‚配奥比中光镜头
namespace FaceAI
{
    class OrbeCamera
    {
        // èŽ·å–orbeCamera对象  å¥¥æ¯”中光海燕等众多奥比镜头
        [DllImport("OrbeCamera.dll", EntryPoint = "new_orbe", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr new_orbe();
        // æ‰“开奥比中光
        [DllImport("OrbeCamera.dll", EntryPoint = "open_orbe", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        public static extern int open_orbe(IntPtr porbe, IntPtr cv_rgb, IntPtr cv_depth);
        // é‡Šæ”¾å¥¥æ¯”中光
        [DllImport("OrbeCamera.dll", EntryPoint = "orbe_release", CharSet = CharSet.Ansi
           , CallingConvention = CallingConvention.Cdecl)]
        public static extern void orbe_release(IntPtr orbe);
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/FaceAI/TimeUtil.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FaceAI
{
    class TimeUtil
    {
        public static long get_time_stamp()
        {
            TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1);
            return (long)ts.TotalMilliseconds;
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj
@@ -7,8 +7,15 @@
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Baidu.AI" Version="4.15.16" />
    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
    <PackageReference Include="NLog" Version="5.4.0" />
  </ItemGroup>
  <ItemGroup>
    <Reference Include="OpenCvSharp">
      <HintPath>bin\Release\face-resource\x86\OpenCvSharp.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/ISys_UserService.cs
@@ -76,7 +76,7 @@
        WebResponseContent DeleteUserIsface(string account);
        string FaceCompareFeature(string file1, string file2);
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs
@@ -30,6 +30,13 @@
        {
            _httpContextAccessor = httpContextAccessor;
        }
        [HttpPost, Route("FaceCompareFeature"), AllowAnonymous]
        public WebResponseContent FaceCompareFeature(string file1, string file2)
        {
            var score = Service.FaceCompareFeature(file1, file2);
            return WebResponseContent.Instance.OK(data: "data:" + score);
        }
        [HttpPost, Route("swgLogin"), AllowAnonymous]
        public dynamic SwgLogin([FromBody] SwaggerLoginRequest loginRequest)
        {
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs
@@ -24,6 +24,7 @@
using WIDESEAWCS_Server.HostedService;
using WIDESEAWCS_Server.Filter;
using WIDESEAWCS_Tasks.OHT;
using Baidu.Aip.Face;
var builder = WebApplication.CreateBuilder(args);
@@ -115,7 +116,7 @@
app.UseApplicationSetup();//启动配置
app.UseAllServicesMiddle(builder.Services);
FaceAI.Face.Main();
app.UseSession();
//if (app.Environment.IsDevelopment())
{
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
@@ -67,6 +67,7 @@
    </ItemGroup>
    <ItemGroup>
        <ProjectReference Include="..\WIDESEAWCS_Common\WIDESEAWCS_Common.csproj" />
        <ProjectReference Include="..\WIDESEAWCS_SystemServices\WIDESEAWCS_SystemServices.csproj" />
        <ProjectReference Include="..\WIDESEAWCs_TaskInfoService\WIDESEAWCs_TaskInfoService.csproj" />
        <ProjectReference Include="..\WIDESEAWCS_Tasks\WIDESEAWCS_Tasks.csproj" />
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
@@ -17,7 +17,7 @@
  //5.PostgreSQL
  "DBType": "SqlServer",
  //连接字符串
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWCS_MXSSG;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWCS_MXSSG;User ID=sa;Password=sa123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
@@ -34,7 +34,7 @@
  "ExpMinutes": 120,
  "QuartzJobAutoStart": true,
  "LogDeubgEnable": true, //是否记录调试日志
  "PrintSql": true, //打印SQL语句
  "PrintSql": false, //打印SQL语句
  "LogAOPEnable": true, //是否记录AOP日志
  "WebSocketEnable": true,
  "WebSocketPort": 9260
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserService.cs
@@ -14,6 +14,7 @@
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using WIDESEAWCS_Common;
using FaceAI;
namespace WIDESEAWCS_SystemServices
{
@@ -129,6 +130,9 @@
                    }
                    var faceResult = BaiDuFaceHelper.FaceSearch(loginInfo.path, groupId);
                    if (faceResult != null && faceResult.error_code == 0)
                    {
                        var bestMatch = faceResult.result.user_list.OrderByDescending(u => u.score).FirstOrDefault();
@@ -230,6 +234,53 @@
            return content;
        }
        /// <summary>
        /// 1:N äººè„¸æœç´¢æŽ¥å£
        /// </summary>
        /// <param name="image">图片信息(**总数据大小应小于10M**),图片上传方式根据image_type来判断</param>
        /// <param name="imageType">图片类型     <br> **BASE64**:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M; <br>**URL**:图片的 URL地址( å¯èƒ½ç”±äºŽç½‘络等原因导致下载图片时间过长); <br>**FACE_TOKEN**: äººè„¸å›¾ç‰‡çš„唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。</param>
        /// <param name="groupIdList">从指定的group中进行查找 ç”¨é€—号分隔,**上限20个**</param>
        /// </param>
        /// <return>JObject</return>
        ///
        public string FaceSearch(string image, string imageType, string groupIdList, string userId)
        {
            string result = "";
            switch (imageType)
            {
                case "base64":
                    //result = FaceCompare.FaceIdentifyByBuffer(image, groupIdList, userId);
                    break;
                case "url":
                    result = FaceCompare.FaceIdentify(image, groupIdList, userId);
                    break;
                case "token":
                    result = FaceCompare.FaceIdentifyByFeature(image, groupIdList, userId);
                    break;
                default:
                    break;
            }
            return result;
        }
        /// <summary>
        /// é€šè¿‡ç‰¹å¾å€¼æ¯”对(1:1) å¯¹äººè„¸ç‰¹å¾å€¼è¿›è¡Œæ¯”较,可返回人脸特征相似分值(百分制)
        /// </summary>
        /// <param name="file1">传图片路径</param>
        /// <param name="file2">传图片路径</param>
        /// <returns></returns>
        public string FaceCompareFeature(string file1, string file2)
        {
            try
            {
                string result = FaceCompare.FaceCompareFeature(file1, file2);
                return result;
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        public override WebResponseContent UpdateData(SaveModel saveModel)
        {
            UpdateIgnoreColOnExecute = x =>
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_TelescopicService/WIDESEAWCS_TelescopicService.csproj
@@ -7,6 +7,7 @@
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\WIDESEAWCS_Common\WIDESEAWCS_Common.csproj" />
    <ProjectReference Include="..\WIDESEAWCS_ITelescopicService\WIDESEAWCS_ITelescopicService.csproj" />
  </ItemGroup>