티스토리 뷰
자동차 번호판 인식 시스템(LPR, License Plate Recognition)은 현재 다양한 분야에서 활용되고 있습니다.
- 아파트 주차관제
- 무인 출입 시스템
- 불법 주정차 단속
- 물류 차량 관리
- 스마트시티 관제
- 공공기관 차량 출입관리
- 톨게이트 자동 정산
특히 국내 환경에서는 단순 OCR만으로는 높은 정확도를 얻기 어렵습니다.
그 이유는 다음과 같습니다.
- 차량 속도
- 야간 반사
- 번호판 기울어짐
- 카메라 화질 문제
- 비·눈·안개 환경
- 한글 오인식
- 구형 번호판 존재
따라서 실제 서비스에서는 아래 구조를 조합해서 구현합니다.
OpenCV 번호판 검출
+
CLOVA OCR 문자 인식
+
국내 번호판 규칙 기반 후처리
이번 글에서는 Java 기반으로 국내 번호판 인식 시스템을 구축하는 방법을 단계별로 상세하게 정리합니다.
1. 국내 자동차 번호판 구조 이해
번호판 OCR을 만들기 전에 반드시 알아야 하는 것이 국내 번호판 규칙입니다.
일반 OCR과 다르게 자동차 번호판은 매우 정형화되어 있습니다.
즉:
- 숫자 패턴이 정해져 있고
- 사용 가능한 한글이 제한되어 있으며
- 지역번호 포함 구형 번호판도 존재합니다.
이 특징 때문에 OCR 결과를 후처리하면 정확도를 크게 올릴 수 있습니다.
2. 현재 사용되는 국내 번호판 종류
1) 신형 번호판
현재 가장 많이 사용하는 형태입니다.
예시:
123가4567
12나3456
구조:
숫자 2~3자리
+
한글 1자리
+
숫자 4자리
2) 지역번호 포함 구형 번호판
예시:
서울12가3456
부산34나5678
경기77허1234
특징:
- 지역명 포함
- 현재도 일부 차량 사용 중
- OCR 시 지역명 인식 필요
3) 영업용 번호판
예시:
서울74바1234
주로:
- 택시
- 렌터카
- 버스
- 화물차
등에서 사용됩니다.
3. 국내 번호판에서 사용 가능한 한글
자동차 번호판의 한글은 아무 글자나 사용하는 것이 아닙니다.
실제로는 지정된 문자만 사용됩니다.
대표적으로:
가
나
다
라
마
거
너
더
러
머
버
서
어
저
고
노
도
로
모
보
소
오
조
구
누
두
루
무
부
수
우
주
허
하
호
배
국
합
육
해
공
이 특징이 매우 중요합니다.
왜냐하면 OCR 오인식을 강하게 줄일 수 있기 때문입니다.
예를 들어:
OCR 결과실제 번호판
| 12기3456 | 12가3456 |
| 77버1234 | 77허1234 |
| O | 0 |
| B | 8 |
이런 식의 오류가 자주 발생합니다.
따라서:
허용 가능한 문자만 인정
하는 후처리가 핵심입니다.
4. 전체 시스템 구조
실무에서 가장 많이 사용하는 구조는 아래 형태입니다.
CCTV
↓
OpenCV 번호판 검출
↓
번호판 이미지 Crop
↓
CLOVA OCR
↓
번호판 정규식 검증
↓
오인식 보정
↓
DB 저장
↓
출입 제어 시스템
5. CLOVA OCR 장단점
국내 번호판 OCR 시스템에서 CLOVA OCR을 많이 사용하는 이유는 한글 인식 성능 때문입니다.
장점
| 한글 OCR 성능 | 국내 OCR 중 매우 우수 |
| 국내 번호판 최적화 | 신형·구형 번호판 인식 우수 |
| API 연동 난이도 | 비교적 쉬움 |
| 유지보수 | 서버 구축 부담 적음 |
| 정확도 | 높은 편 |
| 개발 속도 | 빠름 |
단점
| 비용 | 사용량 기반 과금 |
| 인터넷 의존 | 외부망 필요 |
| API 제한 | 초당 호출 제한 존재 |
| 네트워크 영향 | 지연 가능성 존재 |
| 이미지 품질 의존 | 저화질에서는 성능 저하 |
6. CLOVA OCR API Key 발급 방법
CLOVA OCR 사용을 위해서는 NAVER Cloud Platform에서 API를 생성해야 합니다.
1) 네이버 클라우드 가입
NAVER Cloud Platform 접속: https://www.ncloud.com/
회원가입 및 로그인 진행.
2) CLOVA OCR 서비스 이동
콘솔 접속 후:
AI Services
→ CLOVA OCR
메뉴로 이동합니다.
3) OCR 서비스 생성
OCR 서비스 생성 버튼 클릭 후:
- 서비스명 입력
- 일반 OCR 선택
- Invoke URL 생성
진행합니다.
4) Secret Key 발급
서비스 생성 후 아래 정보가 발급됩니다.
Invoke URL
Secret Key
이 정보가 실제 API 호출에 사용됩니다.
5) API Key 보관 주의사항
Secret Key는 외부에 노출되면 안됩니다.
권장 방식:
application.yml
환경변수
서버 Vault
등으로 관리.
6) application.yml 설정 예시
clova:
ocr:
url: https://example.apigw.ntruss.com/custom/v1/1234/abcd
secret-key: YOUR_SECRET_KEY
7) Java 설정값 주입
@Value("${clova.ocr.url}")
private String apiUrl;
@Value("${clova.ocr.secret-key}")
private String secretKey;
7. 개발 환경 구성
권장 환경
| Java | JDK 17 |
| Framework | Spring Boot |
| OCR | CLOVA OCR |
| 영상처리 | OpenCV |
| DB | MariaDB |
| WAS | Tomcat |
7. Maven 의존성 설정
Spring Web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
OpenCV
<dependency>
<groupId>org.openpnp</groupId>
<artifactId>opencv</artifactId>
<version>4.9.0-0</version>
</dependency>
8. OpenCV 설치
OpenCV 공식 사이트: https://opencv.org/
설치 후 Java Native Library 등록 필요.
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
9. 번호판 검출 과정
OCR 전에 가장 중요한 단계입니다.
번호판 영역만 정확하게 잘라야 OCR 정확도가 크게 올라갑니다.
전체 흐름:
이미지 입력
→ 흑백 변환
→ Blur 처리
→ Edge 검출
→ 윤곽선 탐색
→ 번호판 비율 탐색
→ 번호판 Crop
10. 이미지 읽기
Mat image = Imgcodecs.imread("car.jpg");
if(image.empty()){
System.out.println("이미지 로드 실패");
return;
}
11. 흑백 변환
컬러보다 흑백이 OCR에 훨씬 유리합니다.
Mat gray = new Mat();
Imgproc.cvtColor(
image,
gray,
Imgproc.COLOR_BGR2GRAY
);
12. Blur 처리
노이즈 제거 단계입니다.
Mat blur = new Mat();
Imgproc.GaussianBlur(
gray,
blur,
new Size(5,5),
0
);
13. Edge 검출
번호판 테두리를 찾는 핵심 과정입니다.
Mat edge = new Mat();
Imgproc.Canny(
blur,
edge,
100,
200
);
14. 윤곽선 탐색
List<MatOfPoint> contours = new ArrayList<>();
Imgproc.findContours(
edge,
contours,
new Mat(),
Imgproc.RETR_TREE,
Imgproc.CHAIN_APPROX_SIMPLE
);
15. 번호판 후보 찾기
국내 번호판은 가로 직사각형 형태입니다.
for(MatOfPoint contour : contours){
Rect rect = Imgproc.boundingRect(contour);
double ratio =
(double) rect.width / rect.height;
if(ratio > 2 && ratio < 6){
Mat plate = new Mat(image, rect);
Imgcodecs.imwrite(
"plate.jpg",
plate
);
}
}
16. 번호판 전처리
OCR 정확도를 결정하는 핵심 단계입니다.
Threshold 처리
Mat binary = new Mat();
Imgproc.threshold(
gray,
binary,
0,
255,
Imgproc.THRESH_BINARY
+ Imgproc.THRESH_OTSU
);
효과:
- 문자 대비 강화
- 야간 인식 개선
- OCR 정확도 상승
18. CLOVA OCR 호출 구조
인증은 Header 기반입니다.
X-OCR-SECRET
19. Java OCR API 호출 예제
URL url = new URL(apiUrl);
HttpURLConnection conn =
(HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty(
"Content-Type",
"application/json"
);
conn.setRequestProperty(
"X-OCR-SECRET",
secretKey
);
conn.setDoOutput(true);
20. OCR 요청 JSON 예시
{
"version": "V2",
"requestId": "plate-test",
"timestamp": 123456789,
"images": [
{
"format": "jpg",
"name": "plate"
}
]
}
21. OCR 응답 예시
{
"images": [
{
"fields": [
{
"inferText": "123가4567"
}
]
}
]
}
22. OCR 결과 추출
String plateNo =
jsonNode
.get("images")
.get(0)
.get("fields")
.get(0)
.get("inferText")
.asText();
23. 번호판 정규식 검증
국내 번호판은 규칙이 명확합니다.
그래서 OCR 이후 정규식 검증이 매우 중요합니다.
신형 번호판 검증
String regex =
"^\\d{2,3}[가-힣]\\d{4}$";
지역번호 포함 번호판 검증
String regex =
"^(서울|부산|대구|인천|광주|대전|울산|경기|강원|충북|충남|전북|전남|경북|경남|제주)"
+
"\\d{1,3}[가-힣]\\d{4}$";
24. 정확도를 결정하는 핵심 요소
실제 번호판 인식 정확도를 가장 크게 좌우하는 요소는 다음입니다.
요소영향도
| 카메라 화질 | 매우 큼 |
| 야간 조명 | 매우 큼 |
| 번호판 Crop 품질 | 매우 큼 |
| OCR 엔진 | 큼 |
| 후처리 | 매우 큼 |
즉:
OCR 엔진보다 전처리와 후처리가 더 중요
한 경우도 많습니다.
25. CLOVA OCR 장단점
장점
- 한글 OCR 매우 강력
- 국내 번호판 인식 우수
- API 연동 쉬움
- 유지보수 편리
- 정확도 높음
단점
- 사용량 기반 과금
- 외부 인터넷 필요
- API 호출 제한 존재
- 네트워크 지연 가능성
#자동차번호판인식
#번호판OCR
#CLOVAOCR
#네이버OCR
#JavaOCR
#OpenCV
#차량번호인식
#주차관제
#SpringBoot
#번호판인식프로그램
#국내번호판
#자동차OCR
#RTSP
#CCTV번호판인식
#OCR후처리
#한국번호판
#AI번호판인식
#번호판정규식
#OpenCVJava
#ClovaOCRAPI'API' 카테고리의 다른 글
| 실시간 환율 조회 API 연계 (0) | 2026.05.20 |
|---|---|
| 국토교통부 아파트 매매 실거래가 자료 API 데이터 연계 (0) | 2026.05.19 |
| 기상청 단기예보 API 사용법 (0) | 2026.05.18 |
| Google Maps API 구글 지도 API 연동 - 5. 커스터마이징 (0) | 2026.05.14 |
| Google Maps API 구글 지도 API 연동 - 4. 클러스터링 (0) | 2026.05.14 |
| Google Maps API 구글 지도 API 연동 - 3. 장소 (0) | 2026.05.14 |
| Google Maps API 구글 지도 API 연동 - 2. 길찾기 (0) | 2026.05.14 |
| Google Maps API 구글 지도 API 연동 - 1. 시작하기 (0) | 2026.05.14 |
- Total
- Today
- Yesterday
- 문제풀이
- 정보처리기사
- 블루투스
- MySQL
- 데이터베이스
- OpenCV
- Android
- C언어
- 벡터
- 자바
- 배열
- 아두이노
- C++
- 자료구조
- C
- DB연동
- 상속
- Java
- 파이썬
- 파일처리
- C++ 클래스
- 클래스
- c#
- 안드로이드
- Class
- 리스트
- 알고리즘
- String
- 문자열
- html
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
