Blog - APNR — automatyczne rozpoznawanie tablic z wideo

Jak działa pipeline APNR (ANPR): lokalizacja tablicy, matched filter, OCR szablonowy i fuzja wyników w czasie.

Autor
2code
Opublikowano
Tagi
  • APNR
  • ANPR
  • OpenCV
  • CV

APNR (Automatic Plate Number Recognition, często też ANPR) to klasyczny problem wizji: z sekwencji wideo wyciągnąć czytelny numer rejestracyjny. Poniżej rozkład pipeline’u bliski praktycznej implementacji Qt + OpenCV (lokalizacja → OCR → śledzenie w czasie).

Po co w ogóle „wideo”, a nie jedno zdjęcie?

Pojedyncza klatka bywa rozmazana, pod kątem albo z refleksem. W sekwencji możemy:

  1. znaleźć kandydata tablicy na wielu klatkach,
  2. rozpoznać znaki z różną pewnością,
  3. scalić wyniki w czasie (najlepszy znak wygrywa).

To właśnie robi warstwa detectedframe / detectedplate: match po położeniu i numerze klatki, potem aktualizacja znaków według score.

Pipeline

Lokalizacja tablicy

Typowy tor:

  • Sobel (apertura, rząd X/YX/Y, próg) — podkreśla pionowe/poziome krawędzie znaków,
  • Matched filter dopasowany do geometrii tablicy (jasny środek, ciemniejsze pasy),
  • selekcja prostokątów po polu powierzchni i proporcjach w/hw/h.

Kernel matched filtera można zapisać jako profil wiersza z dwoma „bokami” Gaussa i środkowym garbem:

k(x)={Ae(xt1)2/(0.2σ2)xbokBe(xm)2/(2σ2)xsˊrodekk(x) = \begin{cases} A\, e^{-(x-t_1)^2 / (0.2\sigma^2)} & x \in \text{bok} \\[4pt] B\, e^{-(x-m)^2 / (2\sigma^2)} & x \in \text{środek} \end{cases}

Po korelacji z obrazem widać pasy o proporcjach zbliżonych do tablicy PL.

OCR: nie „deep learning”, tylko szablony

W tym podejściu znaki porównuje się z bitmapami wzorców (0–9, A–Z) przez dopasowanie obrazu. Ważny detal polskich tablic: podzbiory alfabetu:

  • znaki powiatu (często 2–3 litery) — inny zestaw (m.in. B, D, I, O, Z),
  • znaki wyróżniające pojazdu — cyfry + litery bez mylących wariantów.

Dla każdego znaku trzymamy parę (ci,si)(c_i, s_i) — znak i score. Pewność całej tablicy:

p=1ni=1nsip = \frac{1}{n}\sum_{i=1}^{n} s_i

Fuzja w czasie

Gdy ta sama tablica wraca na kolejnych klatkach (przecięcie ROI + Δt\Delta t małe):

  • aktualizujemy bounding box,
  • przy konflikcie znaków bierzemy wariant z wyższym sis_i,
  • pilnujemy „dzielnika” (spacja po kodzie powiatu), typowo po 2. lub 3. znaku.

Dzięki temu chwilowy błąd OCR na jednej klatce nie psuje całego odczytu.

Co z tego wynika w produkcji?

  1. APNR ≠ samo OCR — lokalizacja i tracking są trudniejsze niż rozpoznanie znaku.
  2. Domena PL ma reguły — powiaty, długość 7–8 znaków, ograniczenia alfabetu mocno podnoszą precision.
  3. Czas jest feature’em — fuzja między klatkami to najtańszy „ensemble”.

Wróć do bloga

Porozmawiajmy o Twoim projekcie