전체 글 18

[LensCal] 아직 끝나지 않은 회고 — 렌즈 캘리브레이션 작업 중간 정리

시리즈 7/7.시리즈 마지막 편입니다. 보통 마지막 편은 "이렇게 해서 성공적으로 마무리했습니다" 라고 쓰는 게 자연스러운데, 이번 시리즈는 그 모양으로 끝낼 수가 없네요. 솔직하게 말해서 작업은 여전히 진행 중이고, 제일 큰 결정 (검출기 선택) 은 아직 내려지지 않았습니다.그래서 이번 편은 "완료 회고" 가 아니라 "중간 회고" 입니다. 지금까지 한 일을 정리하고, 아직 정해지지 않은 것들을 정해지지 않은 상태 그대로 적어두려 해요. 반년쯤 뒤에 이 글을 다시 읽었을 때 "아 그때 이런 고민을 했었지" 하고 스스로 피드백할 자료가 될 거라 생각합니다.지금까지 한 일 — 완료된 것들시리즈를 시작할 때만 해도 "OpenCV 단독 체커보드 검출기가 실장비에서 불안정하다" 는 고민에서 출발했었습니다. 지금은..

Vision & Inspection 2026.04.13

[LensCal] 숫자보다 히트맵 — 현장에서 실제로 쓰이는 대시보드 만들기

시리즈 6/7. 12 개 지표를 뽑아놨는데 운용자가 안 본다면 소용이 없습니다. "1 초 안에 판정 가능한" UI 를 만들기 위해 어떤 고민을 했는지에 대한 기록입니다.1. PropertyGrid 만으로는 왜 부족한가지표 12 개를 전부 PropertyGrid 에 쏟아부으면 이렇게 됩니다.▸ 검출 결과 검출 코너 수 96 회전 각도 1.23°▸ 품질 지표 재투영 오차 RMS 0.15 px 재투영 오차 Max 0.42 px 직교성 평균 0.08° 직교성 최대 0.22° 중심-주변 편차 (최대) 0.12% 콘트라스트 최소 ..

Vision & Inspection 2026.04.13

[LensCal] 텔레센트릭 렌즈에도 왜곡 측정이 필요한 이유 — 광학 품질 3종 세트

시리즈 5/7. 같은 체커보드 이미지에서 렌즈의 광학적 품질까지 뽑아냅니다. 그런데 첫 번째 질문은 이겁니다. "텔레센트릭 렌즈는 왜곡이 0 이라고 하는데, 굳이 측정해야 할까요?"1. 기하 지표와 광학 지표의 차이앞 편에서 다룬 기하학적 지표 (재투영 오차, 직교성) 는 "격자가 반듯한가" 를 봅니다. 그런데 이 지표들로는 답하지 못하는 질문이 여전히 있습니다.이 렌즈의 왜곡 특성이 스펙 범위 안에 들어오는가?이미지 전체에 조명이 균일하게 들어왔는가?포커스가 영역별로 균일하게 맞았는가?이건 격자의 기하학적 반듯함이 아니라, 렌즈 자체의 물리적/광학적 특성입니다. 이번 편에서 다룰 세 지표가 정확히 이 영역을 담당합니다.방사 왜곡 계수 (Radial Distortion k1, k2)영역별 콘트라스트 (M..

Vision & Inspection 2026.04.13

[LensCal] 재투영 오차와 직교성 — 격자는 얼마나 반듯한가

시리즈 4/7.3편까지 해서 기본 지표 5개가 쌓였습니다. 해상도, 코너 간 거리 분포, 등방성, 9영역 균일도, 중심-주변 편차. 운용 현장에서 대부분의 판정은 이 기본 지표들로 해결됩니다.그런데 한 가지 질문이 계속 남아요. "평균 스케일은 괜찮아 보이는데, 격자 자체가 미묘하게 휘어 있지는 않은가?" 평균이 가려버리는 케이스가 있거든요. 코너 100개 중 5개만 조금씩 엇나가 있으면, 평균은 여전히 멀쩡해 보입니다. 이 5개를 잡으려면 개별 코너의 잔차를 봐야 하고, 그게 재투영 오차 입니다.이번 편의 진짜 핵심은 마지막의 교차 진단표입니다. 재투영 오차 혼자서도 유용하지만, 직교성을 같이 봤을 때 진단이 결정적으로 달라지는 순간이 있어요. 그 이야기가 이번 편 전체의 결론이 될 것 같네요.재투영 ..

Vision & Inspection 2026.04.13

[LensCal] 체커보드에서 뽑아내는 기본 지표 5가지

시리즈 3/7.2편까지 해서 정렬된 그리드 (m_vGridMap) 가 준비됐습니다. 이제 여기 위에 분석 함수들을 얹기 시작할 텐데, 가장 먼저 올리는 건 화려한 지표가 아니라 기본 중의 기본입니다. 해상도, 등방성, 9영역 균일도, 중심-주변 편차. 이름만 들으면 심심해 보이지만, 뒤에 올라갈 모든 고급 지표는 결국 이 바닥 위에 서 있습니다.기본이 흔들리면 고급 지표가 아무리 정교해도 숫자에 의미가 없어져요. 재투영 오차 0.1 px 라는 값도, 애초에 스케일 계산이 편향되어 있으면 그 0.1 px 는 그냥 위장된 거짓말입니다. 그래서 이번 편은 "당연해 보이지만 당연하지 않은" 것들에 대한 얘기입니다.해상도 — 정의는 단순한데가장 핵심이 되는 값이고, 수식은 한 줄이면 끝납니다.해상도 = 타일 실제..

Vision & Inspection 2026.04.13

[LensCal] 검출기를 갈아끼울 수 있게 만든 설계

시리즈 2/7.1편에서 "Cognex 정식 검출기와 자체 OpenCV 검출기를 같이 두고 비교 중" 이라는 얘기를 했습니다. 이게 가능한 건 두 검출기가 완전히 똑같은 결과 구조체를 채워서 돌려주도록 맞춰놨기 때문이에요. 이번 편은 그 한 조각에 대한 이야기입니다.얼핏 "인터페이스 통일" 이라는 말로 한 줄 정리될 것 같은데, 실제로 해보면 몇 가지 미묘한 선택이 끼어 있어요. 특히 그리드 인덱스 부여를 누가 책임질 것인가 라는 부분이 이번 구조의 핵심이었습니다.출발점 — 엔진이 알아야 하는 것과 몰라도 되는 것캘리브레이션 엔진 (CLensCalibEngine) 이 하는 일은 대략 이렇습니다.검출된 코너 좌표들을 m_vGridMap[r][c] 라는 그리드 인덱스 맵으로 정리그 위에 CalcScaleFac..

Vision & Inspection 2026.04.13

[LensCal] Cognex 정식 검출기 vs 자체 OpenCV 검출기, 아직 고민 중입니다

시리즈 1/7.솔직하게 먼저 말씀드리면, 이 글을 쓰는 지금도 저는 결정을 못 했습니다. Cognex VisionPro 의 정식 체커보드 검출기를 계속 쓸지, 아니면 최근에 직접 짠 OpenCV 기반 검출기로 갈아탈지. 양쪽을 같은 엔진에 번갈아 꽂아보며 며칠째 고민 중이에요.원래는 "리팩토링 결정 완료" 같은 깔끔한 결론으로 글을 쓰려고 했는데, 쓰다 보니 진짜 상태랑 안 맞아서 접었습니다. 대신 "지금 이런 상황에서 이런 것들을 저울질하고 있습니다" 라는 중간보고 형태로 남기려 합니다. 결정이 나면 후속 포스트로 돌아올 테니, 이번 편은 결정을 내리기 직전까지의 생각 정리라고 봐주시면 좋겠습니다.배경 — 원래 상황장비에 들어가는 렌즈 캘리브레이션 모듈은 원래 HWTester 에서 이식한 CCalibr..

Vision & Inspection 2026.04.13

[LensCal] 렌즈 캘리브레이션 엔진을 다시 짜면서 — 시리즈 소개

머신비전 장비에서 "이 렌즈가 정상이냐" 에 답하는 도구, 바로 렌즈 캘리브레이션 모듈입니다. 저희 장비에서 이걸 한 번 크게 손봤는데, 과정 자체가 좀 길어져서 한 편으로는 안 되겠더라구요. 7편짜리 시리즈로 나눠서 기록해 둡니다.처음엔 "기존 모듈을 Cognex 로 통합하는 리팩토링" 으로 시작했는데, 진행하면서 상황이 바뀌었습니다. Cognex 의 검출 엔진과 구조적으로 호환되는 자체 OpenCV 검출기를 하나 만들었고, 지금은 두 검출기를 같은 엔진에 꽂아보며 어느 쪽이 장기적으로 더 나은지 고민하는 중입니다. 결정이 난 이야기가 아니라 "아직 결정 안 난" 이야기예요.그래서 이 시리즈는 "이렇게 했습니다" 라는 완성형 튜토리얼이 아니고, "이런 고민을 하면서 이 구조를 만들었습니다" 에 가깝습니..

Vision & Inspection 2026.04.13

[Vision/C++] 반복 패턴 이미지에서의 Grid Center 검출 알고리즘 구현

웨이퍼나 PCB 검사 프로젝트를 진행하다 보면 동일한 패턴이 반복되는 이미지를 자주 다루게 된다. 이러한 이미지에서 미세 결함(Defect)을 검출하기 위해서는, 강한 에지 성분을 가진 반복 패턴을 먼저 제거(Pattern Removal)해야 한다. 패턴 제거를 위해 FFT 필터링이나 마스터 이미지와의 Subtraction 방식을 고려하고 있는데, 이를 위해서는 선행적으로 각 디펙트의 인덱싱정보를 위해 각 패턴의 정확한 중심 좌표(Center Position)를 확보해야 한다. 본 포스팅에서는 2D 이미지 프로세싱 부하를 줄이기 위해 투영(Projection) 기법을 활용하여 Grid Pattern의 중심을 검출하는 로직(GridPatternMatching) 구현 과정을 정리한다.1. 검증 환경 구성실제..

Vision & Inspection 2025.12.21

[C++/CUDA] 90GB 대용량 버퍼풀에서 4,000개 ROI만 쏙 뽑아 초고속 어파인 변환하기 (Zero-Copy & Batch Assembly)

최근 uled 검사 장비 개발 프로젝트를 진행하면서 극한의 성능 요구사항에 부딪혔습니다. 시스템에는 90GB에 달하는 초대형 Raw 이미지가 메모리에 로드되어 있습니다. 제 미션은 이 거대한 이미지 전체를 건드리는 것이 아니라, 검사가 필요한 4,000개 이상의 특정 영역(ROI)만 빠르게 잘라내어 어파인 변환(Affine Transform)을 수행하는 것이었습니다. 처음에는 "GPU가 빠르니까 금방 하겠지"라고 생각했지만, 현실은 달랐습니다. 90GB라는 거대한 바다에서 작은 조각 4,000개를 건져 올리는 과정에서 PCIe 통신 병목(Latency)이 발목을 잡았기 때문입니다. 오늘은 이 문제를 해결하기 위해 적용한 대용량 메모리 핀(Pin) 등록과 필요한 부분만 처리하는 GPU 배치 조립(Batch..

Vision & Inspection 2025.12.07