void bwImageAnalizer_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { ImageProcessResult pythonResult = (ImageProcessResult)e.Result; List <AnalyzeImageResultType> errors = new List <AnalyzeImageResultType>(); if (pythonResult.isGood) { Console.WriteLine("*************************** FOUND!"); isFinalImageFound = true; } else { Console.WriteLine("VERY BAD FACE DETECTED !"); for (int i = 0; i < pythonResult.ProblemList.Count(); i++) { errors.Add((AnalyzeImageResultType)pythonResult.ProblemList[i]); Console.WriteLine("Problems: " + pythonResult.ProblemList[i].ToString()); } } if (pythonResult.isGood == true) { AnalyzeCompleted(this, new AnalyzeCompletedEventArgs(DeviceType.WebCam, errors, pythonResult.RGBImage, pythonResult.croppedImage)); } else { AnalyzeCompleted(this, new AnalyzeCompletedEventArgs(DeviceType.WebCam, errors, null, null)); } }
void bwImageAnalizer_DoWork(object sender, DoWorkEventArgs e) { Image <Bgr, Byte> originalFrame = (Image <Bgr, Byte>)e.Argument; ImageAnalyzer ia = new ImageAnalyzer(); ImageProcessResult pythonResult = ia.Analyze((Image)originalFrame.Bitmap); e.Result = pythonResult; }
void bwImageAnalizer_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { //logger.Info("We returned from Python: bwImageAnalizer_RunWorkerCompleted"); ImageProcessResult pythonResult = (ImageProcessResult)e.Result; List <AnalyzeImageResultType> errors = new List <AnalyzeImageResultType>(); if (pythonResult.isGood) { if (pythonResult.Device == DeviceType.WebCam) { isFinalGoodImageFound = true; } //Console.WriteLine("Python : Good Face FOUND!"); logger.Info("Python : Good Face FOUND!"); } else { //Console.WriteLine("Python was not able to detect good face. VERY BAD FACE DETECTED!"); logger.Info("Python was not able to detect good face. VERY BAD FACE DETECTED!"); if (pythonResult.ProblemList != null) { errors = pythonResult.ProblemList.Select(p => (AnalyzeImageResultType)p).ToList(); var errorsDescr = string.Join(", ", AnalyzeImageResultDescriptions.ErrorsDescription(pythonResult.ProblemList.Select(p => (AnalyzeImageResultType)p).ToList()).ToArray()); var errorMsg = "Python Problems: " + errorsDescr + " (" + string.Join(", ", pythonResult.ProblemList.Select(p => p.ToString()).ToArray()) + ")"; logger.Info(errorMsg); //Console.WriteLine(errorMsg); if (pythonResult.Device == DeviceType.WebCam) { // add error to the list if error was not in the list before for (int i = 0; i < pythonResult.ProblemList.Length; i++) { AnalyzeImageResultType eTyped = (AnalyzeImageResultType)pythonResult.ProblemList[i]; if (!webCamErrors.Contains(eTyped)) { webCamErrors.Add(eTyped); } } } } } #if (withOutErrorParse) //билд по просьбе Романа, тут ошибки сканера просто пропускаются if (pythonResult.Device == DeviceType.Scanner) { AnalyzeCompleted(this, new AnalyzeCompletedEventArgs(pythonResult.Device, new List <AnalyzeImageResultType>(), pythonResult.BaseImage, pythonResult.CroppedImage)); logger.Info("билд по просьбе Романа, тут ошибки сканера просто пропускаются. Выводим, что мы успешно нашли изображение"); return; } #endif if (pythonResult.isGood == true) { //Console.WriteLine("Python returned GOOD"); logger.Info("Python returned GOOD"); if (pythonResult.Device == DeviceType.WebCam) { if (System.IO.Directory.Exists(path)) { string ForSave = Path.Combine(path, "Success_full_" + DateTime.Now.ToString("yyyy_MM_dd_hh_mm_ss_ff") + ".jpg"); logger.Info(string.Format("Сохраняем полный кадр {0} от питона", ForSave)); pythonResult.RGBImage.Save(ForSave); ForSave = Path.Combine(path, "Success_preview_" + DateTime.Now.ToString("yyyy_MM_dd_hh_mm_ss_ff") + ".jpg"); logger.Info(string.Format("Сохраняем найденное лицо {0} от питона", ForSave)); pythonResult.CroppedImage.Save(ForSave); } AnalyzeCompleted(this, new AnalyzeCompletedEventArgs(pythonResult.Device, errors, pythonResult.RGBImage, pythonResult.CroppedImage)); } else { AnalyzeCompleted(this, new AnalyzeCompletedEventArgs(pythonResult.Device, errors, pythonResult.BaseImage, pythonResult.CroppedImage)); } //logger.Info("Exiting bwImageAnalizer_RunWorkerCompleted 1"); return; } if (pythonResult.Device == DeviceType.WebCam && backgoundThread_ImageAnalizer.IsBusy == false && pythonResult.isCamStopped) { AnalyzeCompleted(this, new AnalyzeCompletedEventArgs(pythonResult.Device, webCamErrors.ToList(), pythonResult.RGBImage, pythonResult.CroppedImage)); return; } else { if (WebCam != null) { //logger.Info("WebCam is Recording: {0}", WebCam.IsRunning()); } if (WebCam != null) { //Console.WriteLine("WebCam is Recording: {0}", WebCam.IsRunning()); } // смысл такой: передаем в аналайзер текущее состояние камеры, тк возникает ситуация, (из-за асинхронности) // когда мы мы проверяем кадр и в нем состояние камеры запущена, но в реальности это уже последний кадр и сама камера уже остановлена // из-за устновленного флага pythonResult.isCamStopped == false, и того, что изображение не распознано, просиходит пропуск этого кадра и // на форме просто замирает последний кадр, без отображения результатов анализа (обычно это ошибка) // TODO: Саше протестить на то, что происходит, если результат анализа положительный // потом причесать код и провести рефракторинг if (pythonResult.Device == DeviceType.WebCam && backgoundThread_ImageAnalizer.IsBusy == false && WebCam != null && !WebCam.IsRunning()) { AnalyzeCompleted(this, new AnalyzeCompletedEventArgs(pythonResult.Device, webCamErrors.ToList(), pythonResult.RGBImage, pythonResult.CroppedImage)); } } // if we have scanner only if (pythonResult.Device == DeviceType.Scanner) { AnalyzeImage(this, new AnalyzeCompletedEventArgs(pythonResult.Device, errors, pythonResult.RGBImage, null)); //logger.Info("Exiting bwImageAnalizer_RunWorkerCompleted 2"); return; } logger.Info("Analyze Completed=============="); }