Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

ISBN Barcode Image Recognition: Difference between revisions

From ZeroWiki
imported>joojis
No edit summary
(Repair batch-0002 pages from live compare)
 
(17 intermediate revisions by one other user not shown)
Line 16: Line 16:
=== Quite Zone ===
=== Quite Zone ===
* 바코드를 보다 쉽게 인식하기 위해, 바코드 좌우로 X-dimension의 10배의 Space가 존재한다.
* 바코드를 보다 쉽게 인식하기 위해, 바코드 좌우로 X-dimension의 10배의 Space가 존재한다.
* 실제 영상에서는 대개 존재하나. 캡쳐한 화면 상에 없을 수도 있고, 샘플링 과정에서 잡음이 끼기 때문에 바코드를 인식하기 위해 이 영역을 인식하는 것을 추천하지는 않는다.
=== Check Digit ===
=== Check Digit ===
* 바코드를 잘못 인식하는 경우를 방지하기 위해. 실제 데이터로부터 생성되는 데이터가 있을 수 있다.
* 바코드를 잘못 인식하는 경우를 방지하기 위해. 실제 데이터로부터 생성되는 데이터가 있을 수 있다.
Line 21: Line 22:
* EAN-13은 13자리 숫자(Check Digit 포함)로 생성하거나 해석할 수 있는 바코드이다.
* EAN-13은 13자리 숫자(Check Digit 포함)로 생성하거나 해석할 수 있는 바코드이다.
* EAN-13의 심볼로지에 대해 잘 설명되어 있는 페이지(영문) : http://www.barcodeisland.com/ean13.phtml
* EAN-13의 심볼로지에 대해 잘 설명되어 있는 페이지(영문) : http://www.barcodeisland.com/ean13.phtml
=== 바코드 구성 ===
* 1은 bar, 0은 space로 나타냄. X는 둘 중 하나
* Left(Start) Guard
** 101
* Left Characters
** 0XXXXX1 * 6 (space로 시작해서 bar로 끝남)
* Center Guard
** 01010
* Right Characters
** 1XXXXX0 * 6 (bar로 시작해서 space로 끝남)
* Right(End) Guard
** 101
* Start, End Guard는 바코드의 시작과 끝을 알리는 심볼이다.
* Center Guard는 Left Characters와 Right Characters를 구분하는 심볼이다.
* Left Characters와 Right Characters는 각각 6자리 숫자를 나타낸다.
* 나머지 한 자리는 Left Characters의 Encoding으로 부터 해석한다. (아래 Encoding에서 설명)
* Right Characters의 마지막 한 자리는 Check Digit 이다.
=== X-dimension ===
=== X-dimension ===
* 가장 두꺼운 Bar 혹은 Space의 폭 길이는 X-dimension의 4배이다.
* 가장 두꺼운 Bar 혹은 Space의 폭 길이는 X-dimension의 4배이다.
Line 27: Line 46:
* 각 12자리 숫자에 가중치를 곱하여 다 합하고, 합한 값을 10으로 나눈 나머지를 10에서 빼면 Check Digit가 나온다.
* 각 12자리 숫자에 가중치를 곱하여 다 합하고, 합한 값을 10으로 나눈 나머지를 10에서 빼면 Check Digit가 나온다.
** 가중치는 1, 3, 이 반복되는 패턴이다. 첫 번째 자리 숫자에 1을 곱하고, ... , 열두 번째 자리 숫자에 3을 곱한다.
** 가중치는 1, 3, 이 반복되는 패턴이다. 첫 번째 자리 숫자에 1을 곱하고, ... , 열두 번째 자리 숫자에 3을 곱한다.
= Android =
== Camera ==


# 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
=== Encoding ===
==== Character ====
* 0은 space, 1은 bar를 의미한다.
{| class="wikitable" style="width:100%;"
|-
| 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) 중에 겹치는 것이 없다.
* 모든 인코딩에 대해 0, 1을 영역으로 구분하면 그 영역은 항상 4개이다.
** 즉, 하나의 숫자를 나타내기 위해 2개의 Bar와 2개의 Space가 존재한다.
==== First Number ====
* 스페이스와 바에 의해 직접적으로 표현되는 숫자는 12개이다. 나머지 하나의 숫자는 Left Character의 인코딩을 해석해 얻어내야 한다. 예를 들어 8801067070256 이라는 EAN-13 바코드가 있을 때, 바코드에 직접적으로 얻어지는건 맨 앞의 자리 '8'이 빠진 801067070256 이고, 이는 Left Character에 해당하는 801067의 인코딩을 보고 알아내야 한다.
= Image Processing (with Google Android) =
== YUV Image Format ==
* Y(휘도 신호, 화면의 밝기), U(Cb, 휘도 신호와 청색 성분의 차), V(Cr, 휘도 신호와 적색 성분의 차)
=== Planar and Packed ===
* Packed는 Y, U, V의 데이터 영역이 분리되지 않은 포맷이다.
* Planar는 Y, U, V의 데이터 영역이 분리된 포맷이다.
=== NV21 (Planar) ===
* 안드로이드 공식 문서에 따르면 항상 지원되는 포맷이라고 한다.
* Planar Format으로, 프레임 크기만큼 Y 정보가 있고, 그 뒤에 프레임 크기의 반 만큼 U, V 정보가 존재한다.
=== YV12 ===
* 공식 문서에 따르면 API level 12(허니컴 3.1.x)부터 항상 지원되는 포맷이라고 한다.
== Threshold ==
* 영상을 두 가지 색으로만 표현하여, Object 인식을 용이하게 하기 위함
* 예를 들어 흑백 영상에 대해 수행할 때 임계값(어떤 밝기값)보다 낮으면 검정색, 높으면 흰색으로 변환하는 것.
=== Global Threshold ===
* 전체 영상에 대해 하나의 임계값으로 영상을 이진화하는 것.
=== Adaptive Threshold ===
* 영상 일부에 빛이 비춰지거나, 그림자가 드리울 경우 Global Threshold를 수행하면 기대한 결과를 얻기 힘들다.

Latest revision as of 00:16, 27 March 2026

프로젝트

참여

  • 정진경

목표

  • Image로 부터 ISBN 스캔라인 추출, 해석
  • 구글 안드로이드에서 동작

1D Barcode Image Recognition

Symbology

  • 1차원 바코드 인식을 하기 위해서는 해당 바코드의 심볼로지를 이해해야 한다.
  • 심볼로지란, 바코드를 표시하는 방법을 정한 규칙이다. 이 규칙이 존재해야 해당 바코드를 생성하거나 읽을 수 있다.

Bar and Space

  • Bar는 바코드의 검은 부분, Space는 흰 부분이며, 각각 Black, White라고 표현하기도 한다.

X-dimension

  • 가장 좁은 Bar 혹은 가장 좁은 Space(의 폭 길이)를 의미한다.

Quite Zone

  • 바코드를 보다 쉽게 인식하기 위해, 바코드 좌우로 X-dimension의 10배의 Space가 존재한다.
  • 실제 영상에서는 대개 존재하나. 캡쳐한 화면 상에 없을 수도 있고, 샘플링 과정에서 잡음이 끼기 때문에 바코드를 인식하기 위해 이 영역을 인식하는 것을 추천하지는 않는다.

Check Digit

  • 바코드를 잘못 인식하는 경우를 방지하기 위해. 실제 데이터로부터 생성되는 데이터가 있을 수 있다.

EAN-13 Symbology

  • EAN-13은 13자리 숫자(Check Digit 포함)로 생성하거나 해석할 수 있는 바코드이다.
  • EAN-13의 심볼로지에 대해 잘 설명되어 있는 페이지(영문) : http://www.barcodeisland.com/ean13.phtml

바코드 구성

  • 1은 bar, 0은 space로 나타냄. X는 둘 중 하나
  • Left(Start) Guard
    • 101
  • Left Characters
    • 0XXXXX1 * 6 (space로 시작해서 bar로 끝남)
  • Center Guard
    • 01010
  • Right Characters
    • 1XXXXX0 * 6 (bar로 시작해서 space로 끝남)
  • Right(End) Guard
    • 101
  • Start, End Guard는 바코드의 시작과 끝을 알리는 심볼이다.
  • Center Guard는 Left Characters와 Right Characters를 구분하는 심볼이다.
  • Left Characters와 Right Characters는 각각 6자리 숫자를 나타낸다.
  • 나머지 한 자리는 Left Characters의 Encoding으로 부터 해석한다. (아래 Encoding에서 설명)
  • Right Characters의 마지막 한 자리는 Check Digit 이다.

X-dimension

  • 가장 두꺼운 Bar 혹은 Space의 폭 길이는 X-dimension의 4배이다.

Check Digit

  • EAN-13의 Check Digit는 마지막 한 자리이며, 나머지 12자리로 부터 생성된다.
  • 각 12자리 숫자에 가중치를 곱하여 다 합하고, 합한 값을 10으로 나눈 나머지를 10에서 빼면 Check Digit가 나온다.
    • 가중치는 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

Encoding

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) 중에 겹치는 것이 없다.
  • 모든 인코딩에 대해 0, 1을 영역으로 구분하면 그 영역은 항상 4개이다.
    • 즉, 하나의 숫자를 나타내기 위해 2개의 Bar와 2개의 Space가 존재한다.

First Number

  • 스페이스와 바에 의해 직접적으로 표현되는 숫자는 12개이다. 나머지 하나의 숫자는 Left Character의 인코딩을 해석해 얻어내야 한다. 예를 들어 8801067070256 이라는 EAN-13 바코드가 있을 때, 바코드에 직접적으로 얻어지는건 맨 앞의 자리 '8'이 빠진 801067070256 이고, 이는 Left Character에 해당하는 801067의 인코딩을 보고 알아내야 한다.

Image Processing (with Google Android)

YUV Image Format

  • Y(휘도 신호, 화면의 밝기), U(Cb, 휘도 신호와 청색 성분의 차), V(Cr, 휘도 신호와 적색 성분의 차)

Planar and Packed

  • Packed는 Y, U, V의 데이터 영역이 분리되지 않은 포맷이다.
  • Planar는 Y, U, V의 데이터 영역이 분리된 포맷이다.

NV21 (Planar)

  • 안드로이드 공식 문서에 따르면 항상 지원되는 포맷이라고 한다.
  • Planar Format으로, 프레임 크기만큼 Y 정보가 있고, 그 뒤에 프레임 크기의 반 만큼 U, V 정보가 존재한다.

YV12

  • 공식 문서에 따르면 API level 12(허니컴 3.1.x)부터 항상 지원되는 포맷이라고 한다.

Threshold

  • 영상을 두 가지 색으로만 표현하여, Object 인식을 용이하게 하기 위함
  • 예를 들어 흑백 영상에 대해 수행할 때 임계값(어떤 밝기값)보다 낮으면 검정색, 높으면 흰색으로 변환하는 것.

Global Threshold

  • 전체 영상에 대해 하나의 임계값으로 영상을 이진화하는 것.

Adaptive Threshold

  • 영상 일부에 빛이 비춰지거나, 그림자가 드리울 경우 Global Threshold를 수행하면 기대한 결과를 얻기 힘들다.