예술적 QR 코드를 너무 가까이서 스캔하면 실패할 수 있는 이유
누구나 QR 코드가 너무 작거나, 너무 멀거나, 너무 어두워서 실패한다고 생각합니다. 사진 QR 코드에는 반대의 실패도 있습니다. 멀리서는 완벽하게 읽히다가 휴대폰을 바짝 갖다 대면 실패할 수 있습니다. 이를 발견한 측정의 수치와 함께 그 이유를 설명합니다.
스캐너가 무엇이 어두운지 결정하는 방법
리더가 모듈을 찾기 전에 사진을 흑백으로 바꿔야 합니다. 전역 임계값은 실제 조명을 견디지 못합니다. 한쪽 모서리를 가로지르는 그림자가 코드의 절반을 검게 만들 것이기 때문입니다. 그래서 대부분의 디코더는 국소적으로 임계값 처리를 합니다. 여전히 많은 바코드 스캐닝의 뿌리인 오픈소스 라이브러리 ZXing은 이미지를 8×8 픽셀 블록으로 나누고, 각 블록의 평균을 계산하고, 이웃 블록과 평활화한 뒤, 이를 그 64픽셀의 임계값으로 사용합니다. 블록의 임계값보다 어두운 픽셀은 어둡고, 나머지는 밝습니다. 일반 QR 코드에서는 이것이 거의 공짜입니다. 블록 크기가 무엇이든 모듈은 단색이므로 블록의 평균은 어두움에 가깝거나 밝음에 가깝거나, 블록이 경계에 걸칠 때는 둘 사이에 놓이며, 어느 경우든 결정은 쉽습니다. 이 방식은 견고하고 저렴하며 널리 복제되었고, 바로 그래서 중요합니다. 인쇄된 코드가 현장에서 만나는 디코더는 이런 식으로 임계값 처리를 하는 것일 가능성이 충분히 있습니다.
모듈이 디더로 이루어지면 무엇이 달라지는가
디더링 코드에서 모듈은 단색이 아닙니다. 작은 강제 코어와 그것을 둘러싼 사진을 담은 픽셀입니다. 평균은 맞지만 질감은 균일하지 않습니다. 이제 스캔 거리를 유일하게 의미 있는 단위, 즉 모듈당 카메라 픽셀 수로 생각해 봅시다. 모듈이 5~8픽셀에 걸치도록 휴대폰을 충분히 멀리 두면 8×8 블록은 모듈 경계에 걸칩니다. 국소 평균은 대략 "이 모듈과 그 이웃들"이 되고, 임계값은 어두움과 밝음 사이에 놓이며, 코드는 읽힙니다. 모듈이 20픽셀을 덮도록 휴대폰을 가까이 가져가면 8×8 블록은 이제 단일 모듈 안에 완전히 들어갑니다. 블록의 평균은 그 모듈 자체의 국소 질감입니다. 임계값은 모듈이 아니라 디더를 따라가고, 디코더는 코드가 아니라 얼룩을 복원합니다. 인쇄물은 아무것도 바뀌지 않았습니다. 각 모듈이 덮는 센서 픽셀 수, 그리고 그에 따른 디코더의 블록과 모듈의 관계만 바뀌었습니다. 그래서 이 실패는 크기나 조명이 아니라 거리의 속성입니다.
수치
SWAPQR의 사진 모드를 만들면서 측정했습니다. 세 가지 페이로드 길이, 여섯 가지 이미지 유형, 양쪽 색 극성, 세 가지 균형 설정, 일곱 가지 시뮬레이션된 스캔 거리를 두 개의 독립된 라이브러리로 디코딩했습니다. 경계는 깨끗합니다. 각 모듈의 약 20%를 강제한 사진 위주 설정과 약 44%를 강제한 설정에서 코드는 모듈당 5~8픽셀에서 읽혔고, ZXing 계열 리더는 모듈당 10~28픽셀의 근접 스캔에서 불안정해졌습니다. 약 60% 이상을 강제하면 모든 거리에서 읽혔습니다. 모듈 면적의 대략 절반 이상이 단색으로 강제되면 모듈 안에 들어가는 어떤 8×8 블록도 대부분 단색 픽셀에 놓이고, 효과는 사라집니다. 그 아래에서는 사라지지 않습니다. 그리고 계조 편향을 아무리 조정해도 고쳐지지 않습니다. 국소 임계값은 어차피 국소 평균을 빼기 때문입니다. 모듈을 어떤 계조로 기울이든, 그 안에 완전히 들어간 블록은 그 기울기를 기준선으로 측정하고 임계값 처리로 지워 버립니다. 유일하게 작동하는 지렛대는 모듈에서 단색인 비율이며, 균형 조절이 존재하는 이유가 그것입니다.
새로운 디코더, 그리고 그것으로 끝이 아닌 이유
새로운 디코더는 이 문제에 더 강합니다. 같은 측정에서 다른 이진화 전략을 쓰는 jsQR은 모든 구성을 모든 거리에서 읽었고, 현재 휴대폰에 내장된 스캐너는 더욱 강력합니다. 그러나 "대부분의 휴대폰은 해낼 것"은 "모든 리더가 해낼 것"과 같지 않으며, 인쇄된 코드는 우연히 자신을 향한 어떤 리더든 만납니다. 오래된 휴대폰, POS 스캐너, 키오스크, ZXing 파생 라이브러리를 번들한 앱 등입니다. 따라서 사진 위주 균형은 그 절충에 대해 정직합니다. 스튜디오는 최신 휴대폰 스캐너는 어떤 거리에서도 읽지만 오래되고 단순한 리더는 극단적인 근접 스캔에서 어려움을 겪을 수 있다고 안내합니다. 균형 위 어디에 놓을지의 결정은 누가 얼마나 먼 거리에서 코드를 스캔할지에 달려 있습니다. 휴대폰이 자연스럽게 어디에 놓이게 되는지에도 달려 있습니다. 포스터에 대고 팔 길이만큼 휴대폰을 드는 사람은 없지만, 명함에는 누구나 바짝 가져다 대며, 그것이 사진 위주 코드와 단순한 리더가 만날 수 있는 경우입니다.
어떻게 해야 하는가
코드가 사람들이 보통 거리에서 스캔하는 곳, 즉 포스터, 테이블 텐트, 선반 라벨로 간다면 사진 위주 설정으로 충분합니다. 그 거리에서 모듈은 카메라 픽셀 몇 개를 덮고 블록은 마땅히 그래야 하듯 경계에 걸칩니다. 사람들이 휴대폰을 갖다 댈 곳, 즉 작은 스티커, 명함, 화면으로 간다면 균형을 코드 쪽으로 옮겨 각 모듈의 절반 이상이 단색이 되게 하고, 모든 종류의 리더에서 근접 효과가 사라지게 하십시오. 어느 쪽이든 하나를 인쇄해 휴대폰으로 스캔하십시오. 모니터 위의 스크린샷이 아니라 실제 인쇄물을, 실제 크기로, 사람들이 실제로 쓸 거리에서, 가능하면 둘 이상의 휴대폰으로 하십시오. SWAPQR은 이 경고를 작은 글씨가 아니라 스튜디오 자체에 표시합니다. 현장에서 실패하는 코드는 작동하는 평범한 코드보다 나쁘고, 대량 인쇄 전에 잡아내면 해결책이 재인쇄가 아니라 슬라이더 하나이기 때문입니다.
| 각 모듈의 강제 비율 | 원거리 / 보통 (모듈당 5~8 px) | 근접 (모듈당 10~28 px) |
|---|---|---|
| 약 20% (사진 위주) | 읽힘 | ZXing 계열 리더 불안정 |
| 약 44% (중간) | 읽힘 | ZXing 계열 리더 불안정 |
| 약 60% 이상 (코드 위주) | 읽힘 | 읽힘 |
| 모든 설정, jsQR 계열 및 현재 휴대폰 스캐너 | 읽힘 | 같은 측정에서 읽힘 |
자주 묻는 질문
제 휴대폰은 어떤 거리에서도 사진 코드를 읽습니다. 왜 경고가 있나요?
현재 휴대폰 스캐너는 더 강력한 이진화를 사용하며 저희 측정에서 모든 구성을 읽었습니다. 경고는 8×8 블록으로 임계값 처리를 하는 오래되거나 단순한 리더에 관한 것이며, 인쇄된 코드는 여전히 그런 리더를 만날 수 있습니다.
휴대폰을 멀리 하면 왜 해결되나요?
멀어질수록 각 모듈이 덮는 카메라 픽셀이 줄어, 디코더의 8×8 블록이 여러 모듈에 걸치고 그 평균이 어두움과 밝음 사이에 놓입니다. 가까이서는 블록이 한 모듈 안에 들어가 대신 디더 질감을 따라갑니다.
계조 편향을 높이면 근접 스캔에 도움이 되나요?
아니요. 국소 임계값은 국소 평균을 빼므로 모듈 안의 균일한 기울기는 임계값 처리로 지워집니다. 결과를 바꾸는 것은 모듈에서 단색으로 강제되는 비율뿐입니다.
명함에 안전한 균형은 무엇인가요?
코드 쪽으로 옮겨 각 모듈의 약 절반 이상이 단색이 되게 하십시오. 그 지점에서 저희 측정상 ZXing 계열 리더가 모든 거리에서 읽었고, 그림은 여전히 보이되 조금 희미해질 뿐입니다.
사각형은 한 번만 인쇄하세요. 목적지는 나중에 정하면 됩니다. SWAPQR은 정적 QR 코드를 무료로 만들어 줍니다. 모든 스타일 옵션이 포함되며 계정도, 워터마크도 없습니다. 유료 플랜을 사용하면 코드가 동적으로 바뀝니다. 인쇄된 사각형은 그대로 두고 목적지를 변경할 수 있으며, 일별·기기별로 얼마나 자주 스캔되었는지 확인할 수 있습니다.
브라우저에서 QR 코드 만들기