Home Assistant

차량 번호판 인식 (LPR): 주차장 카메라에 'Plate Recognizer'를 연동하여 VIP 주차 시스템 만들기

katakana 2025. 12. 29. 20:08

1. LPR(License Plate Recognition)의 원리

사람의 눈에는 그냥 글자지만, 컴퓨터에게는 복잡한 이미지일 뿐입니다. LPR 시스템은 다음 과정을 거칩니다.

  1. 객체 감지: 화면에서 '자동차'를 찾습니다.
  2. 영역 추출: 자동차 엉덩이 부분에서 '번호판' 네모 칸을 찾습니다.
  3. OCR (광학 문자 인식): 이미지를 글자(12가 3456)로 변환합니다.
  4. 검증: 등록된 화이트리스트와 대조합니다.

우리는 이 복잡한 과정을 처리해 주는 강력한 솔루션인 **'Plate Recognizer'**를 사용할 것입니다. (한국 번호판 인식률이 세계 최고 수준이며, 월 2,500회까지 무료입니다.)

2. [준비물] 카메라 각도의 중요성

소프트웨어보다 카메라 위치가 훨씬 중요합니다.

  • 높이: 카메라가 너무 높으면 번호판이 안 보입니다. 차량 번호판과 수평에 가까울수록 좋습니다. (눈높이~2m 권장)
  • 각도: 정면에서 찍는 게 가장 좋지만, 30도 이내의 측면까지는 인식합니다.
  • 조명 (야간): 밤에는 번호판이 반사되어 하얗게 날아가는 경우(White-out)가 많습니다. CCTV의 'HLC(High Light Compensation)' 기능을 켜거나, 적외선(IR) 조명이 번호판을 직접 비추지 않도록 각도를 조절해야 합니다.

3. [실습 1] Plate Recognizer 설정

로컬 서버(OpenALPR 등)를 구축할 수도 있지만, 설정이 매우 까다롭고 한국 번호판 인식률이 떨어집니다. 우리는 가장 확실한 클라우드 API를 사용합니다.

  1. 가입: Plate Recognizer 웹사이트에 가입하고 API Token을 발급받습니다.
  2. 설정: configuration.yaml에 다음을 추가합니다.
YAML
 
image_processing:
  - platform: platerecognizer
    api_token: !secret platerecognizer_api_token # 발급받은 토큰
    regions:
      - kr # 한국 번호판 형식 지정
    watched_cameras:
      - camera.parking_lot # 주차장 CCTV 엔티티 이름
    save_file_folder: /config/www/plates/ # 인식된 사진 저장 경로
    save_timestamped_file: true
  • 팁: regions: - kr을 꼭 넣어야 한국 번호판(두 줄짜리, 신형 세 자리 등)을 정확히 인식합니다.

4. [실습 2] "차가 왔을 때만" 인식시키기 (자동화 전략)

LPR API는 무료 사용량이 정해져 있습니다(월 2,500회). CCTV 영상을 24시간 내내 분석하면 1시간 만에 사용량을 다 씁니다.

따라서 "Frigate가 자동차를 감지했을 때만" 스냅샷을 찍어서 LPR 서버로 보내야 합니다. 이것이 엔지니어링의 핵심입니다.

자동화 로직 (YAML):

YAML
 
alias: "[LPR] 차량 감지 시 번호판 판독"
trigger:
  - platform: mqtt
    topic: frigate/events
    # Frigate가 'car'를 감지했을 때 트리거
condition:
  - condition: template
    value_template: "{{ trigger.payload_json['after']['label'] == 'car' }}"
action:
  - service: image_processing.scan
    target:
      entity_id: image_processing.platerecognizer_parking_lot

이제 차가 들어올 때만 API를 호출하므로, 하루에 차가 80번(2500회/30일) 들어오지 않는 이상 무료로 평생 쓸 수 있습니다.

5. [실습 3] 번호판 매칭 및 차고 문 열기

이제 판독된 글자가 내 차 번호(123가4567)와 일치하면 문을 엽니다.

YAML
 
alias: "[Parking] 등록 차량 진입 시 차단기 개방"
trigger:
  - platform: event
    event_type: image_processing.detect_face # LPR 완료 이벤트
    event_data:
      entity_id: image_processing.platerecognizer_parking_lot
condition:
  # 인식된 번호가 화이트리스트에 있는지 확인
  - condition: template
    value_template: >
      {{ trigger.event.data.plate in ['123가4567', '56너8901'] }} 
action:
  # 1. 차고 문 열기
  - service: cover.open_cover
    target:
      entity_id: cover.garage_door
  # 2. 환영 메시지 (누구 차인지 구분)
  - service: tts.google_translate_say
    data:
      entity_id: media_player.living_room
      message: >
        {% if trigger.event.data.plate == '123가4567' %}
          주인님이 도착했습니다.
        {% else %}
          아내분이 도착했습니다.
        {% endif %}
  # 3. 텔레그램으로 사진 전송 (보안)
  - service: notify.telegram
    data:
      message: "차량 진입: {{ trigger.event.data.plate }}"
      data:
        photo:
          - file: "/config/www/plates/{{ trigger.event.data.plate }}.jpg"

6. 고급 팁: '미인식 차량' 관리

등록되지 않은 차량이 들어오면 어떻게 할까요?

  • 알림: "미등록 차량 진입! 번호: 99하1234" 라는 알림을 사진과 함께 폰으로 보냅니다.
  • 응용: 택배 차량이나 배달 오토바이 번호를 로그로 남겨두면, 나중에 보안 사고 발생 시 유용한 증거가 됩니다.

7. 결론: 주차부터 시작되는 스마트홈

LPR 시스템은 방문객에게 가장 강렬한 인상을 주는 스마트홈 기술입니다. 차를 타고 진입하는 순간, 집이 나를 알아보고 문을 열어주는 경험은 마치 배트맨이 되어 배트케이브에 들어가는 듯한 쾌감을 줍니다.

Frigate(객체 감지)와 LPR(문자 인식)을 결합하여 자원을 효율적으로 쓰면서도 정확도는 극대화하는 것, 이것이 바로 마스터 레벨의 자동화입니다.

지금까지 우리는 '확실한 것(0 또는 1)'만 다뤘습니다. 번호판이 맞거나 틀리거나, 사람이 있거나 없거나. 하지만 현실 세계는 애매합니다. "재실 센서는 꺼졌는데, TV가 켜져 있다면 사람이 있는 걸까?"

다음 58편에서는, 0과 1의 이분법을 넘어 **'확률(Probability)'**로 생각하는 **'Bayesian Sensor(베이지안 센서)'**를 도입하여, 여러 개의 불완전한 단서들을 조합해 재실 감지 정확도를 **99.9%**까지 끌어올리는 데이터 과학의 영역으로 들어갑니다.