programing

차량 번호판 감지에 적합한 알고리즘은 무엇입니까?

nasanasas 2020. 12. 13. 09:44
반응형

차량 번호판 감지에 적합한 알고리즘은 무엇입니까?


배경

대학에서의 마지막 프로젝트를 위해 차량 번호판 감지 애플리케이션을 개발 중입니다. 나는 나 자신을 중급 프로그래머라고 생각하지만, 내 수학 지식은 중등 학교 이상의 어떤 것도 부족하기 때문에 올바른 공식을 만드는 것이 생각보다 어렵습니다.

다음과 같은 학술 논문을 찾는 데 많은 시간을 할애했습니다.

수학에 관해서는 길을 잃었습니다. 이 테스트로 인해 다양한 그래픽 이미지가 생산적으로 입증되었습니다. 예를 들면 다음과 같습니다.

대체 텍스트

...에

대체 텍스트

그러나이 접근 방식은 특정 이미지에만 적용되었으며, 기술이 다른 이미지에 적용되면 변환이 더 나빠질 것이라고 확신합니다. 다음을 수행하는 "bottom hat morphology transform"이라는 공식에 대해 읽었습니다.

기본적으로 변환은 그림의 모든 어두운 세부 사항을 유지하고 다른 모든 것을 제거합니다 (더 큰 어두운 영역과 밝은 영역 포함).

이에 대한 정보는 많지 않지만 보고서 끝 부분에있는 문서의 이미지는 그 효과를 보여줍니다.

기타 제약

  • C #으로 개발
  • 프로젝트를 영국 등록 번호판으로 만 제한
  • 데모로 변환 할 이미지를 선택할 수 있습니다.

질문

개발에 집중해야 할 변환 기술과 알고리즘이 도움이 될 수있는 방법에 대한 조언이 필요합니다.

편집 : 계속에 존재하는 새로운 정보 -차량 번호판 감지


취할 수있는 접근 방식에는 여러 가지가 있지만 가장 먼저 떠오르는 전략은 다음과 같습니다.

  • 발견 / 조사 : 식별해야 할 수있는 색상 및 글꼴 세트를 식별하십시오. 샘플 사진이 대부분의 영국 판을 대표한다면 작업이 더 쉬워집니다. 예 : 흰색 배경에 간단한 단수 글꼴 및 검은 색 글자
  • 코드 : 색상이 주로 흰색과 검은 색인 이미지의 직사각형 영역을 식별합니다. 이것은 수학이 엄청나게 많은 문제가 아니며 집중할 수있는 번호판 영역을 제공해야합니다.
  • 코드 : 순수한 흑백 (모노크롬)으로 변환하고 아마도 멋지고 단단한 직사각형으로 크기를 조정 / 시프트하는 것과 같은 소구역을 정리하십시오.
  • API 사용 : 다음으로 하위 선택된 이미지 영역에서 기존 OCR (광학 문자 인식) 알고리즘을 사용하여 텍스트를 읽을 수 있는지 확인합니다.

내가 말했듯이 이것은 많은 전략 중 하나이지만 무거운 수학을 가장 적게 요구하는 전략으로 떠 오릅니다. 즉, 자신에게 적합한 OCR 구현을 찾을 수있는 경우입니다.


몇 년 전에 Java에서 비슷한 프로젝트를 수행했습니다. 먼저 Sobel 연산자를 적용한 다음 모든 이미지를 플레이트 이미지로 마스킹했습니다 (Sobel 연산자도 적용됨). 최대 일치 영역은 판이있는 곳입니다. 그런 다음 선택한 지역에 OCR을 적용하여 번호를 얻습니다.


이 작업을 수행해야하는 방법은 다음과 같습니다. 여기에서 자세한 답변을 읽으 십시오 .

  1. 그레이 스케일로 변환합니다.
  2. 3x3 또는 5x5 필터가있는 가우시안 블러.
  3. 수직 가장자리를 찾기 위해 Sobel 필터를 적용합니다.

    Sobel(gray, dst, -1, 1, 0)

  4. 결과 이미지를 임계 값으로 설정하여 이진 이미지를 얻습니다.
  5. 적절한 구조 요소를 사용하여 형태 학적 닫기 연산을 적용합니다.
  6. 결과 이미지의 윤곽을 찾습니다.
  7. minAreaRect각 윤곽선을 찾으십시오 . 종횡비와 최소 및 최대 영역에 따라 사각형을 선택합니다.
  8. 선택한 각 윤곽에 대해 가장자리 밀도를 찾습니다. 가장자리 밀도에 대한 임계 값을 설정하고 가능한 플레이트 영역으로 해당 임계 값을 위반하는 직사각형을 선택합니다.
  9. 이 후에는 직사각형이 거의 남지 않습니다. 방향 또는 적합하다고 판단되는 기준에 따라 필터링 할 수 있습니다.
  10. adaptiveThreshold원본 (회색조) 이미지 이미지에서 감지 된 직사각형 부분을 잘라 내고 OCR을 적용합니다.

영국에는 이미 그렇게하는 시스템이 있습니다. 나는 그들이 10 분 안에 런던에서 차를 찾을 수 있다는 것을 증명 한 TV 쇼를 본 기억이 난다. (그들이 번호를 알고 있고 차가 운전 중이라고 가정 할 때) 위키피디아를 읽는 것만으로도 문제에 대해 생각하기 시작하는 데 필요한 포인터를 얻을 수있다 : http : //en.wikipedia.org/wiki/Automatic_number_plate_recognition


그것은 바텀 햇 변환을 계산하는 방법을 정확하게 알려줍니다 (나에게 반전 된 단계적 임계 변환처럼 보입니다).

가장 먼저해야 할 일은 팽창과 침식의 두 가지 형태 기능을 구현하는 것입니다.

이렇게하려면 f와 b가 필요하며 발견 된 가장 큰 값을 유지하는 지점에서 이미지의 작은 영역에 대해 함수를 계산합니다.

(f ⊕ b)(s, t) = max{f (s − x, t − y) + b(x, y)
|(s − x), (t − y) ∈ Df ; (x, y)∈Db}

What this says is, take the maximum of the expression over all points in the domain region(such as a small rectangle centered at your point (s,t).

simple pseudo code would be

max = -infinity // for the point (s,t) on the image, must compute this for all points
for(x = -5 to 5)
for(y = -5 to 5)
max = Max(max, f(s - x, t - y) + b(x,y))

effectively we now have a new image of the max values.

It's actually quite simple so don't make it harder than it is(we are simply adding b(x,y) to each point in the region and finding out which one gives the maximum value).

you do the same for the erosion(very similar to above)

Now the opening and closing is the composition of the two

You can think of it first as performing a dilation and then an erosion for an opening.

It says finally subtract the closing from the original image and you should have your transform.


If you're interested in the problem of detecting the presence of a license plate (as opposed to recognizing it), you should probably look at the text detection in images as it is related to what you're doing.

This question is related to yours: Algorithm to detect presence of text on image


You can also refer to Automatic License Plate Recognition library & this query. This will also give you some idea about how to approach things,and how existing solutions are.

But as answered by paul, you should first try to find the rectangular number plate from the complete image and then binarize it and then use the OCR libraries available (Tesseract would be recommended)

You can refer to this link which will help you find the rectangular plate. You need to use openCV libraries, so you will not need alot of math but yes a basic understanding of what is happening behind the scenes can help you solve the problem in better way.


I would suggest using a service or third party for this. Open ALPR, provides an open source package that is very accurate for this service.

Open ALPR - https://www.openalpr.com/

Demo of Video Open ALPR

https://www.youtube.com/watch?v=E-U_H9EbW60

Or you could use an API -

Macgyver Computer Vision API

https://askmacgyver.com/explore/program/license-plate-recognition/3X5D3d2k

In this API you would simply make a post request to -

https://macgyver.services

Example Payload

{
id: "3X5D3d2k",
key: "free",
data: {
    "image_url": "https://storage.googleapis.com/marketing-files/program-markdown-assets/license-detection/license-plate.jpg",
    "country": "us",
    "numberCandidates": 2
  }
}

여기에 이미지 설명 입력

The image above would return the following -

"plate": "284FH8"
"confidence": 90.601013

참고 URL : https://stackoverflow.com/questions/4707607/what-are-good-algorithms-for-vehicle-license-plate-detection

반응형