PDF417 barkod oluşturmak sadece dört satır Python kodu gerektirir. Bir telefon fotoğrafından, 200 DPI taramadan veya birinin cebinde bir gün kalan bir biniş kartından barkodu okumak, gerçek işin başladığı yerdir ve çoğu PDF417 entegrasyonunun aslında başarısız olduğu noktadır. Bu makalede, kaynak görüntü kusurlu olduğunda Python’da PDF417 barkodlarını nasıl okuyacağınızı öğreneceksiniz. Eğer oluşturma tarafıyla ilgileniyorsanız, daha önceki PDF417 barkodlarını Python kullanarak oluşturma rehberi temel ve özel PDF417 sembollerinin, satır ve sütun kontrolü dahil, nasıl oluşturulacağını kapsar ve Python barkod okuyucu rehberi genel amaçlı taramayı çeşitli semboller üzerinde ele alır. Burada takip eden kısım, PDF417 tanıma konusunda dar ve derin bir bakış sunar.

Aşağıdaki her kod parçacığı, Linux’ta Python 3.12 ile Aspose.BarCode for Python via .NET 26.7 üzerinde çalıştırıldı. Zamanlamalar ve okuma/başarısızlık sonuçları tahmin edilmemiş, ölçülmüştür ve bunları üreten betik, kendi görüntülerinizde yeniden çalıştırabilmeniz için sonunda yer almaktadır.

PDF417 Tanımasını Gerçekten Bozanlar

PDF417, yığılmış bir semboloji türüdür: kod sözcüklerinden oluşan satırlar, her kod sözcüğü 17 modül kapsayan dört çubuk ve dört boşluktan oluşur. Bu yapı Reed‑Solomon hata düzeltme içerir, bu yüzden yırtılmış bir köşe ya da kahve lekesi genellikle dayanabilir. Dayanamaz olan ise modül ızgarasını kaybetmektir.

Üç şey ızgarayı yok eder, üretimde ne sıklıkla ortaya çıktıklarına göre kabaca sıralanmıştır:

  • İki pikselin altına düşen etkili modül genişliği. Bu, baskın hatadır. Bu, ölçek küçültme, kamera mesafesi ve bulanıklık yoluyla gerçekleşir; bulanıklık bir modülün mürekkebini komşularına yayar. Üç piksel başına bir modül olarak oluşturulan ve ardından bulanıklaştırılan bir barkod, işlevsel olarak bir piksel başına bir modül barkodudur.
  • Perspektif ve dönüş. Açılı bir şekilde fotoğraflanan bir barkodun satırları artık paralel tarama çizgileri değildir. Algılayıcı bunu yönetir, ancak en hızlı ön ayarın atladığı bir algılama geçişi maliyetine sahiptir.
  • Kontrast çöküşü. Solmuş termal kağıt, parlamalı bir ortamda fotoğraflanmış ekran veya parlaklığı sabitlenmiş bir tarama. Aşağıdaki sayılar gösterdiği gibi, göründüğü kadar ölümcül değildir.

Pratik sonuç, tanıma ayarlarının bir kurtarma mekanizması olduğu, yakalama kalitesinin yerine geçmediğidir. Görüntü kalitesinin orta bandını geri kazandırırlar. Alt bandı geri kazandırmazlar.

Python PDF417 Okuyucusunu Kurun

Kütüphaneyi PyPI’dan yükleyin:

pip install aspose-barcode-for-python-via-net

Tanıma API’si aspose.barcode.barcoderecognition içinde bulunur. Bu makale için iki sınıf önemlidir: BarCodeReader, algılamayı ve kod çözmeyi yöneten sınıf ve QualitySettings, okuyucunun ne kadar çaba harcayacağını kontrol eden sınıf.

Python’da PDF417 Barkod Okuma

Minimum uygulanabilir okuma iki argüman ve bir döngüdür:

from aspose.barcode import barcoderecognition as rec

reader = rec.BarCodeReader("clean.png", rec.DecodeType.PDF417)

for result in reader.read_bar_codes():
    print("Code text:", result.code_text)
    print("Symbology:", result.code_type_name)
    print("Reading quality:", result.reading_quality)
Python'da PDF417 Barkod Okuma.

Python’da PDF417 Barkod Okuma.

Temiz bir görüntüde çıktı:

Code text: PASSENGER|KHAN/M|SEAT14C|LHE-DXB
Symbology: Pdf417
Reading quality: 100.0

İkinci argüman pratikte isteğe bağlı değildir. Bunu çıkardığınızda BarCodeReader DecodeType.ALL_SUPPORTED_TYPES değerine geri döner, bu da görüntüdeki her aday bölgeye karşı altmıştan fazla semboloji için algılama yapar. Sadece PDF417 içeren bir işlem hattında bu tamamen boşa harcama olur ve PDF417 satır yapısı içinde lineer bir semboloji yanlış pozitifine kapı açar. Türü belirtin.

Girişiniz bir dosya yerine bir yüklemeden gelen baytlar olarak geliyorsa, bir akış geçirin ve bir zaman aşımı ayarlayın, böylece patolojik bir görüntü bir çalışanı duraklatamaz:

import io
from aspose.barcode import barcoderecognition as rec

def decode_pdf417(image_bytes, timeout_ms=2000):
    reader = rec.BarCodeReader(io.BytesIO(image_bytes), rec.DecodeType.PDF417)
    reader.timeout = timeout_ms
    return [r.code_text for r in reader.read_bar_codes()]

Python’da PDF417 Tanıma Kalite Ayarlarını Karşılaştırın

QualitySettings dört ön ayar içerir, bilmeniz gereken. Birini okuyucuya atamak tek bir satırdır:

reader = rec.BarCodeReader("scan.png", rec.DecodeType.PDF417)
reader.quality_settings = rec.QualitySettings.high_quality
Ön ayarAmaçMaliyet
high_performanceTemiz, makine tarafından oluşturulan görüntülerEn hızlı, kurtarma geçişlerini atlar
normal_qualityVarsayılan. Normal taramalar ve dışa aktarmalarDengeli
high_qualityKamera çekimleri, bozulmuş taramalarOrta
max_qualityZaten başarısız olan görüntülerde yeniden deneme geçişiÇok büyük bir farkla en yavaş

Bu açıklamaların pratikte ne anlama geldiğini görmek için, üç piksel modül başına bir PDF417 oluşturdum, Pillow ile altı farklı şekilde bozuldu ve her ön ayarı her varyantta çalıştırdım. Üç çalıştırmanın medyanı:

Kaynak görüntühigh_performancenormal_qualityhigh_qualitymax_quality
Temizokuma, 35 msokuma, 50 msokuma, 45 msokuma, 106 ms
12° döndürülmüş, bulanıkkaçırıldı, 15 msokuma, 74 msokuma, 67 msokuma, 157 ms
Gauss gürültüsü (σ 40)okuma, 31 msokuma, 49 msokuma, 52 msokuma, 123 ms
Yarı çözünürlükokuma, 22 msokuma, 37 msokuma, 35 msokuma, 86 ms
Düşük kontrastokuma, 24 msokuma, 38 msokuma, 43 msokuma, 112 ms
Yoğun bulanıklık (σ 2.2)kaçırıldı, 5 mskaçırıldı, 25 mskaçırıldı, 85 mskaçırıldı, 180 ms

Bu tablodan dört şey çıkar ve bunlar tek tek sayılardan daha faydalıdır:

  1. Gürültü ve düşük kontrast, insanların düşündüğü gibi bir sorun değildir. Reed‑Solomon ve dedektör, ağır Gaussian gürültüsünü ve en hızlı ön ayarda %82 kontrast azalmasını absorbe etti. Bunlar için ayarlamayı durdurun.
  2. Döndürme ve bulanıklık, ön ayarları ayıran durumdur. Bu aynı zamanda elde taşınan telefon çekiminin tam profilidir, bu yüzden high_performance herhangi bir mobil kaynaklı işlem hattı için yanlış varsayılandır.
  3. max_quality normal_quality‘nin üç katı sürede çalışır ve ekstra bir şey okumaz. Bu, varsayılan değil, ikinci deneme yolu olarak yerini hak eder.
  4. Modül ızgarası bir kez kaybolduğunda, hiçbir ön ayar onu geri getiremez. Ağır bulanıklık satırı tüm genelinde bir hatadır ve max_quality bunu kanıtlamak için 180 ms harcadı. Bu, daha fazla piksel, daha iyi odaklama, üretim sırasında daha büyük x_dimension gibi bir yakalama düzeltmesi gerektiren bir yakalama sorunudur.

Bulanık PDF417 Barkodlarını Python’da Okumak İçin QualitySettings’i Ayarlayın

Bir ön ayar, bireysel özelliklerin bir paketidir ve bir ön ayardan başlayıp birini geçersiz kılabilirsiniz. Bu, bilinen, tekrarlanabilir bir kusur için gerçek kazançların bulunduğu yerdir.

Yukarıdaki döndürülmüş ve bulanıklaştırılmış görüntü iyi bir gösterimdir. high_performance altında eksik kalıyor. Aynı ön ayarın üzerine dekonvolüsyonu etkinleştirin ve şu şekilde okunur:

from aspose.barcode import barcoderecognition as rec

reader = rec.BarCodeReader("rotated.png", rec.DecodeType.PDF417)

quality = rec.QualitySettings.high_performance
quality.deconvolution = rec.DeconvolutionMode.NORMAL
reader.quality_settings = quality

for result in reader.read_bar_codes():
    print(result.code_text)
QualitySettings'i Ayarlayarak Bulanık PDF417 Barkodlarını Python'da Okuyun.

QualitySettings’i Ayarlayarak Bulanık PDF417 Barkodlarını Python’da Okuyun.

Ölçüldü: geçersiz kılma olmadan 12 ms’de kaçırıldı, geçersiz kılma ile 54 ms’de okundu. Bir özellik sonucun tersine dönmesini sağladı ve sonuç yine max_quality ön ayarının beklediğinden daha hızlı geldi.

Bilmeniz gereken özellikler:

ÖzellikDeğerlerNe zaman kullanılmalı
deconvolutionFAST, NORMAL, SLOWHareket bulanıklığı ve odak dışı çekimler
barcode_qualityHIGH, NORMAL, LOWBaskı kusurları, termal solma, faks artefaktları
x_dimensionAUTO, SMALL, NORMAL, LARGE, USE_MINIMAL_X_DIMENSIONYoğun barkodlar veya sabit bilinen modül boyutu
minimal_x_dimensionfloatUSE_MINIMAL_X_DIMENSION ile eşleştirerek bir alt sınır belirleyin
complex_backgroundAUTO, DISABLED, ENABLEDSanat eseri veya desenli bir form üzerine basılmış barkod
inverse_imageAUTO, DISABLED, ENABLEDBeyaz-siyah barkodlar, ekran görüntüleri
allow_incorrect_barcodesboolYalnızca tanı amaçlı, asla üretimde kullanılmaz

Sonuncusu bir uyarıyı hak ediyor. allow_incorrect_barcodes checksum doğrulamasını geçemeyen sembolleri döndürür. Bu, “dedektör burada bir şey buldu mu?” yanıtlamaya yardımcı bir hata ayıklama aracıdır. Bunu dağıtmak, eksik olmaları yerine hatalı çözülen dizgileri dağıtmak anlamına gelir; bu da bir kaçırmadan kesinlikle daha kötüdür.

Üretimde iyi çalışan bir katmanlama stratejisi: önce normal_quality deneyin ve bir eksik durumda bir kez high_quality ve deconvolution = SLOW ile tekrar deneyin. Sadece ihtiyacı olan görüntüler için pahalı yolu ödersiniz.

Python’da PDF417 Çözümleme Sonuçlarını Doğrulama

Kodlanmış bir dize otomatik olarak doğru bir dize değildir. BarCodeResult üzerindeki üç alan yardımcı olur:

for result in reader.read_bar_codes():
    print("Text:", result.code_text)
    print("Reading quality:", result.reading_quality)
    print("Confidence:", result.confidence)
    print("Region:", [(p.x, p.y) for p in result.region.points])
Text: PASSENGER|KHAN/M|SEAT14C|LHE-DXB
Reading quality: 100.0
Confidence: 100
Region: [(7, 6), (261, 7), (261, 276), (7, 277)]

Görüntülerde Bölünmüş Bir Macro PDF417’yi Yeniden Birleştir

Macro PDF417, tek bir mantıksal mesajı birden fazla sembole böler; bu, nakliye manifestolarında ve çok sayfalı belgelerde görülür. Segment meta verileri dönüşüm sırasında korunur, bu yüzden yeniden birleştirme deterministiktir:

from aspose.barcode import barcoderecognition as rec

segments = {}
total = None

for path in ["page1.png", "page2.png"]:
    reader = rec.BarCodeReader(path, rec.DecodeType.MACRO_PDF417)
    for result in reader.read_bar_codes():
        meta = result.extended.pdf417
        segments[meta.macro_pdf_417_segment_id] = result.code_text
        total = meta.macro_pdf_417_segments_count
        print(f"{path}: segment {meta.macro_pdf_417_segment_id + 1} of {total}, "
              f"file id {meta.macro_pdf_417_file_id}")

if total and len(segments) == total:
    payload = "".join(segments[i] for i in sorted(segments))
    print("Reassembled:", payload)
else:
    print("Incomplete: missing segments")
Sayfa 1.

Sayfa 1.

Sayfa 2.

Sayfa 2.

Output:

Data\pdf417\page1.png: segment 1 of 2, file id 42
Data\pdf417\page2.png: segment 2 of 2, file id 42
Reassembled: SEGMENT-A-DATASEGMENT-B-DATA

Şunu unutmayın ki macro_pdf_417_file_id bir tam sayıdır, hem oluşturma hem de tanıma tarafında dize (string) değildir. Aynı nesne, kodlayıcı bunları doldurduğunda ayrıca macro_pdf_417_file_name, macro_pdf_417_sender, macro_pdf_417_addressee, macro_pdf_417_time_stamp ve macro_pdf_417_checksum öğelerini de ortaya çıkarır.

Kendi Görüntülerinizde PDF417 Tanıma Performansını Ölçün

Ön ayar seçimi bir ölçüm olmalı, tahmin değil. Bunu gerçek hattınızdan temsilci yakalamalar içeren bir klasöre yönlendirin ve hangi ön ayarın maliyetine değer olduğunu size söyleyecek:

import time, statistics, pathlib
from aspose.barcode import barcoderecognition as rec

PRESETS = ["high_performance", "normal_quality", "high_quality", "max_quality"]

def probe(path, preset, reps=3):
    times, found = [], False
    for _ in range(reps):
        reader = rec.BarCodeReader(str(path), rec.DecodeType.PDF417)
        reader.quality_settings = getattr(rec.QualitySettings, preset)
        start = time.perf_counter()
        results = list(reader.read_bar_codes())
        times.append((time.perf_counter() - start) * 1000)
        found = found or bool(results)
    return found, statistics.median(times)

for image in sorted(pathlib.Path("samples").glob("*.png")):
    row = []
    for preset in PRESETS:
        found, ms = probe(image, preset)
        row.append(f"{preset}: {'read' if found else 'miss'} {ms:.0f}ms")
    print(f"{image.name:28} " + " | ".join(row))
clean.png                    high_performance: read 32ms | normal_quality: read 48ms | high_quality: read 51ms | max_quality: read 130ms
faded_thermal.png            high_performance: read 26ms | normal_quality: read 43ms | high_quality: read 46ms | max_quality: read 144ms
half_resolution.png          high_performance: read 27ms | normal_quality: read 41ms | high_quality: read 41ms | max_quality: read 89ms
heavy_blur.png               high_performance: miss 7ms | normal_quality: miss 24ms | high_quality: miss 69ms | max_quality: miss 180ms
noisy_scan.png               high_performance: read 26ms | normal_quality: read 42ms | high_quality: read 47ms | max_quality: read 116ms
Page1.png                    high_performance: read 21ms | normal_quality: read 34ms | high_quality: read 38ms | max_quality: read 90ms
Page2.png                    high_performance: read 21ms | normal_quality: read 33ms | high_quality: read 38ms | max_quality: read 89ms
rotated.png                  high_performance: miss 16ms | normal_quality: read 43ms | high_quality: read 57ms | max_quality: read 147ms

Bunu elli gerçek yakalama üzerinde bir kez çalıştırın ve önceden ayarlanmış tartışma sona erer.

Pratik Kılavuzlar

  • DecodeType‘ı PDF417 ile sınırlayın aksi takdirde gerçekten karışık sembolojiler beklemiyorsanız. Varyantı bildiğinizde MACRO_PDF417, COMPACT_PDF417 veya MICRO_PDF417 kullanın.
  • Kodlamadan önce kırpın. Barkod yalnızca %5’i kapladığında tam bir A4 taramasını geçirmek, algılama süresini boşa harcar ve yanlış pozitif yüzey ekler.
  • Ara dosyaları kayıpsız tutun. PNG veya TIFF. Düşük kalite ayarlarında JPEG halkaları, çözücünün ihtiyaç duyduğu çubuk kenarlarını tam olarak etkiler.
  • Deneme sayısını kademelendirin en yavaş ön ayara varsayılan olarak gitmek yerine.
  • Tanıma ayarlamadan önce üretimi düzeltin. Kodlayıcıyı kontrol ediyorsanız, x_dimension değerini artırmak hiçbir maliyet getirmez ve herhangi bir okuyucu ayarından daha fazla hatayı çözer. PDF417 üretim makalesi bu parametreleri kapsar.
  • Kullanıcı tarafından sağlanan görüntülere dokunan herhangi bir okuyucuda timeout ayarlayın.

Ücretsiz Lisans Alın

Değerlendirme sürümü, Code 39 dışındaki sembolojiler için çözülen metne su işareti ekler; bu, yaptığınız herhangi bir çift yönlü testine müdahale eder. Bir ücretsiz geçici lisans bu durumu değerlendirme için kaldırır.

Ücretsiz Ek Kaynaklar

Sonuç

Python’da PDF417 barkodlarını okumak, temiz görüntülerde iki satırlık bir işlem ve gerçek görüntülerde bir mühendislik problemidir. Yukarıdaki ölçümler basit bir yaklaşımı işaret ediyor: DecodeType‘ınızı adlandırın, varsayılan olarak normal_quality kullanın, bir kez high_quality ve dekonvolüsyon etkinleştirerek tekrar deneyin ve işlem yapmadan önce her sonucu doğrulayın. Tekrar deneme yolu için pahalı ön ayarları saklayın ve bir bütün görüntü sınıfı her ayarda başarısız olduğunda, okuyucu yerine yakalamayı düzeltin. Sorularınızı ücretsiz destek forumunda bekliyoruz.

FAQs

  1. Aynı PDF417 barkodu bir görüntüde okunup diğerinde neden başarısız oluyor?
    Tanıma, yakalama sonrası her bir modülün kaç piksel kapladığına bağlıdır. Bulanıklık, ölçek küçültme ve JPEG sıkıştırması, etkili modül genişliğini azaltır ve bir modül yaklaşık iki temiz pikselin altına düştüğünde, hiçbir ön ayar bunu kurtaramaz.

  2. PDF417 için hangi tanıma ön ayarını kullanmalıyım?
    normal_quality ile başlayın; bu varsayılandır. Kamera çekimleri ve taramalar için high_quality‘ye geçin ve max_quality‘yi yalnızca tekrar denemeleri için ayırın çünkü bu ayar çok daha yavaştır ve çok fazla ek okuma sağlamaz.

  3. DecodeType’ı PDF417 ile sınırlamak gerçekten okumayı hızlandırıyor mu?
    Evet. Varsayılan DecodeType.ALL_SUPPORTED_TYPES olup, desteklenen tüm sembolojiler için dedektörü çalıştırır. PDF417’yi açıkça belirtmek bu işi ortadan kaldırır ve başka bir sembolojiden yanlış pozitif oluşma ihtimalini de ortadan kaldırır.

  4. Aspose.BarCode, birkaç görüntüye bölünmüş bir Macro PDF417 mesajını okuyabilir mi?
    Evet. Her bir segmenti DecodeType.MACRO_PDF417 ile okuyun ve genişletilmiş sonuçta macro_pdf_417_file_id, macro_pdf_417_segment_id ve macro_pdf_417_segments_count değerlerini kullanarak yükü sırasıyla yeniden birleştirin.

  5. Çözülen bir sonucun güvenilir olup olmadığını nasıl anlarım?
    BarCodeResult üzerindeki reading_quality ve confidence değerlerini kontrol edin ve region dörtgenini kullanarak barkodun görüntüde beklediğiniz yerde bulunup bulunmadığını doğrulayın.

  6. Bir sürücü belgesi veya biniş kartı fotoğrafından PDF417’yi okuyabilir mi?
    Evet, yakalama odakta olduğu ve barkod kesilmemiş olduğu sürece okuyabilir. Okumadan önce barkod bölgesini kırpın ve ara dosyalar için JPEG yerine PNG tercih edin.

Daha Fazla Oku