2.1. Symbology ¶
- 1차원 바코드 인식을 하기 위해서는 해당 바코드의 심볼로지를 이해해야 한다.
- 심볼로지란, 바코드를 표시하는 방법을 정한 규칙이다. 이 규칙이 존재해야 해당 바코드를 생성하거나 읽을 수 있다.
2.1.3. Quite Zone ¶
- 바코드를 보다 쉽게 인식하기 위해, 바코드 좌우로 X-dimension의 10배의 Space가 존재한다.
- 실제 영상에서는 대개 존재하나. 캡쳐한 화면 상에 없을 수도 있고, 샘플링 과정에서 잡음이 끼기 때문에 바코드를 인식하기 위해 이 영역을 인식하는 것을 추천하지는 않는다.
2.2. EAN-13 Symbology ¶
- EAN-13은 13자리 숫자(Check Digit 포함)로 생성하거나 해석할 수 있는 바코드이다.
- EAN-13의 심볼로지에 대해 잘 설명되어 있는 페이지(영문) : http://www.barcodeisland.com/ean13.phtml
2.2.1. 바코드 구성 ¶
- 1은 bar, 0은 space로 나타냄. X는 둘 중 하나
- Left(Start) Guard
- 101
- 101
- Left Characters
- 0XXXXX1 * 6 (space로 시작해서 bar로 끝남)
- 0XXXXX1 * 6 (space로 시작해서 bar로 끝남)
- Center Guard
- 01010
- 01010
- Right Characters
- 1XXXXX0 * 6 (bar로 시작해서 space로 끝남)
- 1XXXXX0 * 6 (bar로 시작해서 space로 끝남)
- Right(End) Guard
- 101
- 101
- Start, End Guard는 바코드의 시작과 끝을 알리는 심볼이다.
- Center Guard는 Left Characters와 Right Characters를 구분하는 심볼이다.
- Left Characters와 Right Characters는 각각 6자리 숫자를 나타낸다.
- 나머지 한 자리는 Left Characters의 Encoding으로 부터 해석한다. (아래 Encoding에서 설명)
- Right Characters의 마지막 한 자리는 Check Digit 이다.
2.2.3. Check Digit ¶
- EAN-13의 Check Digit는 마지막 한 자리이며, 나머지 12자리로 부터 생성된다.
- 각 12자리 숫자에 가중치를 곱하여 다 합하고, 합한 값을 10으로 나눈 나머지를 10에서 빼면 Check Digit가 나온다.
- 가중치는 1, 3, 이 반복되는 패턴이다. 첫 번째 자리 숫자에 1을 곱하고, ... , 열두 번째 자리 숫자에 3을 곱한다.
- 가중치는 1, 3, 이 반복되는 패턴이다. 첫 번째 자리 숫자에 1을 곱하고, ... , 열두 번째 자리 숫자에 3을 곱한다.
# Python def generate_isbn_check_digit(numbers): # Suppose that 'numbers' is 12-digit numeric string sum = 0; for i, number in enumerate(numbers): if i%2 == 0: sum += int(number) * 1 else: sum += int(number) * 3 return 10 - sum % 10
2.2.4.1. Character ¶
- 0은 space, 1은 bar를 의미한다.
Character | Left(Odd) | Left(Even) | Right |
0 | 0001101 | 0100111 | 1110010 |
1 | 0011001 | 0110011 | 1100110 |
2 | 0010011 | 0011011 | 1101100 |
3 | 0111101 | 0100001 | 1000010 |
4 | 0100011 | 0011101 | 1011100 |
5 | 0110001 | 0111001 | 1001110 |
6 | 0101111 | 0000101 | 1010000 |
7 | 0111011 | 0010001 | 1000100 |
8 | 0110111 | 0001001 | 1001000 |
9 | 0001011 | 0010111 | 1110100 |
- Encoding을 쉽게 해독하기 위해 위의 표를 통해 성질을 파악해두는 것이 좋다.
- Left(Odd), Right는 각각의 비트를 반전하여 서로 같게 만들 수 있다.
- Left(Even), Right는 비트열을 좌우 반전하여 서로 같게 만들 수 있다.
- 0 혹은 1이 가장 길게 연속되어봐야 4개이다.
- Left의 가장 왼쪽 비트는 0, 가장 오른쪽 비트는 1이고, Right는 그 반대이다.
- 가운데에 있는 비트 5개(32 가지수)로 숫자를 구분하며, Left(Odd), Left(Even) 중에 겹치는 것이 없다.
- 가운데에 있는 비트 5개(32 가지수)로 숫자를 구분하며, Left(Odd), Left(Even) 중에 겹치는 것이 없다.
- 모든 인코딩에 대해 0, 1을 영역으로 구분하면 그 영역은 항상 4개이다.
- 즉, 하나의 숫자를 나타내기 위해 2개의 Bar와 2개의 Space가 존재한다.
- 즉, 하나의 숫자를 나타내기 위해 2개의 Bar와 2개의 Space가 존재한다.
2.2.4.2. First Number ¶
- 스페이스와 바에 의해 직접적으로 표현되는 숫자는 12개이다. 나머지 하나의 숫자는 Left Character의 인코딩을 해석해 얻어내야 한다. 예를 들어 8801067070256 이라는 EAN-13 바코드가 있을 때, 바코드에 직접적으로 얻어지는건 맨 앞의 자리 '8'이 빠진 801067070256 이고, 이는 Left Character에 해당하는 801067의 인코딩을 보고 알아내야 한다.
3.1.1. Planar and Packed ¶
- Packed는 Y, U, V의 데이터 영역이 분리되지 않은 포맷이다.
- Planar는 Y, U, V의 데이터 영역이 분리된 포맷이다.
3.1.2. NV21 (Planar) ¶
- 안드로이드 공식 문서에 따르면 항상 지원되는 포맷이라고 한다.
- Planar Format으로, 프레임 크기만큼 Y 정보가 있고, 그 뒤에 프레임 크기의 반 만큼 U, V 정보가 존재한다.