[컴퓨터 비전] OpenCV를 활용한 번호판으로 전기자동차 인식하기 with Python

Jaehwan Lee·2021년 5월 9일
1

컴퓨터 비전

목록 보기
1/1
post-thumbnail

Intro

본 글에서는 컴퓨터 비전 분야에서 매우 활발히 연구가 진행되는 LPR(License Plate Recognition)와 관련하여 전기 자동차의 번호판을 인식하는 한 가지 방법에 대해 작성해보려 한다. 단, 전기 자동차의 번호판 문자열을 인식하려는 것은 아니다. 전기 자동차의 번호판을 보면 여러 문양들이 추가되어 있어 번호판 문자열 인식률이 떨어질 수는 있지만 기존의 LPR 방법으로 가능하다. 이번 글에서는 단순히 전기 자동차인지 아닌지를 Python OpenCV를 이용하여 인식해보려 한다.



Solution Explanation

여러 방법들이 가능하겠지만 가장 단순한 방법 중 한 가지 방법을 사용하겠다. 간단히 미리 말하자면 전기 자동차의 특징인 하늘색 또는 푸른색 픽셀 값을 검출하여 전기자동차인지 아닌지를 인식하는 것이다.

단계는 다음과 같다.

  1. 전체 이미지에서 번호판이 있는 구역을 구한다.
  2. 전기 자동차의 번호판 중 하늘색 영역을 검출할 수 있는 픽셀 영역을 설정한다.
  3. 번호판 구역의 모든 픽셀 값들을 검사하여 전기자동차 번호판을 검출할 수 있는 픽셀 영역에 속하는 픽셀의 개수를 파악하여 이 비율을 가지고 전기차인지를 판단한다.


Execution

위에서 설명한 단계에 따라 실행해보겠다.

1단계

오리지널 이미지는 위와 같다. 차량으로부터 멀리서 찍은 이미지도 가능하지만 이해를 돕기 위해 극단적인 번호판 예시를 사용했다.

번호판의 영역은 위와 같이 빨간색 상자 안에 있다.

2단계

전기자동차의 번호판 색상인 하늘색을 검출할 수 있는 픽셀 범위를 구해야한다. Python OpenCV cv2의 inRange 함수를 사용한다. cv2.inRange 함수는 간단히 말하여 픽셀 값이 범위에 속하는 영역은 흰색(255)으로, 나머지 부분은 검은색(0)으로 바꾸어 버린다.

elec_range = cv2.inRange(plate, (50, 150, 170), (200, 230, 255)) # 전기자동차 번호판 색상 인식 픽셀 범위 설정(하이퍼 파라미터)
elec_image = cv2.imshow('electronic_license_plate', elec_range)
cv2.waitKey()

위의 픽셀 범위에 들어오면 아래의 이미지와 같이 픽셀 값 범위에 속하는 하늘색 부분의 픽셀 값은 가장 밝은 상태(255)로, 나머지 속하지 않는 영역은 모두 가장 어두운 픽셀 값(0)로 바꾸어버린다. 전기자동차 번호판 하늘색 색상을 인식하기 위한 픽셀 범위는 하이퍼 파라미터이다. 따라서 주변환경이 매우 밝거나 매우 어둡다면 이 범위 값들을 보정 및 수정할 필요가 있다.

3단계

이제 검출된 부분의 픽셀이 얼마나 되는지를 구하여 이를 통해 전기자동차라는 것을 인식할 수 있다. 검출한 이미지에서 밝은 부분이 많다는 것은 전기자동차라는 것이다. 즉, 픽셀 값이 어두운(0)인 부분과 밝은 부분(255)의 비율을 통해 인식이 가능하다.

isElectronic = 0 
notElectronic = 0

for y in range(height):
    for x in range(width):
        if elec_range[y, x] >= 1: # 픽셀 값이 1 이상이면 전기차로 가정
            isElectronic += 1
        else:
            notElectronic += 1
                                  
print(isElectronic, notElectronic)
            
if 10 * isElectronic >= notElectronic: # 10배(하이퍼 파라미터) 이상 차이가 나면 전기자동차로 인식
    print("전기 자동차가 검출되었습니다.")

else:
    print("전기 자동차가 아닙니다.")

전기차를 의미하는 isElectronic 변수와 아님을 의미하는 notElectronic 변수를 생성한다. 모든 번호판 구역의 픽셀 값을 확인하기 위해 height와 width를 반복문을 통해 모두 순회한다. 좀 전에 범위를 설정한 elec_range의 모든 픽셀 값을 반복문으로 순회하며 픽셀 값이 1 이상이면 즉, 0이 아니면 전기차인 것으로 인식한다.

각각의 변수를 출력해보면 위와 같이 나온다. 전기자동차임을 나타내는 isElectronic에 10배를 하여 이를 notElectronic보다 크면 전기자동차라고 인식하였다. 이때 값 10은 하이퍼 파라미터이니 상황에 따라 조절하면 된다.



Validation

다른 데이터를 활용하여 점검해보자. 이미지는 모두 구글에서 검색하여 사용하였다.

Electronic Car Image

Not Electronic Car Image



Conclusion

Python OpenCV 이미지처리 라이브러리를 활용하여 픽셀 값을 이용한 전기자동차 인식 방법에 대해 알아보았다. 모든 상황에서 통용되는 방법론은 없기에 특정 상황에 잘 맞는 임계값(하이퍼 파라미터)를 설정하여 사용하면 좋을 듯 하다.

profile
느리더라도 꾸준히 멈춤 없이

0개의 댓글