Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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
            });
        }
Esempio n. 3
0
        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
            });
        }