/// <summary> /// 口罩检测 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="imageInfo">图像数据</param> /// <param name="singleFaceInfo">单人脸信息</param> /// <returns>口罩检测结果</returns> public static MaskInfo MaskEstimation(FaceEngine faceEngine, Image image, SingleFaceInfo singleFaceInfo, out int retCode) { MaskInfo maskInfo = new MaskInfo(); retCode = -1; try { MultiFaceInfo multiFaceInfo = new MultiFaceInfo(); multiFaceInfo.faceNum = 1; multiFaceInfo.faceOrients = new int[1]; multiFaceInfo.faceOrients[0] = singleFaceInfo.faceOrient; multiFaceInfo.faceRects = new MRECT[1]; multiFaceInfo.faceRects[0] = singleFaceInfo.faceRect; multiFaceInfo.faceDataInfoList = new FaceDataInfo[1]; multiFaceInfo.faceDataInfoList[0] = singleFaceInfo.faceDataInfo; //人脸信息处理 retCode = faceEngine.ASFProcessEx(image, multiFaceInfo, FaceEngineMask.ASF_MASKDETECT); if (retCode == 0) { //获取口罩检测结果 retCode = faceEngine.ASFGetMask(out maskInfo); } } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(maskInfo); }
public void SelectMask(MaskInfo maskInfo) { foreach (var child in _masks) { child.gameObject.SetActive(child.GetMask() == maskInfo); } }
/// <summary> /// 提取单人脸特征 /// </summary> /// <param name="pEngine">人脸识别引擎</param> /// <param name="image">图片</param> /// <param name="singleFaceInfo">单人脸信息</param> /// <returns>单人脸特征</returns> public static FaceFeature ExtractFeature(FaceEngine faceEngine, Image image, SingleFaceInfo singleFaceInfo) { FaceFeature faceFeature = null; try { MultiFaceInfo multiFaceInfo = new MultiFaceInfo(); multiFaceInfo.faceNum = 1; multiFaceInfo.faceOrients = new int[1]; multiFaceInfo.faceOrients[0] = singleFaceInfo.faceOrient; multiFaceInfo.faceRects = new MRECT[1]; multiFaceInfo.faceRects[0] = singleFaceInfo.faceRect; multiFaceInfo.faceDataInfoList = new FaceDataInfo[1]; multiFaceInfo.faceDataInfoList[0] = singleFaceInfo.faceDataInfo; //口罩检测 int retCode = -1; MaskInfo maskInfo = MaskEstimation(faceEngine, image, singleFaceInfo, out retCode); if (retCode != 0 || maskInfo.maskArray == null || maskInfo.maskArray.Length <= 0) { return(faceFeature); } bool isMask = maskInfo.maskArray[0].Equals(1); faceEngine.ASFFaceFeatureExtractEx(image, multiFaceInfo, ASF_RegisterOrNot.ASF_RECOGNITION, out faceFeature, 0, isMask); } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(faceFeature); }
// Token: 0x060002AB RID: 683 RVA: 0x00016864 File Offset: 0x00014A64 public void SetSlotVisibles(Maid maid, Dictionary <TBody.SlotID, MaskInfo> maskDic, bool temporary) { foreach (KeyValuePair <TBody.SlotID, MaskInfo> keyValuePair in maskDic) { MaskInfo value = keyValuePair.Value; if (value.state != SlotState.NotLoaded) { value.slot.boVisible = value.value; if (!temporary) { TBodySkin slot = maid.body0.GetSlot((int)keyValuePair.Key); if (!value.value) { slot.listMaskSlot.Add((int)keyValuePair.Key); } else { foreach (TBodySkin tbodySkin in maid.body0.goSlot) { tbodySkin.listMaskSlot.Remove((int)keyValuePair.Key); } } } } } }
/// <summary> /// 提取人脸特征,多人脸默认取第一个人脸特征 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="image">图像</param> /// <param name="thresold">图像质量检测阈值</param> /// <returns>保存人脸特征结构体指针</returns> public static FaceFeature ExtractFeature(FaceEngine faceEngine, Image image, float thresoldImg, float thresoleImgMask, ASF_RegisterOrNot registerOrNot, out SingleFaceInfo singleFaceInfo, out bool isMask, ref string featureResult, out int retCode, int faceIndex = 0) { FaceFeature faceFeature = new FaceFeature(); singleFaceInfo = new SingleFaceInfo(); isMask = false; retCode = -1; try { if (image == null) { return(faceFeature); } MultiFaceInfo multiFaceInfo; //人脸检测 retCode = faceEngine.ASFDetectFacesEx(image, out multiFaceInfo); if (retCode != 0 || multiFaceInfo.faceNum <= 0) { featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "人脸检测失败" : "检测到的人脸数为0"); return(faceFeature); } singleFaceInfo.faceOrient = multiFaceInfo.faceOrients[faceIndex]; singleFaceInfo.faceRect = multiFaceInfo.faceRects[faceIndex]; singleFaceInfo.faceDataInfo = multiFaceInfo.faceDataInfoList[faceIndex]; //口罩检测 MaskInfo maskInfo = MaskEstimation(faceEngine, image, singleFaceInfo, out retCode); if (retCode != 0 || maskInfo.maskArray == null || maskInfo.maskArray.Length <= 0) { featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "口罩检测失败" : "检测到的口罩结果为空"); return(faceFeature); } isMask = maskInfo.maskArray[0].Equals(1); //图像质量检测 float confidenceLevel = 0.0f; retCode = faceEngine.ASFImageQualityDetectEx(image, multiFaceInfo, out confidenceLevel, faceIndex, isMask); if (retCode != 0 || confidenceLevel < (isMask ? thresoleImgMask : thresoldImg)) { featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "图像质量检测失败" : "图像质量过低"); return(faceFeature); } //特征提取 retCode = faceEngine.ASFFaceFeatureExtractEx(image, multiFaceInfo, registerOrNot, out faceFeature, faceIndex, isMask); if (retCode != 0) { featureResult = string.Format("特征提取失败,接口返回值:{0}", retCode); } } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(faceFeature); }
private void Menu_AddStat_Click(object sender, System.EventArgs e) { MaskInfo info = new MaskInfo(); TreeNode node = new TreeNode(info.ToString()); node.Tag = info; this.C_GroupInfoTree.Nodes.Add(node); UpdateTextDisplay(); }
private void ConvertOldMaskInfos() { #region Convert Old Mask Info if (_MaskInfoSetting.Count > 0 && this._MakeChanges) { MaskInfo maskInfo = this._MaskInfoSetting[0] as MaskInfo; if (maskInfo != null) { if (maskInfo.ShowTitle) { this._ColumnsWidth.Add(maskInfo.TitleWidth); } this.ColumnsWidth.Add(maskInfo.MaskedWidth); MaskInfo maskInfoCopy = maskInfo.Copy(); maskInfoCopy.BrotherMaskInfos = new MaskInfoCollection(); for (int i = 1; i < this._MaskInfoSetting.Count; i++) { MaskInfo brotherMaskInfo = this._MaskInfoSetting[i] as MaskInfo; if (brotherMaskInfo.ShowTitle) { this._ColumnsWidth.Add(brotherMaskInfo.TitleWidth); } this._ColumnsWidth.Add(brotherMaskInfo.MaskedWidth); maskInfoCopy.BrotherMaskInfos.Add(brotherMaskInfo.Copy()); } this._MaskInfoSetting.Clear(); this._MaskInfoSetting.Add(maskInfoCopy); this._MakeChanges = false; } } #endregion }
/// <summary> /// スロットの可視性を設定する. /// temporaryにtrueを設定すると可視性のみ設定するがfalseの場合は、スロットへのマスク設定を行う /// </summary> /// <param name="maskDic">マスク設定Dic</param> /// <param name="temporary">一時適用フラグ</param> public void SetSlotVisibles(Dictionary <TBody.SlotID, MaskInfo> maskDic, bool temporary) { // Hashtable m_foceHide = GetMaskTable(); // if (m_foceHide == null) { // LogUtil.Error("cannot take MaskTable"); // return; // } foreach (KeyValuePair <TBody.SlotID, MaskInfo> pair in maskDic) { MaskInfo maskInfo = pair.Value; // 未読み込みの場合はスキップ if (maskInfo.state == SlotState.NotLoaded) { continue; } maskInfo.slot.boVisible = maskInfo.value; if (!temporary) { TBodySkin slot = currentMaid.body0.GetSlot((int)pair.Key); if (!maskInfo.value) { slot.listMaskSlot.Add((int)pair.Key); } else { // 全スロットから削除する //slot.listMaskSlot.Remove((int)pair.Key); foreach (TBodySkin tBodySkin in currentMaid.body0.goSlot) { tBodySkin.listMaskSlot.Remove((int)pair.Key); } } // 下記の情報はGetMaskで取得されるフラグに関するものであるが、 // maskItemとは別で、下着モード、ヌードモードなどの指定で使われるフラグ //if (!tmp) m_foceHide[pair.Key] = !maskInfo.value; } } }
private void refreshMaskBounds(bool[][] mask, Vector2 offset) { int width = mask.Length; int height = width == 0 ? 0 : mask[0].Length; float minX = refreshBoundsUpwards(mask, width, height, isThereMaskInRow) + (int)offset.X; float maxX = refreshBoundsDownwards(mask, width, height, isThereMaskInRow) + (int)offset.X; float minY = refreshBoundsUpwards(mask, height, width, isThereMaskInColumn) + (int)offset.Y; float maxY = refreshBoundsDownwards(mask, height, width, isThereMaskInColumn) + (int)offset.Y; _maskInfo = new MaskInfo { Width = width, Height = height, Offset = offset, Mask = mask, MinX = minX, MaxX = maxX, MinY = minY, MaxY = maxY }; }
private void Menu_CopyStat_Click(object sender, System.EventArgs e) { TreeNode node = this.C_GroupInfoTree.SelectedNode; if (node == null) { return; } MaskInfo info = node.Tag as MaskInfo; MaskInfo newInfo = info.Copy(); TreeNode newNode = new TreeNode(newInfo.ToString()); newNode.Tag = newInfo; this.C_GroupInfoTree.Nodes.Add(newNode); this.UpdateTextDisplay(); this.C_GroupInfoTree.SelectedNode = node; }
internal void AddExempt(MaskInfo channelListItemInfo) { exempts.Add(channelListItemInfo); }
internal void AddInvite(MaskInfo channelListItemInfo) { invite.Add(channelListItemInfo); }
internal void AddBan(MaskInfo banInfo) { bans.Add(banInfo); }