private void ProcessImageGetContentFromPage(Image <Rgba32> image, QrReaderData qrData) { image.Mutate(x => x.Crop(new SixLabors.Primitives.Rectangle(0, qrData.QrCodeBottomPositionY, x.GetCurrentSize().Width - 1, x.GetCurrentSize().Height - qrData.QrCodeBottomPositionY - 1)) .Rotate((float)qrData.PageRotation).BackgroundColor(Rgba32.White)); var contentArea = image.GetContentArea(); image.Mutate(x => x.Crop(contentArea)); }
private DecodedLetters DecodeExtractedLetters(IEnumerable <IEnumerable <CsvRow> > lettersCollections, QrReaderData qrData) { string currentResult = null; var isChecksumCorrect = false; foreach (var letters in lettersCollections) { var csvReader = DataOutput.GetCsvParser(letters); var targetName = "class"; var featureNames = csvReader.EnumerateRows(c => c != targetName).First().ColumnNameToIndex.Keys.ToArray(); var testObservations = csvReader.EnumerateRows(featureNames).ToF64Matrix(); testObservations.Map(p => p / 255); var model = ClassificationNeuralNetModel.Load(() => new StreamReader("network.xml")); var predictions = model.Predict(testObservations); var stringBuilder = new StringBuilder(); foreach (var prediction in predictions) { stringBuilder.Append(Math.Abs(prediction - -1) < 0.01 ? '-' : Alphabet.Base32Alphabet.ToString()[(int)prediction]); } currentResult = stringBuilder.ToString(); isChecksumCorrect = Sha1Helper.IsChecksumCorrect(currentResult, qrData.MetaData.Checksum); if (isChecksumCorrect) { break; } } return(new DecodedLetters { Letters = currentResult, IsChecksumOk = isChecksumCorrect }); }
private IEnumerable <IEnumerable <CsvRow> > ProcessImageGetLettersFromPage(Image <Rgba32> image, QrReaderData qrData) { var rowsPerPage = (int)Math.Ceiling(qrData.MetaData.DataChunkSize / (double)DataOutput.MaxLettersPerRow); var letters = new List <CsvRow>((int)qrData.MetaData.DataChunkSize); var lettersFallback = new List <CsvRow>((int)qrData.MetaData.DataChunkSize); var nextY = 0; for (var y = 0; y < rowsPerPage; y++) { var nextRowContentArea = image.GetNextRowContentArea(nextY); nextY = nextRowContentArea.Y + nextRowContentArea.Height; var rowImage = image.Clone(img => img.Crop(nextRowContentArea)); var currentRowLetters = y == rowsPerPage - 1 ? qrData.MetaData.DataChunkSize - DataOutput.MaxLettersPerRow * y : DataOutput.MaxLettersPerRow; var nextX = 0; for (var x = 0; x < currentRowLetters; x++) { var nextLetterContentArea = rowImage.GetNextLetterContentArea(nextX); nextX = nextLetterContentArea.X + nextLetterContentArea.Width; var letterImage = rowImage.Clone(img => img.Crop(nextLetterContentArea)); using (var memoryStream = new MemoryStream()) { letterImage.SaveAsBmp(memoryStream); memoryStream.Seek(0, 0); letters.Add(new CsvRow(_columnNameToIndex, LoadImageHelper.FileAsData(memoryStream))); lettersFallback.Add(new CsvRow(_columnNameToIndex, LoadImageHelper.FileAsData(memoryStream, threshold: 90))); } } } return(new List <IEnumerable <CsvRow> > { letters, lettersFallback }); }