public void Init(Mat img, int corners = 500) { if (!IsInitialize) { Cv2.PyrDown(img, prev_img); prev_rect = NMS(hog.Detect(prev_img)); DetectedRect = new Rect(prev_rect.X - (prev_rect.Width / 2), prev_rect.Y - (prev_rect.Height / 2), prev_rect.Width, prev_rect.Height); var mask = new Mat(prev_img.Size(), MatType.CV_8UC1); for (int y = DetectedRect.Y; y < DetectedRect.Y + DetectedRect.Height; y++) { for (int x = DetectedRect.X; x < DetectedRect.X + DetectedRect.Width; x++) { mask.Set <byte>(y, x, 1); } } FeaturePoints = Cv2.GoodFeaturesToTrack(prev_img, corners, 0.01, 15, mask, 3, false, 0.04); IsInitialize = true; } }
private static async Task ProcessFrame() { Mat mat = null; try { lock (frameLoker) { mat = latestFrame.Clone(); } if (mat.Empty()) { LogUtil.Log("Empty Mat !!!", LogLevel.Warning); mat.Dispose(); return; } var filename = String.Format("{1}-orignal-{0}.png", DateTime.UtcNow.ToString("yyyyMMddHHmmssfff"), moduleId); LogUtil.Log(filename, LogLevel.Info); var result = _hog.Detect(mat); if (result.Length > 0) { LogUtil.Log("Persons Detected", LogLevel.Info); //TODO for debug only // mat.SaveImage(filename); var hatRresult = await FaceUtil.DetectHat(mat.ToBytes()); LogUtil.Log("hat Result: " + hatRresult, LogLevel.Info); if (!hatRresult) { var imageName = String.Format("{1}-alert-{0}.png", DateTime.UtcNow.ToString("yyyyMMddHHmmssfff"), moduleId); var imageNamelocal = BuildLocalFilePath(imageName); mat.SaveImage(imageNamelocal); var videoname = String.Format("{1}-record-{0}.avi", DateTime.UtcNow.ToString("yyyyMMddHHmmssfff"), moduleId); var videonamelocal = BuildLocalFilePath(videoname); await UploadFile(imageName, imageNamelocal); await SendEvent(String.Format(STORAGEURI, imageName), String.Format(STORAGEURI, videoname)); await RecordVideo(videonamelocal, 2); await UploadFile(videoname, videonamelocal); if (File.Exists(imageNamelocal)) { File.Delete(imageNamelocal); } if (File.Exists(videonamelocal)) { File.Delete(videonamelocal); } } } } catch (Exception e) { LogUtil.LogException(e); } finally { if (mat != null) { mat.Dispose(); } } }