캡스톤을 진행하며 QRCode에 대해 공부하고 기록하기 위한 글 입니다.
QR코드 종류
Model 1과 Model 2
- 모델1이 가장 처음 만들어진 QR코드
- 모델2는 개량된 버전의 QR코드로, 현재 대부분의 QR코드에 해당.
- 두 모델을 저장 용량과 오류 정정 수준에서 차이가 있음
- 모델1은 최대 1167개의 숫자, 707개의 영숫자, 299개의 한자 표현 가능
- 모델2는 최대 7089개의 숫자, 4296개의 영숫자, 2953개의 바이너리 바이트 및 1817개의 간지 문자 표현 가능
Micro QR코드
- 기존 QR코드의 작은 버전
- 최대 35자리의 숫자까지 표현 가능.
rMQR
- 직사각형으로 생성이 가능한 QR코드
- 공간 절약을 위해 사용
- 이론상 약 4만자리 숫자까지 표현 가능
SQRC
- 모양은 일반 QR코드와 동일하지만, 특정 QR코드 스캐너만 정보를 읽을 수 있도록 구성하는 QR코드
Frame QR코드
- QR코드 중앙에 자유롭게 이미지를 배치할 수 있는 캔버스 영역이 존재하는 QR코드
QR코드 구조
QR코드 구조는 현재 가장 보편적으로 사용되는 Model2가 기준입니다.
구조
Finder Pattern
- 좌측 상단/하단, 우측 상단에 존재하는 구조
- 3x3, 7x7의 검정 모듈과 5x5의 흰 모듈로 구성됨
- 가장 바깥쪽에 흰 모듈의 분리자가 존재
- 이 패턴을 이용해 QR코드가 정방향이 아니더라도 인식이 가능함
Timing Pattern
- 파인더 패턴과 이어저 검정색/흰색 모듈이 번갈아 가며 나오는 구조
- QR코드의 행, 열 갯수와 모듈의 크기를 결정하는 역할
Format Information
- QR코드를 해석할때 필요한 정보를 담고있는 부분
- ECC Level, Masking pattern에 대한 정보를 갖고있음
Alignment Pattern
- QR코드가 왜곡되었을 때 보정하기 위해 사용되는 패턴
- 모델2 QR코드에서만 사용됨
- 버전에 따라 여러 위치에 배치됨
Version Information
- QR코드의 버전 정보를 담고있는 부분.
- 버전정보는 버전 7 이상부터 생성됨.
Data Area
- 실제 데이터가 인코딩 되어 저장된 영역
- 데이터는 8비트 단위의 코드워드로 변환되고, 마스킹 패턴을 사용하여 읽기 쉽도록 조정되어 저장됨.
Error Correction Code
- 데이터 영역에 포함된 오류 수정 코드워드.
- Reed-Solomon 오류 수정 알고리즘을 이용해 생성됨.
QR코드 생성 과정
QR코드 생성 과정은 현재 가장 보편적으로 사용되는 Model2가 기준입니다.
1. 데이터 분석 및 인코딩
데이터 분석
- 입력된 데이터와 ECC LEVEL에 맞는 모드 결정
- 모든 데이터를 담을 수 있는 적당한 크기의 버전 결정
ECC LEVEL?
출처: KS X ISO/IEC18004 문서 29페이지
- ECC 레벨은 L(7%), M(15%), Q(25%), H(30%)가 존재
- 각 레벨은 오차 정정률로 H는 30%가 손상되도 복구가 가능한 레벨
- 복원 방식은 Reed-Solomon 에러 정정 방식
- 레벨이 높을수록 ECC에 사용되는 모듈 수는 늘고, 데이터를 표현하는 모듈 수는 줄어듦
- 표현 할 데이터의 크기와 ECC Level에 따라 버전을 결정
모드?
출처: KS X ISO/IEC18004 문서 20페이지
- 입력된 데이터를 인코딩 하는 방식
- 모드에 따라 데이터를 비트로 변환하는 방법이 다름
인코딩
- 모드에 맞는 방식으로 데이터를 이진수로 변경
- 모드 비트 + 데이터 길이 비트 + 데이터 인코딩 비트 + 종단자 비트 + 패딩 비트로 구성
- 종단자와 패딩 비트 인코딩 후 남은 공간에 추가
출처: KS X ISO/IEC18004 문서 20페이지
- 데이터 길이 비트는 모드와 버전에 따라 정해진 길이의 비트로 변환
- 자세한 인코딩 방식은 KS X ISO/IEC18004 문서 8.4장이나 구현 코드 참고
2. 오류 수정 코드워드 생성
출처: KS X ISO/IEC18004 문서 35페이지
- Reed-Solomon 알고리즘으로 정해진 코드워드 개수에 따라 오류 보정 비트 생성
- 규칙에 맞게 8비트씩 잘라서 코드워드 생성
- 자세한 코드워드 생성 방식은 KS X ISO/IEC18004 문서 8.6장이나 구현 코드 참고
3. 기능 패턴, 버전/포맷 정보 추가
기능 패턴 추가
- 지정된 위치에 파인더 패턴, 정렬 패턴, 타이밍 패턴 추가
버전 정보 추가
- QR코드의 버전이 7 이상일때만 추가
- 6비트의 이진수로 표현된 버전 수를 bch(18, 6) 알고리즘으로 오류 보정 비트 추가
- 지정된 위치에 버전 정보 추가
포맷 정보 추가
- ECC LEVEL과 마스크 정보를 정의된 이진수로 바꾸고, bch(15, 5) 알고리즘으로 오류 보정 비트 추가
- 오류 보정까지 추가한 비트를 101010000010010로 XOR 연산해서 최종 포맷 비트 생성
- 지정된 위치에 포맷 정보 추가
- 자세한 포맷 정보 생성 방식은 KS X ISO/IEC18004 문서 8.6장이나 구현 코드/주석 참고
4. 코드워드 배치
- 규칙에 맞게 나머지 공간에 코드워드 배치
- 자세한 코드워드 배치 방식은 KS X ISO/IEC18004 문서 8.9장이나 구현 코드/주석 참고
5. 마스킹 및 평가
- 8 종류의 마스크를 기준에 따라 마스크 적용
- 각 마스크를 적용한 qr코드별로 페널티 점수를 산출 후, 가장 패널티 점수가 낮은 마스크 선택 후 적용
- 자세한 마스크 종류와 마스크 평가 방식은 KS X ISO/IEC18004 문서 8.8장이나 구현 코드/주석 참고