[[TableOfContents]] = 프로젝트 = == 참여 == * 정진경 == 목표 == * 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 === 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 === ==== First Number ==== * 스페이스와 바에 의해 직접적으로 표현되는 숫자는 12개이다. 나머지 하나의 숫자는 Left Character의 인코딩을 해석해 얻어내야 한다. 예를 들어 8801067070256 이라는 EAN-13 바코드가 있을 때, 바코드에 직접적으로 얻어지는건 맨 앞의 자리 '8'이 빠진 801067070256 이고, 이는 Left Character에 해당하는 801067의 인코딩을 보고 알아내야 한다. ==== 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|| = 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)부터 항상 지원되는 포맷이라고 한다. == Camera ==