주요 기능
NX 단면 이미지를 불러와서 측정→기록→내보내기까지 원스톱으로
📷
이미지 드래그 & 드롭
PNG, JPG, BMP, TIFF 형식의 NX 스크린샷을 캔버스에 드래그하면 바로 로드됩니다.
📏
스케일 보정
기지(旣知)의 두 점을 클릭하고 실제 mm 값을 입력하면 자동으로 pixel/mm 비율을 계산합니다.
🔍
하이브리드 레이어 검출
OpenCV Canny 엣지 검출 + 수직 측정선으로 경계를 자동 분할. 수동 보정도 가능합니다.
📊
실시간 테이블 & Excel 내보내기
검출 즉시 우측 테이블에 반영, 레이어 이름 편집 가능, .xlsx로 저장합니다.
샘플 단면 이미지
5개 레이어(Top Coat, Adhesive, Core Metal, Insulator, Base) 합성 단면
examples/sample_section.png — 100 px = 10 mm 스케일 바 포함
검출 결과 (자동 측정)
| Layer | Top (px) | Bottom (px) | Thickness (px) | Thickness (mm) |
|---|---|---|---|---|
| Layer 1 — Top Coat | 60.00 | 80.00 | 20.0 | 2.00 |
| Layer 2 — Adhesive | 80.00 | 95.00 | 15.0 | 1.50 |
| Layer 3 — Core Metal | 95.00 | 155.00 | 60.0 | 6.00 |
| Layer 4 — Insulator | 155.00 | 184.00 | 29.0 | 2.90 |
| Layer 5 — Base | 184.00 | 231.00 | 47.0 | 4.70 |
1 설치
Python 3.10 이상이 필요합니다
bash
# 저장소 클론
git clone https://github.com/yonchelee/sc_auto_measure.git
cd sc_auto_measure
git checkout claude/nx-layer-thickness-analyzer-wHmQS
# 가상환경 생성 & 활성화
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 의존성 설치
pip install --upgrade pip
pip install -r requirements.txt
2 실행 & 사용법
앱을 띄우고 6단계로 측정 완료
bash
python main.py
- NX 단면 스크린샷을 캔버스에 드래그 & 드롭하거나 메뉴 파일 → 이미지 열기 (Ctrl+O).
-
기준선 설정 버튼 → 실제 길이를 아는 두 점 클릭 →
다이얼로그에 실제 mm 값 입력 → OK.
우측 하단에
mm/pixel값이 표시됩니다. - 측정선 그리기 버튼 → 적층부를 가로지르는 두 점 클릭. 기본 수직 스냅, Shift 키로 자유 각도.
- 자동 레이어 검출: Canny 엣지 검출로 경계가 빨간색으로 표시되고, 우측 테이블에 Layer 1…N이 채워집니다.
- 필요 시 테이블에서 레이어 이름 편집, 선택 행 삭제로 수동 보정.
-
Excel로 내보내기 (Ctrl+S) →
.xlsx파일로 저장. 이미지 경로와 mm/pixel 메타 포함.
3 프로젝트 구조
모듈별 역할 분리: core (분석) + gui (인터페이스)
sc_auto_measure/
├── main.py ← PyQt6 엔트리포인트
├── requirements.txt
├── README.md
├── app/
│ ├── core/
│ │ ├── measurement.py ← Layer / Measurement 데이터 모델
│ │ ├── scale_calibrator.py ← 픽셀 ↔ mm 변환
│ │ ├── edge_detector.py ← OpenCV Canny + 수직선 프로파일
│ │ └── excel_exporter.py ← Pandas + openpyxl 저장
│ └── gui/
│ ├── main_window.py ← 좌 캔버스 / 우 테이블 레이아웃
│ ├── image_canvas.py ← 드래그&드롭, 클릭, 오버레이
│ ├── measurement_table.py ← QTableWidget 래퍼
│ └── scale_dialog.py ← 실제 길이 입력 다이얼로그
├── examples/
│ ├── generate_sample.py ← 샘플 이미지 생성 스크립트
│ └── sample_section.png ← 테스트용 5-레이어 합성 단면
├── tests/
│ └── test_core.py ← 8개 유닛 테스트
└── docs/
└── index.html ← 이 페이지 (GitHub Pages)
4 기술 스택
requirements.txt 기준
PyQt6
GUI 프레임워크
OpenCV
이미지 처리 & 엣지 검출
NumPy
배열 연산 & 수치 분석
Pandas
데이터프레임 & Excel 엔진
openpyxl
.xlsx 파일 생성 & 서식
5 테스트
핵심 모듈 유닛 테스트 8개 포함
bash
pip install pytest
pytest
# 결과: 8 passed
| 테스트 | 검증 내용 |
|---|---|
| test_scale_calibrator_basic | 100px = 10mm → mm_per_pixel = 0.1 |
| test_scale_calibrator_rejects_zero_length | 거리 0인 기준선 거부 |
| test_scale_calibrator_rejects_non_positive_mm | 음수/0 mm 입력 거부 |
| test_detect_layers_recovers_known_thicknesses | 합성 3-레이어 두께 복원 (±2px) |
| test_detect_layers_returns_empty_for_uniform | 균일 이미지 → 빈 결과 |
| test_layers_from_boundaries_rebuilds_layers | 경계값에서 레이어 재구축 |
| test_measurement_recompute_applies_mm_ratio | mm 비율 적용 재계산 |
| test_excel_export_roundtrip | xlsx 저장 → 재로드 데이터 일치 |
캔버스 조작 팁
| 입력 | 동작 |
|---|---|
| 마우스 휠 | 확대 / 축소 |
| 마우스 드래그 (탐색 모드) | 이미지 스크롤 |
| Ctrl+O | 이미지 열기 |
| Ctrl+S | Excel로 저장 |
| Ctrl+Q | 종료 |
| Shift + 두 번째 클릭 | 측정선 자유 각도 (수직 스냅 해제) |