Commit 9f290ba6 authored by 罗超's avatar 罗超

初始化项目

parent 2d712e8c
Pipeline #101 failed with stages
ArcFaceSDK/bin/
ArcFaceSDK/obj/
ArcSoftFace/bin/
ArcSoftFace/obj/
packages/
doc/
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{1A4BA5F4-BA56-4E34-8CB8-9DA8BF354CF8}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ArcFaceSDK</RootNamespace>
<AssemblyName>ArcFaceSDK</AssemblyName>
<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Entity\ActiveFileInfo.cs" />
<Compile Include="Entity\AgeInfo.cs" />
<Compile Include="Entity\Face3DAngle.cs" />
<Compile Include="Entity\FaceFeature.cs" />
<Compile Include="Entity\GenderInfo.cs" />
<Compile Include="Entity\ImageInfo.cs" />
<Compile Include="Entity\LivenessInfo.cs" />
<Compile Include="Entity\MultiFaceInfo.cs" />
<Compile Include="Entity\SDKVersion.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="FaceEngine.cs" />
<Compile Include="SDKModels\ASF_ActiveFileInfo.cs" />
<Compile Include="SDKModels\ASF_AgeInfo.cs" />
<Compile Include="SDKModels\ASF_CompareModel.cs" />
<Compile Include="SDKModels\ASF_DetectModel.cs" />
<Compile Include="SDKModels\ASF_Face3DAngle.cs" />
<Compile Include="SDKModels\ASF_FaceFeature.cs" />
<Compile Include="SDKModels\ASF_GenderInfo.cs" />
<Compile Include="SDKModels\ASF_ImageData.cs" />
<Compile Include="SDKModels\ASF_ImagePixelFormat.cs" />
<Compile Include="SDKModels\ASF_LivenessInfo.cs" />
<Compile Include="SDKModels\ASF_LivenessThreshold.cs" />
<Compile Include="SDKModels\ASF_MultiFaceInfo.cs" />
<Compile Include="SDKModels\ASF_OrientCode.cs" />
<Compile Include="SDKModels\ASF_OrientPriority.cs" />
<Compile Include="SDKModels\ASF_SingleFaceInfo.cs" />
<Compile Include="SDKModels\ASF_VERSION.cs" />
<Compile Include="SDKModels\DetectionMode.cs" />
<Compile Include="SDKModels\FaceEngineMask.cs" />
<Compile Include="SDKModels\MRECT.cs" />
<Compile Include="Utils\ASFFunctions.cs" />
<Compile Include="Utils\CommonUtil.cs" />
<Compile Include="Utils\ErrorCodeUtil.cs" />
<Compile Include="Utils\ImageUtil.cs" />
<Compile Include="Utils\MemoryUtil.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
\ No newline at end of file
namespace ArcFaceSDK.Entity
{
/// <summary>
/// 激活文件信息
/// </summary>
public class ActiveFileInfo
{
/// <summary>
/// 开始时间
/// </summary>
public string startTime { get; set; }
/// <summary>
/// 截止时间
/// </summary>
public string endTime { get; set; }
/// <summary>
/// 平台
/// </summary>
public string platform { get; set; }
/// <summary>
/// sdk类型
/// </summary>
public string sdkType { get; set; }
/// <summary>
/// APPID
/// </summary>
public string appId { get; set; }
/// <summary>
/// SDKKEY
/// </summary>
public string sdkKey { get; set; }
/// <summary>
/// SDK版本号
/// </summary>
public string sdkVersion { get; set; }
/// <summary>
/// 激活文件版本号
/// </summary>
public string fileVersion { get; set; }
}
}
namespace ArcFaceSDK.Entity
{
/// <summary>
/// 年龄结果对象
/// </summary>
public class AgeInfo
{
/// <summary>
/// 年龄检测结果集合
/// </summary>
public int[] ageArray { get; set; }
/// <summary>
/// 结果集大小
/// </summary>
public int num { get; set; }
}
}
namespace ArcFaceSDK.Entity
{
/// <summary>
/// 3D人脸角度检测结构体
/// </summary>
public class Face3DAngle
{
/// <summary>
/// 俯仰角
/// </summary>
public float[] pitch { get; set; }
/// <summary>
/// 横滚角
/// </summary>
public float[] roll { get; set; }
/// <summary>
/// 偏航角
/// </summary>
public float[] yaw { get; set; }
/// <summary>
/// 是否检测成功,0成功,其他为失败
/// </summary>
public int[] status { get; set; }
/// <summary>
/// 结果集大小
/// </summary>
public int num { get; set; }
}
}

namespace ArcFaceSDK.Entity
{
/// <summary>
/// 人脸特征
/// </summary>
public class FaceFeature
{
/// <summary>
/// 特征值 byte[]
/// </summary>
public byte[] feature { get; set; }
/// <summary>
/// 结果集大小
/// </summary>
public int featureSize { get; set; }
}
}
namespace ArcFaceSDK.Entity
{
/// <summary>
/// 性别结果
/// </summary>
public class GenderInfo
{
/// <summary>
/// 性别检测结果集合
/// </summary>
public int[] genderArray { get; set; }
/// <summary>
/// 结果集大小
/// </summary>
public int num { get; set; }
}
}
using System;
namespace ArcFaceSDK.Entity
{
public class ImageInfo
{
/// <summary>
/// 图片的像素数据
/// </summary>
public IntPtr imgData { get; set; }
/// <summary>
/// 图片像素宽
/// </summary>
public int width { get; set; }
/// <summary>
/// 图片像素高
/// </summary>
public int height { get; set; }
/// <summary>
/// 图片格式
/// </summary>
public int format { get; set; }
/// <summary>
/// 步长
/// </summary>
public int widthStep { get; set; }
}
}
namespace ArcFaceSDK.Entity
{
public class LivenessInfo
{
/// <summary>
/// 是否是真人
/// 0:非真人;1:真人;-1:不确定;-2:传入人脸数>1;
/// </summary>
public int[] isLive { get; set; }
/// <summary>
/// 结果集大小
/// </summary>
public int num { get; set; }
}
}
using ArcFaceSDK.SDKModels;
namespace ArcFaceSDK.Entity
{
/// <summary>
/// 多人脸检测
/// </summary>
public class MultiFaceInfo
{
/// <summary>
/// 人脸Rect结果集
/// </summary>
public MRECT[] faceRects { get; set; }
/// <summary>
/// 人脸角度结果集,与faceRects一一对应 对应ASF_OrientCode
/// </summary>
public int[] faceOrients { get; set; }
/// <summary>
/// 结果集大小
/// </summary>
public int faceNum { get; set; }
/// <summary>
/// face ID,IMAGE模式下不返回FaceID
/// </summary>
public int[] faceID { get; set; }
}
}
namespace ArcFaceSDK.Entity
{
/// <summary>
/// SDK版本信息
/// </summary>
public class SDKVersion
{
/// <summary>
/// 版本号
/// </summary>
public string version { get; set; }
/// <summary>
/// 构建日期
/// </summary>
public string buildDate { get; set; }
/// <summary>
/// Copyright
/// </summary>
public string copyRight { get; set; }
}
}
This diff is collapsed.
using System.Reflection;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("ArcFaceSDK")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ArcFaceSDK")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
//将 ComVisible 设置为 false 将使此程序集中的类型
//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("1a4ba5f4-ba56-4e34-8cb8-9da8bf354cf8")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
using System;
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 激活文件信息
/// </summary>
public struct ASF_ActiveFileInfo
{
/// <summary>
/// 开始时间
/// </summary>
public IntPtr startTime;
/// <summary>
/// 截止时间
/// </summary>
public IntPtr endTime;
/// <summary>
/// 平台
/// </summary>
public IntPtr platform;
/// <summary>
/// sdk类型
/// </summary>
public IntPtr sdkType;
/// <summary>
/// APPID
/// </summary>
public IntPtr appId;
/// <summary>
/// SDKKEY
/// </summary>
public IntPtr sdkKey;
/// <summary>
/// SDK版本号
/// </summary>
public IntPtr sdkVersion;
/// <summary>
/// 激活文件版本号
/// </summary>
public IntPtr fileVersion;
}
}
using System;
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 年龄结果结构体
/// </summary>
public struct ASF_AgeInfo
{
/// <summary>
/// 年龄检测结果集合
/// </summary>
public IntPtr ageArray;
/// <summary>
/// 结果集大小
/// </summary>
public int num;
}
}
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 人脸比对可选的模型
/// </summary>
public enum ASF_CompareModel
{
/// <summary>
/// 用于生活照之间的特征比对,推荐阈值0.80
/// </summary>
ASF_LIFE_PHOTO = 0x1,
/// <summary>
/// 用于证件照或生活照与证件照之间的特征比对,推荐阈值0.82
/// </summary>
ASF_ID_PHOTO = 0x2
}
}
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 检测模型
/// </summary>
public enum ASF_DetectModel
{
/// <summary>
/// RGB图像检测模型
/// </summary>
ASF_DETECT_MODEL_RGB = 0x1
}
}
using System;
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 3D人脸角度检测结构体,可参考https://ai.arcsoft.com.cn/bbs/forum.php?mod=viewthread&tid=1459&page=1&extra=&_dsign=fd9e1a7a
/// </summary>
public struct ASF_Face3DAngle
{
/// <summary>
/// 横滚角
/// </summary>
public IntPtr roll;
/// <summary>
/// 偏航角
/// </summary>
public IntPtr yaw;
/// <summary>
/// 俯仰角
/// </summary>
public IntPtr pitch;
/// <summary>
/// 是否检测成功,0成功,其他为失败
/// </summary>
public IntPtr status;
/// <summary>
/// 结果集大小
/// </summary>
public int num;
}
}
using System;
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 人脸特征结构体
/// </summary>
public struct ASF_FaceFeature
{
/// <summary>
/// 特征值 byte[]
/// </summary>
public IntPtr feature;
/// <summary>
/// 结果集大小
/// </summary>
public int featureSize;
}
}
using System;
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 性别结构体
/// </summary>
public struct ASF_GenderInfo
{
/// <summary>
/// 性别检测结果集合
/// </summary>
public IntPtr genderArray;
/// <summary>
/// 结果集大小
/// </summary>
public int num;
}
}
using System;
using System.Runtime.InteropServices;
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 图像数据
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct ASF_ImageData
{
/// <summary>
/// 图片格式
/// </summary>
public uint u32PixelArrayFormat;
/// <summary>
/// 宽
/// </summary>
public int i32Width;
/// <summary>
/// 高
/// </summary>
public int i32Height;
/// <summary>
/// 图像数据
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public IntPtr[] ppu8Plane;
/// <summary>
/// 步长
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.I4)]
public int[] pi32Pitch;
}
}
namespace ArcFaceSDK.SDKModels
{
public enum ASF_ImagePixelFormat
{
/// <summary>
/// RGB24图片格式
/// </summary>
ASVL_PAF_RGB24_B8G8R8 = 0x201,
/// <summary>
/// GRAY图片格式
/// </summary>
ASVL_PAF_GRAY = 0x701
}
}
using System;
namespace ArcFaceSDK.SDKModels
{
public struct ASF_LivenessInfo
{
/// <summary>
/// 是否是真人
/// 0:非真人;1:真人;-1:不确定;-2:传入人脸数>1;
/// </summary>
public IntPtr isLive;
/// <summary>
/// 结果集大小
/// </summary>
public int num;
}
}
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 活体置信度
/// </summary>
public struct ASF_LivenessThreshold
{
/// <summary>
/// RGB活体阈值 取值范围[0,1]
/// </summary>
public float thresholdmodel_BGR;
/// <summary>
/// IR活体阈值 取值范围[0,1]
/// </summary>
public float thresholdmodel_IR;
}
}
using System;
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 多人脸检测结构体
/// </summary>
public struct ASF_MultiFaceInfo
{
/// <summary>
/// 人脸Rect结果集
/// </summary>
public IntPtr faceRects;
/// <summary>
/// 人脸角度结果集,与faceRects一一对应 对应ASF_OrientCode
/// </summary>
public IntPtr faceOrients;
/// <summary>
/// 结果集大小
/// </summary>
public int faceNum;
/// <summary>
/// face ID,IMAGE模式下不返回FaceID
/// </summary>
public IntPtr faceID;
}
}
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 人脸角度结构体
/// </summary>
public enum ASF_OrientCode
{
ASF_OC_0 = 0x1,
ASF_OC_90 = 0x2,
ASF_OC_270 = 0x3,
ASF_OC_180 = 0x4,
ASF_OC_30 = 0x5,
ASF_OC_60 = 0x6,
ASF_OC_120 = 0x7,
ASF_OC_150 = 0x8,
ASF_OC_210 = 0x9,
ASF_OC_240 = 0xa,
ASF_OC_300 = 0xb,
ASF_OC_330 = 0xc
}
}

namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 人脸检测优先角度结构体,推荐ASF_OP_0_HIGHER_EXT
/// </summary>
public enum ASF_OrientPriority
{
/// <summary>
/// 常规预览下正方向
/// </summary>
ASF_OP_0_ONLY = 0x1,
/// <summary>
/// 基于0°逆时针旋转90°的方向
/// </summary>
ASF_OP_90_ONLY = 0x2,
/// <summary>
/// 基于0°逆时针旋转270°的方向
/// </summary>
ASF_OP_270_ONLY = 0x3,
/// <summary>
/// 基于0°旋转180°的方向(逆时针、顺时针效果一样)
/// </summary>
ASF_OP_180_ONLY = 0x4,
/// <summary>
/// 全角度
/// </summary>
ASF_OP_ALL_OUT = 0x5
}
}
using System;
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 单人脸检测结构体
/// </summary>
public struct SingleFaceInfo
{
/// <summary>
/// 人脸坐标Rect结果
/// </summary>
public MRECT faceRect;
/// <summary>
/// 人脸角度
/// </summary>
public int faceOrient;
/// <summary>
/// face ID,IMAGE模式下不返回FaceID
/// </summary>
public int faceID;
}
}
using System;
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// SDK版本信息结构体
/// </summary>
public struct ASF_VERSION
{
/// <summary>
/// 版本号
/// </summary>
public IntPtr Version;
/// <summary>
/// 构建日期
/// </summary>
public IntPtr BuildDate;
/// <summary>
/// Copyright
/// </summary>
public IntPtr CopyRight;
}
}
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 检测模式
/// </summary>
public enum DetectionMode : uint
{
/// <summary>
/// Video模式,一般用于多帧连续检测
/// </summary>
ASF_DETECT_MODE_VIDEO = 0x00000000,
/// <summary>
/// Image模式,一般用于静态图的单次检测
/// </summary>
ASF_DETECT_MODE_IMAGE = 0xFFFFFFFF
}
}
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 引擎方法类型结构体,在初始化时将用到的类型用|连接传入,如 ASF_NONE|ASF_FACE_DETECT|ASF_FACERECOGNITION
/// </summary>
public struct FaceEngineMask
{
/// <summary>
/// 不做方法初始化方法类型
/// </summary>
public const int ASF_NONE = 0x00000000;
/// <summary>
/// 人脸检测方法类型常量
/// </summary>
public const int ASF_FACE_DETECT = 0x00000001;
/// <summary>
/// 人脸识别方法类型常量,包含图片feature提取和feature比对
/// </summary>
public const int ASF_FACERECOGNITION = 0x00000004;
/// <summary>
/// 年龄检测方法类型常量
/// </summary>
public const int ASF_AGE = 0x00000008;
/// <summary>
/// 性别检测方法类型常量
/// </summary>
public const int ASF_GENDER = 0x00000010;
/// <summary>
/// 3D角度检测方法类型常量
/// </summary>
public const int ASF_FACE3DANGLE = 0x00000020;
/// <summary>
/// RGB活体
/// </summary>
public const int ASF_LIVENESS = 0x00000080;
/// <summary>
/// 红外活体
/// </summary>
public const int ASF_IR_LIVENESS = 0x00000400;
}
}
using System;
namespace ArcFaceSDK.SDKModels
{
/// <summary>
/// 人脸框信息结构体
/// </summary>
public struct MRECT
{
/// <summary>
/// 左侧坐标
/// </summary>
public int left;
/// <summary>
/// 上侧坐标
/// </summary>
public int top;
/// <summary>
/// 右侧坐标
/// </summary>
public int right;
/// <summary>
/// 下侧坐标
/// </summary>
public int bottom;
}
}
This diff is collapsed.

using ArcFaceSDK.Entity;
using ArcFaceSDK.SDKModels;
using System;
namespace ArcFaceSDK.Utils
{
/// <summary>
/// 公用方法
/// </summary>
public static class CommonUtil
{
/// <summary>
/// 转化活体检测结果
/// </summary>
/// <param name="liveness">活体检测值</param>
/// <returns></returns>
public static string TransLivenessResult(int liveness)
{
string rel;
switch (liveness)
{
case 0: rel = "非真人"; break;
case 1: rel = "真人"; break;
case -2: rel = "传入人脸数>1"; break;
case -3: rel = "人脸过小"; break;
case -4: rel = "角度过大"; break;
case -5: rel = "人脸超出边界"; break;
default:
rel = "不确定"; break;
}
return rel;
}
/// <summary>
/// 将ImageInfo对象转化为ASF_ImageData结构体
/// </summary>
/// <param name="imageInfo">ImageInfo对象</param>
/// <returns>ASF_ImageData结构体</returns>
public static ASF_ImageData TransImageDataStructByImageInfo(ImageInfo imageInfo)
{
ASF_ImageData asfImageData = new ASF_ImageData();
asfImageData.i32Width = imageInfo.width;
asfImageData.i32Height = imageInfo.height;
asfImageData.u32PixelArrayFormat = (uint)imageInfo.format;
asfImageData.pi32Pitch = new int[4];
asfImageData.ppu8Plane = new IntPtr[4];
asfImageData.pi32Pitch[0] = imageInfo.widthStep;
asfImageData.ppu8Plane[0] = imageInfo.imgData;
return asfImageData;
}
}
}
namespace ArcFaceSDK.Utils
{
/// <summary>
/// 接口封装时定义的错误码
/// </summary>
public static class ErrorCodeUtil
{
/// <summary>
/// image不能为空
/// </summary>
public const int IMAGE_IS_NULL = -1001;
/// <summary>
/// 图像数据读取失败
/// </summary>
public const int IMAGE_DATA_READ_FAIL = -1002;
/// <summary>
/// multiFaceInfo 不能为空
/// </summary>
public const int MULPTIFACEINFO_IS_NULL = -1101;
/// <summary>
/// faceIndex 不合法
/// </summary>
public const int FACEINDEX_INVALID = -1102;
/// <summary>
/// faceFeature1或faceFeature2 不能为空
/// </summary>
public const int FEATURE_IS_NULL = -1103;
}
}
This diff is collapsed.
using System;
using System.Runtime.InteropServices;
namespace ArcFaceSDK.Utils
{
/// <summary>
/// 内存操作方法
/// </summary>
public static class MemoryUtil
{
/// <summary>
/// 申请内存
/// </summary>
/// <param name="len">内存长度(单位:字节)</param>
/// <returns>内存首地址</returns>
public static IntPtr Malloc(int len)
{
return Marshal.AllocHGlobal(len);
}
/// <summary>
/// 释放ptr托管的内存
/// </summary>
/// <param name="ptr">托管指针</param>
public static void Free(IntPtr ptr)
{
Marshal.FreeHGlobal(ptr);
}
/// <summary>
/// 释放多个ptr托管的内存
/// </summary>
/// <param name="ptr">托管指针</param>
public static void FreeArray(params IntPtr[] ptrList)
{
if (ptrList != null && ptrList.Length > 0)
{
foreach (IntPtr subPtr in ptrList)
{
if (!subPtr.Equals(IntPtr.Zero))
{
Marshal.FreeHGlobal(subPtr);
}
}
}
}
/// <summary>
/// 将字节数组的内容拷贝到托管内存中
/// </summary>
/// <param name="source">元数据</param>
/// <param name="startIndex">元数据拷贝起始位置</param>
/// <param name="destination">托管内存</param>
/// <param name="length">拷贝长度</param>
public static void Copy(byte[] source, int startIndex, IntPtr destination, int length)
{
Marshal.Copy(source, startIndex, destination, length);
}
/// <summary>
/// 将托管内存的内容拷贝到字节数组中
/// </summary>
/// <param name="source">托管内存</param>
/// <param name="destination">目标字节数组</param>
/// <param name="startIndex">拷贝起始位置</param>
/// <param name="length">拷贝长度</param>
public static void Copy(IntPtr source, byte[] destination, int startIndex, int length)
{
Marshal.Copy(source, destination, startIndex, length);
}
/// <summary>
/// 将ptr托管的内存转化为结构体对象
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="ptr">托管指针</param>
/// <returns>转化后的对象</returns>
public static T PtrToStructure<T>(IntPtr ptr)
{
return Marshal.PtrToStructure<T>(ptr);
}
/// <summary>
/// 将结构体对象复制到ptr托管的内存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="ptr"></param>
public static void StructureToPtr<T>(T t, IntPtr ptr)
{
if(t == null)
{
return;
}
Marshal.StructureToPtr(t, ptr, false);
}
/// <summary>
/// 获取类型的大小
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <returns>类型的大小</returns>
public static int SizeOf<T>()
{
return Marshal.SizeOf<T>();
}
/// <summary>
/// 从struct转换到byte[]
/// </summary>
/// <param name="structObj"></param>
/// <returns></returns>
public static byte[] StructToBytes(object structObj)
{
//返回类的非托管大小(以字节为单位)
int size = Marshal.SizeOf(structObj);
//分配大小
byte[] bytes = new byte[size];
//从进程的非托管堆中分配内存给structPtr
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将数据从托管对象structObj封送到非托管内存块structPtr
Marshal.StructureToPtr(structObj, structPtr, false);
//将数据从非托管内存指针复制到托管 8 位无符号整数数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放以前使用 AllocHGlobal 从进程的非托管内存中分配的内存
Marshal.FreeHGlobal(structPtr);
return bytes;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<appSettings>
<!-- SDK APPID 请到官网https://ai.arcsoft.com.cn/index.html中申请 -->
<add key="APPID" value="CwwpXiKnDgcSKq7aE7WW7jx1BeARs6MJp16mWXUK8HL" />
<!-- //与win64 SDK对应 请到官网https://ai.arcsoft.com.cn/index.html中申请 -->
<add key="SDKKEY64" value="55vtTtx15JBDEsu7Ux9sx1NHYbV8D5Ee7Pf7tAQDBoBg" />
<!-- 与win32 SDK对应 请到官网https://ai.arcsoft.com.cn/index.html中申请 -->
<add key="SDKKEY32" value="" />
<!-- 摄像头索引,索引从0开始,如果仅有一个摄像头请两个参数的值都设为0 -->
<!--RGB摄像头索引-->
<add key="RGB_CAMERA_INDEX" value="0" />
<!--IR摄像头索引-->
<add key="IR_CAMERA_INDEX" value="1" />
<!--视频模式:FR失败重试次数-->
<add key="FR_MATCH_TIME" value="100" />
<!--视频模式:活体检测失败重试次数-->
<add key="LIVENESS_MATCH_TIME" value="100" />
</appSettings>
<!--以下是日志的配置,无需关注-->
<log4net>
<root name="loginfo">
<!--定义记录的日志级别 OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL -->
<level value="OFF" />
<!--定义记录的日志级别-->
<appender-ref ref="RollingLogFileAppender" />
<!--记录到什么介质中-->
</root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--输出日志的编码方式(可以解决中文乱码)-->
<param name="Encoding" value="utf-8" />
<!--创建日志文件的方式-->
<param name="RollingStyle" value="date" />
<!--日志文件存储在程序运行时目录的 Logs 文件夹中-->
<param name="File" value="Logs\" />
<!--日志文件名格式-->
<param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" />
<!--日志文件名是否为静态-->
<param name="StaticLogFileName" value="false" />
<!--备份日志数量-->
<param name="MaxSizeRollBackups" value="10" />
<!--是否是向文件中追加日志-->
<param name="AppendToFile" value="true" />
<!--日志信息排版模式-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%n%-6p%d{yyyy-MM-dd HH:mm:ss:fff}%n消息:%m%n位置:%l%n" />
</layout>
</appender>
</log4net>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
\ No newline at end of file
This diff is collapsed.
using System.Collections.Generic;
namespace ArcSoftFace.Entity
{
/// <summary>
/// 字典控制实体类
/// </summary>
public class DictionaryUnit<T1, T2>
{
/// <summary>
/// 锁
/// </summary>
private readonly object locker = new object();
/// <summary>
/// 字典
/// </summary>
private readonly Dictionary<T1, T2> dict = new Dictionary<T1, T2>();
/// <summary>
/// 获取字典的大小
/// </summary>
/// <returns></returns>
public int GetDictCount()
{
lock (locker)
{
return dict.Count;
}
}
/// <summary>
/// 获取所有元素
/// </summary>
/// <returns></returns>
public Dictionary<T1, T2> GetAllElement()
{
lock (locker)
{
return dict;
}
}
/// <summary>
/// 刷新元素,移除无用元素
/// </summary>
/// <param name="keyList">有效Key列表</param>
public void RefershElements(List<T1> keyList)
{
lock (locker)
{
List<T1> tempKeyList = new List<T1>();
tempKeyList.AddRange(dict.Keys);
foreach (T1 key in tempKeyList)
{
if (!keyList.Contains(key))
{
dict.Remove(key);
}
}
}
}
/// <summary>
/// 根据键获取某个值
/// </summary>
/// <param name="key">键</param>
/// <returns>值</returns>
public T2 GetElementByKey(T1 key)
{
lock (locker)
{
if (dict.ContainsKey(key))
{
return dict[key];
}
else
{
return default(T2);
}
}
}
/// <summary>
/// 添加/更新元素
/// </summary>
/// <param name="key">元素-键</param>
/// <param name="value">元素-值</param>
public void AddDictionaryElement(T1 key,T2 value)
{
lock (locker)
{
if (dict.ContainsKey(key))
{
dict[key] = value;
}
else
{
dict.Add(key, value);
}
}
}
/// <summary>
/// 更新元素
/// </summary>
/// <param name="key">元素-键</param>
/// <param name="value">元素-值</param>
public void UpdateDictionaryElement(T1 key, T2 value)
{
lock (locker)
{
if (dict.ContainsKey(key))
{
dict[key] = value;
}
}
}
/// <summary>
/// 移除所有元素
/// </summary>
public void ClearAllElement()
{
lock (locker)
{
dict.Clear();
}
}
/// <summary>
/// 判断是否包含之间的键
/// </summary>
/// <param name="key">键</param>
/// <returns></returns>
public bool ContainsKey(T1 key)
{
lock (locker)
{
return dict.ContainsKey(key);
}
}
}
}
using ArcFaceSDK.SDKModels;
using ArcFaceSDK.Utils;
namespace ArcSoftFace.Entity
{
/// <summary>
/// 视频检测缓存实体类
/// </summary>
public class FaceTrackUnit
{
/// <summary>
/// 人脸ID
/// </summary>
public int FaceId { get; set; }
/// <summary>
/// 人脸框
/// </summary>
public MRECT Rect { get; set; }
/// <summary>
/// 相似度结果
/// </summary>
public string Similarity { get; set; }
/// <summary>
/// 人脸定位
/// </summary>
public int FaceIndex = -1;
/// <summary>
/// Rgb活体
/// </summary>
public int RgbLiveness = -1;
/// <summary>
/// IR活体
/// </summary>
public int IrLiveness = -1;
/// <summary>
/// 人脸角度
/// </summary>
public int FaceOrient { get; set; }
/// <summary>
/// 构造函数
/// </summary>
public FaceTrackUnit() { }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="faceId">人脸Faceid</param>
/// <param name="rect">人脸框坐标</param>
/// <param name="faceOrient">人脸角度</param>
public FaceTrackUnit(int faceId, MRECT rect,int faceOrient)
{
FaceId = faceId;
Rect = rect;
FaceOrient = faceOrient;
}
/// <summary>
/// 设置匹配人脸Index和相似度
/// </summary>
/// <param name="faceIndex">匹配人脸Index</param>
/// <param name="similarity">相似度</param>
public void SetFaceIndexAndSimilarity(int faceIndex, string similarity)
{
if (faceIndex >= 0)
{
FaceIndex = faceIndex;
Similarity = similarity;
}
}
/// <summary>
/// 获取组合消息
/// </summary>
/// <returns></returns>
public string GetCombineMessage()
{
return string.Format("{0}|{1}|{2}",FaceIndex>=0?string.Format("{0}号:{1}", FaceIndex, Similarity) :string.Empty,
string.Format("RGB:{0}",CommonUtil.TransLivenessResult(RgbLiveness)),
FaceId >= 0 ? string.Format("faceId:{0}", FaceId) : string.Empty).Trim();
}
/// <summary>
/// 获取Ir活体检测文本
/// </summary>
/// <returns></returns>
public string GetIrLivenessMessage()
{
return string.Format("IR:{0}", CommonUtil.TransLivenessResult(IrLiveness));
}
/// <summary>
/// 是否成功匹配
/// </summary>
/// <returns></returns>
public bool CertifySuccess()
{
return RgbLiveness.Equals(1) && FaceIndex >= 0;
}
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
using System;
using System.Windows.Forms;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace ArcSoftFace
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FaceForm());
}
}
}
using System.Reflection;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("ArcSoftFace")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ArcSoftFace")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
//将 ComVisible 设置为 false 将使此程序集中的类型
//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("de7c796a-ff54-47da-be17-42d977dc7261")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ArcSoftFace.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ArcSoftFace.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 使用此强类型资源类,为所有资源查找
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。
/// </summary>
internal static System.Drawing.Icon favicon {
get {
object obj = ResourceManager.GetObject("favicon", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="favicon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\favicon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>
\ No newline at end of file
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ArcSoftFace.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
This diff is collapsed.
using log4net;
using System;
namespace ArcSoftFace.Utils
{
/// <summary>
/// Log工具类
/// </summary>
public static class LogUtil
{
/// <summary>
/// loginfo
/// </summary>
private static ILog loginfo = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Info等级的日志记录
/// </summary>
/// <param name="type">Type</param>param>
/// <param name="se">info msg</param>
public static void LogInfo(Type type, string msg)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(type.ToString(), new Exception(msg));
}
}
/// <summary>
/// Info等级的日志记录
/// </summary>
/// <param name="type">Type</param>param>
/// <param name="se">异常对象</param>
public static void LogInfo(Type type, Exception ex)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(type.ToString(), ex);
}
}
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment