안녕하세요. 토탈바코드솔루션 세리텍입니다.

 

지난 글에서는 바코드란 무엇인가에 대하여 역사적인 흐름을 통해서 살펴보았습니다.

이에 더하여 바코드의 구조에 관하여 한층 더 깊이 있게 다뤄 보고자 합니다.

모스부호란?

바코드 구조에 대해서 말씀드리기 전에 다시 돌아가서 모스부호에 관해서 이야기 하려 합니다.

바코드가 모스부호를 본떠 만들어 졌기 때문입니다. 모스부호는 짧은 발신 전류(·)와 긴 발신 전류(-)를 적절히 조합한 것입니다.

사실 모스부호에 대해서 자세하게 아시는 분은 많이 계시지는 않으리라 생각합니다. 실생활에선 사실 쓰이지 않고 더 좋은 신호체계의 발달로 점차 쓰임새가 사라지고 있기 때문입니다.

그럼에도 많은 영화 등에서 이를 선보였기 때문에 모스 부호 자체를 모르는 분은 없으시리라 생각합니다.

전 그중에서도 엑시트의 ‘따따따 따~따~따~ 따따따’가 제일 기억에 남습니다.

조난 영화의 주제에 걸맞게 ‘SOS’라는 단어를 한 글자씩 나눠 모스부호화 한 것으로, 이를 설명하는 영화인터뷰도 있습니다. 시간이 되신다면 한번 보시는 것도 좋은 방안이라 생각합니다.

“따따따~” ‘엑시트’ SOS 구조신호 – 모스 부호 (feat.임윤아 Yoona) – YouTube

사람은 전기 신호의 짧고 길음을 감전되기 전에는 알 수 없지만(…?) 익숙한 소리를 통해 단음과 장음으로 나눠 이를 대입시키는 것인데요.

알파벳 그리고 숫자 및 한글도 여기에 대입할 수 있습니다.

모스 부호 – 위키백과, 우리 모두의 백과사전 (wikipedia.org)

모스부호의 표이며 우리가 표현하고자 하는 글자를 여기에 대입시키면 모스부호로 소통할 수 있습니다. 이를 SOS에 대입하면 다음과 같습니다.

S ···

O —

S ···

바코드의 규칙성

모스부호가 함께 언급되었던 이유는 바코드도 짧거나 길거나 혹은 없거나(0) 있거나(1) 등을 통해서 알파벳 혹은 글자를 표현한다는 것을 확인하기 위함이었습니다.

0과 1을 바코드로 환산하면 0은 공백(스페이스) 그리고 1은 막대(바)로 환산이 될 것입니다.

이 것을 바코드 스캐너가 읽고 판독하면 그 결과를 우리는 눈으로 확인할 수 있습니다.

앞서 ‘따따따 따~따~따~ 따따따’ 로 알게 된 SOS를 최초의 바코드인 Code39 에 대입해보도록 하겠습니다.

File:Free 3 of 9 (Code 39 barcode).svg – Wikipedia

다르긴 다르지만, 확실한 차이점을 알기가 쉽지 않습니다.

그래서 이걸 알아보기 쉽도록 조금 더 비율을 조정해보도록 하겠습니다.

S

O

S

이렇게 보니 한층 더 구별하기가 수월해진 것 같습니다.

이제 공백과 막대의 개수를 비교하여 하나씩 세어 본다면, 한 개의 글자마다 각 9개가 반복되는 것을 확인하실 수 있습니다.

몇 가지 더 규칙을 찾아보겠습니다.

  • 1개의 문자를 나타내는 각 9개 중 5개는 막대로, 4개는 공백으로 구성되어 있습니다.
  • 또한 넓은 면적과 좁은 면적으로 나뉘어 있는데, 이 중 넓은 면적의 개수는 총 3개입니다.
  • 그리고 넓은 면적의 개수 중 2개는 막대로, 1개는 공백으로 이루어져 있다는 사실을 알 수 있습니다.

이를 기초로 모스부호의 장음을 넓은 면적으로, 단음을 좁은 면적으로 표현해보겠습니다. 그렇다면 넓은 면적은 이진값 1로 변환됩니다.

이제 의미를 다시 한번 생각해본다면, 각 문자를 나타내는 바코드는 9개로 이루어져 있으며 그 중 3개는 반드시 넓은 면적, 그러니까 이진값 1을 가진다는 의미로 치환됩니다.

Code 39의 별명은 Alpha39, Code 3 of 9, Code 3/9, Type 39, USS Code 39, or USD-3 등이 있습니다.

Code 3 of 9의 의미는 무엇일까요? 그동안 규칙을 정리해보자면 Code 39는 각 글자를 나타내는 9개의 바코드 중 3개는 반드시 ‘1’(넓은 면적)을 가져야 하는 규칙성을 설명한다고 볼 수 있습니다.

다만, 최초 어원에 대해서 위키디피아에서는 코드가 고안되었을 당시 구분기호 ‘*’ 을 제외하고 표현할 수 있는 숫자가 39였기 때문에 이를 Code 39 (Alpha 39, Type 39)로 명명되었다고 설명하고 있습니다. (같은 의미로 Code 128 도 128개의 구현 가능 개수를 의미하고 있습니다.)

또한, 제가 넓은 면적의 개수 중 2개는 막대로, 1개는 공백으로 이루어져 있다고 규칙성을 설명해 드렸었는데, 추후 4개의 특수기호($, /, +, %) 추가하면서 3개의 넓은 면적의 공백으로만 이뤄진 바코드도 존재하게 되었습니다.

사족이지만, 만약 엑셀 등에서 Code39를 표현하시게 된다면 구분 기호인 ‘*’를 붙여 바코드의 시작과 끝을 나타내 주셔야 바코드 스캐너 인식 시 문제가 없습니다.

이제 바코드의 규칙성에 대해서 어느 정도 설명이 끝난 것 같습니다.

물론 Code39만 설명해 드렸지만, 최초의 영문자와 숫자를 함께 다루는 바코드이며 현재도 활발하게 사용되는 바코드의 한 종류이기 때문에 이를 이해하시는 데 도움이 되리라 생각합니다.

이제 어떤 식으로 기계가 이를 인식하는지에 대해서 확인해보도록 하겠습니다.

바코드 스캔 시 주의해야 할 점이 무엇이 있을까요?

대부분 아시고 계시는 사실이시겠지만, 그림과 같이 스캐너의 빛이 바코드 전체를 관통해야 하며 이때 초점이 흐려지면 안 된다는 사실입니다.

물론 스마트폰 등의 카메라를 이용하여 바코드 인식 시에는 큰 문제가 되지 않을 수 있으나 마찬가지로 초점과 그리고 바코드 전체를 스캔 영역에 일치시켜야 한다는 사실에는 변함이 없습니다.

왜 우리는 이런 식으로 인식을 시켜야 할까요?

이는 빛이 바코드 인식에 결정적인 역할을 하기 때문입니다. 바코드 스캐너 내부에는 광원 모듈이 있습니다.

바코드를 인식 시키기 위해 스캐너를 작동시키면 광원에서는 빛을 내뿜게 됩니다. 바코드의 막대는 검은색으로, 공백은 흰색으로 이루어져 있습니다. 빛을 흡수하는 검은색과 이와 반대의 성질은 가진 흰색은 각기 다른 반사광을 가지게 됩니다.

이 세기의 높고 낮음을 인식하여 증폭하고 기준으로 나눠 차례로 2진법의 숫자로 변환하고, 오류를 검증하고 오류가 검츨되지 않았다면, 그를 다시 10진법의 숫자로 변환하는 등의 디코딩 과정을 거쳐서 우리는 스캔 결과 값을 확인할 수 있습니다.

바코드의 구조

그런데 이 부분만 주의하면 되는 것일까요?

본문으로 들어와서 바코드의 구조에 관해서 확인해보도록 하겠습니다.

바코드는 크게 2개의 영역으로 나뉩니다.

  1. 콰이어트 존(Quiet Zone)
  2. 바코드 심벌(Barcode Symbol)

콰이어트 존은 스캐너가 인식하기 위한 최소한의 여백 부분으로 이 여백이 확보되지 않으면 스캐너가 바코드를 인식할 수 없습니다. 보통 가장 작은 면적의 막대를 기준으로 10배 이상을 산정합니다.  이 수치 이하로도 사용은 가능할 수 있지만, 정확도가 떨어질 수 있어 추천해 드리지 않습니다.

바코드 심벌은 바코드의 데이터 영역을 뜻합니다. 여기에서도 영역이 나뉩니다.

  1. 시작문자(Start Character) 및 끝문자(Stop Character)
  2. 데이터(Data)
  3. 검증숫자(Check Digit) 혹은 검사합(Check Sum)

시작문자와 끝문자는 시작과 끝을 알려주는 부분인데, Code 39에서는 ‘*’ 이며 다른 바코드는 문자열이거나 혹은 막대 모양으로 이를 나타내고 있습니다.

Code 128 에서는 128A, 128B, 128C으로 나눠지며 다음의 경우로 이를 설정 가능합니다.

  1. Code Set A
    • 숫자(0-9), 대문자(A-Z), 제어코드, 특수문자 등을 조합.
    • 코드 : Ë / Ð / ø
  2. Code Set B
    • 숫자(0-9), 대문자(A-Z), 소문자(a-z), 특수문자 등을 조합.
    • 코드 : Ì / Ñ / ù
  3. Code Set C
    • 숫자(0-99)및 특수문자 조합.
    • 코드 : Í / Ò / ú

데이터는 바코드를 통해 전달하고자 하는 내용을 뜻합니다. 정확한 데이터를 전달하기 위해 콰이어트 존과 시작문자와 끝문자, 그리고 검증숫자가 존재합니다.

검증숫자는 스캐너가 바코드를 읽었을 때 이 값이 정확한지를 확인하기 위한 값입니다. 검사합(Checksum)이라고도 하는데, 검사 합은 통신에서 비트 변형의 가능성을 최소화하기 위해 중복 검사의 한 형태입니다. 가장 단순하게는 자릿수의 합으로 계산하여 데이터를 검증할 수 있습니다.

일반적으로 검사합 부분이 없는 Code39 와 비슷한 Code128을 예를 들어보겠습니다. Code128 은 Code 39보다 더 많은 정보를 저장할 수 있는 바코드 식별자로, 문자, 숫자, 그리고 특수문자를 인코딩할 수 있습니다. 이러한 이유로 Code 128은 공식 바코드 식별자로 사용되고 있습니다.

검사합 과정을 이해하면서 더불어 바코드 인코딩 과정을 살펴보도록 하겠습니다.

먼저 검사합 과정을 수행합니다.

  1. “SERITEC” 문자열을 인코딩 합니다. Code 128 은 알파벳과 숫자를 인코딩할 수 있는 코드 시스템 중 하나며, 각 문자를 인코딩할 때 고유의 코드를 할당합니다. (코드셋은 B를 기준으로 하였습니다. 코드셋은 A, B, C 등으로 나뉘어 있는데 각기 인코딩 가능한 범위가 다릅니다.)
    1. “SERITEC” 문자열을 예로 들어보면, 인코딩된 각 문자의 숫자 값은 다음과 같습니다. (대입 되는 숫자들은 각기 표로 확인 가능합니다. 더 자세한 사항은 이 위키디피아 페이지를 참조하세요.)
      • S: 83
      • E: 69
      • R: 82
      • I: 73
      • T: 84
      • E: 69
      • C: 67
  2. 인코딩된 “SERITEC”문자열에 검사합을 계산합니다. 검사합은 인코딩된 문자열의 각 문자에 고유한 숫자를 자릿수 별로 곱을 한 값들을 모두 더하고, 시작 코드셋 값으로 나눈 나머지 값이 Check Digit이 됩니다. 구한 값으로 Check Digit을 추가하여 문자열을 변환합니다.
    • 앞서 예를 들은 “SERITEC” 문자열의 값들을 기준으로 하겠습니다.
    • 시작 코드셋이 B이기 때문에, 먼저 Start B (Start A : 103, Start B : 104, Start C : 105)의 값들을 가지고 시작합니다.
    • 모든 값을 더합니다.
      • 104 + (83×1) + (69×2) + (82×3) + (73×4) + (84×5) + (69×6) + (67×7) = 2166
    • 이 값을 시작 코드셋 값인 104로 나눈 후 나머지 값을 취합니다.
      • 2166 mod 104 = 86
      • 86은 Code 128 고윳값 중 Code B 값에선 ‘v’ 를 뜻합니다. 만약 나머지가 32보다 작으면 32를 더해 변환해주면 됩니다.
    • 이제 문자열 ‘SERITEC’은 계산된 값에 의해서 다른 값으로 변환 되게 됩니다.
      • ‘SERITEC’ -> ‘SERITECv’

검사합 과정이 끝났으므로, 변환된 문자열을 Start Code 와 Stop Code 로 감싸주면 이제 끝이 납니다.

아까 Code Set B 의 코드값은 ‘Ì ‘ 이므로 이를 감싸주어 변환합니다.

  • ‘SERITEC'(최초문자) -> ‘SERITECv'(검사합) -> ‘ÌSERITECvÌ'(바코드문자)

이 값들은 이제 Code 128의 바로 변환되어 각기의 스캐너에서 디코딩하는 과정을 거치게 되어, 최종적으로 ‘SERITEC’이라는 글자를 스캔하게 됩니다.

오류 검출 방법은 각 바코드 마다 그리고 종류에 따라 상이합니다. 그러므로 이 과정이 모두 다 통용되지 않습니다. 또한, 바코드 생성시 에는 검사합과정 뿐만 아니라 바코드의 모양도 고려해야 인식에 문제가 없습니다. 이는 막대와 최소한의 길이와 높이 그리고 비율이 정해져 있기 때문인데요. 이유는 최소한의 부분을 보장하지 않거나 비율이 손상되었을 경우 이를 정상적으로 인식할 수 없기 때문입니다.

이외에도 바코드를 인식하는데 사용되는 알고리즘도 중요합니다. 이 알고리즘은 바코드를 읽는데 사용되는 스캐너에 따라 다를 수 있습니다. 대표적인 알고리즘으로는 라인알고리즘, 픽셀알고리즘, 그리고 글자알고리즘이 있습니다.

이 부분은 추후 시간이 되면 알고리즘에 관하여 다뤄보도록 하겠습니다.

 

 

부족한 글을 읽어주셔서 정말 고생하셨습니다. 조금이라도 바코드의 구조 및 바코드 변환 과정에 대하여 이 해하시는 시간이되셨기를 바랍니다

이 글은 잘못된 지식 혹은 오류 그리고 이전 정보를 담고 있을 수 있습니다. 언제든지 문제가 있다면 댓글이나 이메일로 알려주시면 최대한 빨리 수정하도록 하겠습니다. 감사합니다.

 

출처  : Code 128 – Wikipedia

Subscribe
Notify of
guest
0 Comments
인라인 답변
모든 댓글보기