const double CONFIG_MIN_SCORE = 0.0; // 0% static void Main(String[] args) { // Parse arguments IDictionary <String, String> parameters = ParseArgs(args); // Make sur the image is provided using args if (!parameters.ContainsKey("--image")) { Console.Error.WriteLine("--image required"); throw new Exception("--image required"); } // Extract assets folder // https://www.doubango.org/SDKs/mrz/docs/Configuration_options.html#assets-folder String assetsFolder = parameters.ContainsKey("--assets") ? parameters["--assets"] : String.Empty; // License data - Optional // https://www.doubango.org/SDKs/mrz/docs/Configuration_options.html#license-token-data String tokenDataBase64 = parameters.ContainsKey("--tokendata") ? parameters["--tokendata"] : String.Empty; // Initialize the engine: Load deep learning models and init GPU shaders // Make sure de disable VS hosting process to see logs from native code: https://social.msdn.microsoft.com/Forums/en-US/5da6cdb2-bc2b-4fff-8adf-752b32143dae/printf-from-dll-in-console-app-in-visual-studio-c-2010-express-does-not-output-to-console-window?forum=Vsexpressvcs // This function should be called once. // https://www.doubango.org/SDKs/mrz/docs/cpp-api.html#_CPPv4N14ultimateMrzSdk15UltMrzSdkEngine4initEPKc UltMrzSdkResult result = CheckResult("Init", UltMrzSdkEngine.init(BuildJSON(assetsFolder, tokenDataBase64))); // Decode the JPEG/PNG/BMP file Bitmap image = new Bitmap(parameters["--image"]); // Processing: Detection + recognition // First inference is expected to be slow (deep learning models mapping to CPU/GPU memory) BitmapData imageData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); try { // For packed formats (RGB-family): https://www.doubango.org/SDKs/mrz/docs/cpp-api.html#_CPPv4N14ultimateMrzSdk15UltMrzSdkEngine7processEK21ULTMRZ_SDK_IMAGE_TYPEPKvK6size_tK6size_tK6size_tKi // For YUV formats (data from camera): https://www.doubango.org/SDKs/mrz/docs/cpp-api.html#_CPPv4N14ultimateMrzSdk15UltMrzSdkEngine7processEK21ULTMRZ_SDK_IMAGE_TYPEPKvPKvPKvK6size_tK6size_tK6size_tK6size_tK6size_tK6size_tKi result = CheckResult("Process", UltMrzSdkEngine.process( ULTMRZ_SDK_IMAGE_TYPE.ULTMRZ_SDK_IMAGE_TYPE_RGB24, // TODO(dmi): not correct. C# image decoder outputs BGR24 instead of RGB24 imageData.Scan0, (uint)image.Width, (uint)image.Height )); // Print result to console Console.WriteLine("Result: {0}", result.json()); } finally { image.UnlockBits(imageData); } // Write until user press a key Console.WriteLine("Press any key to terminate !!"); Console.Read(); // Now that you're done, deInit the engine before exiting CheckResult("DeInit", UltMrzSdkEngine.deInit()); }
static UltMrzSdkResult CheckResult(String functionName, UltMrzSdkResult result) { if (!result.isOK()) { String errMessage = String.Format("{0}: Execution failed: {1}", new String[] { functionName, result.json() }); Console.Error.WriteLine(errMessage); throw new Exception(errMessage); } return(result); }
const double CONFIG_MIN_SCORE = 0.0; // 0% static void Main(String[] args) { // Parse arguments IDictionary <String, String> parameters = ParseArgs(args); // Make sur the image is provided using args if (!parameters.ContainsKey("--image")) { Console.Error.WriteLine("--image required"); throw new Exception("--image required"); } // Extract assets folder // https://www.doubango.org/SDKs/mrz/docs/Configuration_options.html#assets-folder String assetsFolder = parameters.ContainsKey("--assets") ? parameters["--assets"] : String.Empty; // License data - Optional // https://www.doubango.org/SDKs/mrz/docs/Configuration_options.html#license-token-data String tokenDataBase64 = parameters.ContainsKey("--tokendata") ? parameters["--tokendata"] : String.Empty; // Initialize the engine: Load deep learning models and init GPU shaders // Make sure de disable VS hosting process to see logs from native code: https://social.msdn.microsoft.com/Forums/en-US/5da6cdb2-bc2b-4fff-8adf-752b32143dae/printf-from-dll-in-console-app-in-visual-studio-c-2010-express-does-not-output-to-console-window?forum=Vsexpressvcs // This function should be called once. // https://www.doubango.org/SDKs/mrz/docs/cpp-api.html#_CPPv4N14ultimateMrzSdk15UltMrzSdkEngine4initEPKc UltMrzSdkResult result = CheckResult("Init", UltMrzSdkEngine.init(BuildJSON(assetsFolder, tokenDataBase64))); // Decode the JPEG/PNG/BMP file String file = parameters["--image"]; if (!System.IO.File.Exists(file)) { throw new System.IO.FileNotFoundException("File not found:" + file); } Bitmap image = new Bitmap(file); if (Image.GetPixelFormatSize(image.PixelFormat) == 24 && ((image.Width * 3) & 3) != 0) { //!\\ Not DWORD aligned -> the stride will be multiple of 4-bytes instead of 3-bytes // ultimateMICR requires stride to be in samples unit instead of in bytes Console.Error.WriteLine(String.Format("//!\\ The image width ({0}) not a multiple of DWORD.", image.Width)); image = new Bitmap(image, new Size((image.Width + 3) & -4, image.Height)); } int bytesPerPixel = Image.GetPixelFormatSize(image.PixelFormat) >> 3; if (bytesPerPixel != 1 && bytesPerPixel != 3 && bytesPerPixel != 4) { throw new System.Exception("Invalid BPP:" + bytesPerPixel); } // Extract Exif orientation const int ExifOrientationTagId = 0x112; int orientation = 1; if (Array.IndexOf(image.PropertyIdList, ExifOrientationTagId) > -1) { int orientation_ = image.GetPropertyItem(ExifOrientationTagId).Value[0]; if (orientation_ >= 1 && orientation_ <= 8) { orientation = orientation_; } } // Processing: Detection + recognition // First inference is expected to be slow (deep learning models mapping to CPU/GPU memory) BitmapData imageData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, image.PixelFormat); try { // For packed formats (RGB-family): https://www.doubango.org/SDKs/mrz/docs/cpp-api.html#_CPPv4N14ultimateMrzSdk15UltMrzSdkEngine7processEK21ULTMRZ_SDK_IMAGE_TYPEPKvK6size_tK6size_tK6size_tKi // For YUV formats (data from camera): https://www.doubango.org/SDKs/mrz/docs/cpp-api.html#_CPPv4N14ultimateMrzSdk15UltMrzSdkEngine7processEK21ULTMRZ_SDK_IMAGE_TYPEPKvPKvPKvK6size_tK6size_tK6size_tK6size_tK6size_tK6size_tKi result = CheckResult("Process", UltMrzSdkEngine.process( (bytesPerPixel == 1) ? ULTMRZ_SDK_IMAGE_TYPE.ULTMRZ_SDK_IMAGE_TYPE_Y : (bytesPerPixel == 4 ? ULTMRZ_SDK_IMAGE_TYPE.ULTMRZ_SDK_IMAGE_TYPE_BGRA32 : ULTMRZ_SDK_IMAGE_TYPE.ULTMRZ_SDK_IMAGE_TYPE_BGR24), imageData.Scan0, (uint)imageData.Width, (uint)imageData.Height, (uint)(imageData.Stride / bytesPerPixel), orientation )); // Print result to console Console.WriteLine("Result: {0}", result.json()); } finally { image.UnlockBits(imageData); } // Write until user press a key Console.WriteLine("Press any key to terminate !!"); Console.Read(); // Now that you're done, deInit the engine before exiting CheckResult("DeInit", UltMrzSdkEngine.deInit()); }