- 지도 기반 나침반(노스업, 현재위치, 시야 역삼각형): 호버 확대·휠 줌·클릭 위성전환, OSM/Esri 타일 서버 프록시(/api/tile) - 스테이션 검색: 실제 측점(chain) 기준 이동, 없으면 '측점 없음' 안내 - 역 마커: 직교 투영 측점 일치 시에만 표시, 미도착 종점은 추가 방식 - POI 팝업 겹침/재등장·라벨 정합 수정 - 영상 fps 데이터 기반 자동 산출 - 기술/발표/쉬운설명 문서 추가 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
302 lines
13 KiB
HTML
302 lines
13 KiB
HTML
<!DOCTYPE html>
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="generator" content="pandoc" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
<title>철도 스테이션 기반 주행영상 플레이어 — 개발 내용 및 핵심기술</title>
|
|
<style>
|
|
code{white-space: pre-wrap;}
|
|
span.smallcaps{font-variant: small-caps;}
|
|
span.underline{text-decoration: underline;}
|
|
div.column{display: inline-block; vertical-align: top; width: 50%;}
|
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
ul.task-list{list-style: none;}
|
|
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
</style>
|
|
<style type="text/css">
|
|
@page {
|
|
size: A4;
|
|
margin: 22mm 18mm 18mm 18mm;
|
|
@top-left { content: "한맥 기술개발센터"; font-family: "Malgun Gothic"; font-size: 8.5pt; color: #555; }
|
|
@top-right { content: "대외비 / 회의자료"; font-family: "Malgun Gothic"; font-size: 8.5pt; color: #a33; }
|
|
@bottom-center { content: "기술로 사람과 자연이 함께하는 세상을 만들어 갑니다."; font-family: "Malgun Gothic"; font-size: 8.5pt; color: #999; }
|
|
@bottom-right { content: counter(page); font-family: "Malgun Gothic"; font-size: 8.5pt; color: #999; }
|
|
}
|
|
html { font-size: 10.5pt; }
|
|
body {
|
|
font-family: "Malgun Gothic", "Hancom Gothic", sans-serif;
|
|
color: #1a1a1a; line-height: 1.55; margin: 0 auto; max-width: 900px; padding: 8px 10px;
|
|
}
|
|
|
|
h1 {
|
|
text-align: center; font-size: 17pt; font-weight: 800; color: #111;
|
|
margin: 2px 0 4px; padding-bottom: 8px; border-bottom: 2.5px solid #333;
|
|
}
|
|
.subhead { text-align: center; color: #666; font-size: 9.5pt; margin: 0 0 18px; }
|
|
|
|
h2 {
|
|
font-size: 13pt; font-weight: 800; color: #14305e;
|
|
margin: 18px 0 8px; padding: 0; border: none;
|
|
}
|
|
|
|
h3 { font-size: 11pt; font-weight: 700; color: #333; margin: 12px 0 5px; }
|
|
ul { margin: 4px 0 8px; padding-left: 18px; }
|
|
li { margin: 2px 0; }
|
|
strong { color: #111; }
|
|
a { color: #14305e; text-decoration: none; }
|
|
|
|
table { border-collapse: collapse; width: 100%; margin: 8px 0 12px; font-size: 9.5pt; }
|
|
th, td { border: 1px solid #555; padding: 5px 8px; vertical-align: top; text-align: left; }
|
|
th { background: #e9edf3; color: #14305e; font-weight: 700; text-align: center; }
|
|
td.c, th.c { text-align: center; }
|
|
|
|
blockquote {
|
|
border: 1px solid #c9b27a; background: #fffbf0; border-radius: 4px;
|
|
margin: 10px 0; padding: 8px 12px; color: #5a4626; font-size: 9.8pt;
|
|
}
|
|
figure { margin: 10px 0; text-align: center; page-break-inside: avoid; break-inside: avoid; }
|
|
figure svg { width: 100%; max-width: 720px; height: auto; }
|
|
figure figcaption { font-size: 8.8pt; color: #777; margin-top: 4px; }
|
|
text { font-family: "Malgun Gothic", sans-serif; }
|
|
h1, h2, h3 { break-after: avoid; }
|
|
table, figure { break-inside: avoid; }
|
|
</style>
|
|
<!--[if lt IE 9]>
|
|
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
|
|
<![endif]-->
|
|
</head>
|
|
<body>
|
|
<header id="title-block-header">
|
|
<h1 class="title">철도 스테이션 기반 주행영상 플레이어 — 개발 내용 및 핵심기술</h1>
|
|
</header>
|
|
<h1 id="철도-스테이션측점-기반-주행영상-웹플레이어--개발-내용-및-핵심기술">철도 스테이션(측점) 기반 주행영상 웹플레이어 — 개발 내용 및 핵심기술</h1>
|
|
<p class="subhead">기술개발센터 · 작성일 2026-06-29 · (작성자/팀 기입)</p>
|
|
|
|
<h2 id="-개요">□ 개요</h2>
|
|
<ul>
|
|
<li><p>드론으로 촬영한 철도 주행영상을 <strong>시간이 아닌 측점(체이니지) 위치 기준</strong>으로 색인·탐색하고, 프레임별 카메라 자세를 이용해 <strong>측점·POI·선로중심선을 영상 위에 실시간 정합(AR 오버레이)</strong> 하여 표출하는 <strong>웹 기반 주행영상 분석 플레이어</strong> 개발</p></li>
|
|
<li><p>입력 데이터 : 드론 주행영상 + 프레임별 비행로그(SRT) + 노선 측점/POI/구조물 데이터(폴더 일괄 적재)</p></li>
|
|
</ul>
|
|
<table>
|
|
<thead>
|
|
<tr class="header">
|
|
<th>항목</th>
|
|
<th>내용</th>
|
|
<th style="text-align: center;">포맷</th>
|
|
<th>비고</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="odd">
|
|
<td>드론 주행영상</td>
|
|
<td>점검 구간 촬영 영상</td>
|
|
<td style="text-align: center;">MP4</td>
|
|
<td>2GB+ 대용량</td>
|
|
</tr>
|
|
<tr class="even">
|
|
<td>비행로그</td>
|
|
<td>프레임별 위치·자세·초점</td>
|
|
<td style="text-align: center;">SRT/CSV</td>
|
|
<td>lat/lon/고도, yaw/pitch/roll, focal</td>
|
|
</tr>
|
|
<tr class="odd">
|
|
<td>측점</td>
|
|
<td>노선 측점 좌표·표고</td>
|
|
<td style="text-align: center;">CSV(01측점)</td>
|
|
<td><strong>정표고(Z좌표_한국)</strong> 사용</td>
|
|
</tr>
|
|
<tr class="even">
|
|
<td>POI/구조물</td>
|
|
<td>교량·터널·역사·지장물·출입문</td>
|
|
<td style="text-align: center;">CSV/KMZ</td>
|
|
<td>03교량·04터널·06구교·02지장물</td>
|
|
</tr>
|
|
<tr class="odd">
|
|
<td>노선 보정</td>
|
|
<td>진행방향·종점·이정 보정</td>
|
|
<td style="text-align: center;">route.json</td>
|
|
<td>폴더별(선택)</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<ul>
|
|
<li>처리 알고리즘 흐름도</li>
|
|
</ul>
|
|
<figure>
|
|
<svg viewBox="0 0 760 150" role="img" aria-label="처리 흐름도">
|
|
<defs><marker id="ha" markerWidth="9" markerHeight="9" refX="6" refY="3" orient="auto"><path d="M0,0 L6,3 L0,6 Z" fill="#14305e"></path></marker></defs>
|
|
<rect x="8" y="55" width="120" height="46" rx="5" fill="#eef2f8" stroke="#14305e"></rect>
|
|
<text x="68" y="74" text-anchor="middle" font-size="11" font-weight="bold" fill="#14305e">폴더 입력</text>
|
|
<text x="68" y="90" text-anchor="middle" font-size="9" fill="#555">영상·로그·CSV·KMZ</text>
|
|
<rect x="160" y="55" width="120" height="46" rx="5" fill="#fff" stroke="#555"></rect>
|
|
<text x="220" y="74" text-anchor="middle" font-size="11" font-weight="bold">파싱</text>
|
|
<text x="220" y="90" text-anchor="middle" font-size="9" fill="#555">인코딩 자동감지</text>
|
|
<rect x="312" y="55" width="138" height="46" rx="5" fill="#fff7e6" stroke="#b45309"></rect>
|
|
<text x="381" y="74" text-anchor="middle" font-size="11" font-weight="bold" fill="#b45309">좌표·측점 계산</text>
|
|
<text x="381" y="90" text-anchor="middle" font-size="9" fill="#7c2d12">투영 · 체이니지</text>
|
|
<rect x="496" y="10" width="256" height="36" rx="5" fill="#fff" stroke="#16a34a"></rect>
|
|
<text x="624" y="33" text-anchor="middle" font-size="10.5" font-weight="bold" fill="#14532d">① 영상 AR 오버레이</text>
|
|
<rect x="496" y="60" width="256" height="36" rx="5" fill="#fff" stroke="#16a34a"></rect>
|
|
<text x="624" y="83" text-anchor="middle" font-size="10.5" font-weight="bold" fill="#14532d">② 측점 스테이션바(탐색)</text>
|
|
<rect x="496" y="110" width="256" height="36" rx="5" fill="#fff" stroke="#16a34a"></rect>
|
|
<text x="624" y="133" text-anchor="middle" font-size="10.5" font-weight="bold" fill="#14532d">③ 대용량 영상 재생</text>
|
|
<line x1="128" y1="78" x2="158" y2="78" stroke="#14305e" stroke-width="1.5" marker-end="url(#ha)"></line>
|
|
<line x1="280" y1="78" x2="310" y2="78" stroke="#14305e" stroke-width="1.5" marker-end="url(#ha)"></line>
|
|
<line x1="450" y1="78" x2="494" y2="28" stroke="#14305e" stroke-width="1.5" marker-end="url(#ha)"></line>
|
|
<line x1="450" y1="78" x2="494" y2="78" stroke="#14305e" stroke-width="1.5" marker-end="url(#ha)"></line>
|
|
<line x1="450" y1="78" x2="494" y2="128" stroke="#14305e" stroke-width="1.5" marker-end="url(#ha)"></line>
|
|
</svg>
|
|
<figcaption>그림 1. 데이터 입력 → 파싱 → 좌표·측점 계산 → (오버레이/스테이션바/재생) 처리 흐름</figcaption>
|
|
</figure>
|
|
|
|
<ul>
|
|
<li>출력 / 주요 기능</li>
|
|
</ul>
|
|
<table>
|
|
<thead>
|
|
<tr class="header">
|
|
<th>항목</th>
|
|
<th>내용</th>
|
|
<th>비고</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="odd">
|
|
<td>영상 오버레이</td>
|
|
<td>측점·교량·터널·역사·POI·중심선·드론궤적을 영상에 정합 표시</td>
|
|
<td>60fps</td>
|
|
</tr>
|
|
<tr class="even">
|
|
<td>측점 스테이션바</td>
|
|
<td>측점 위치 기반 탐색바(거리/측점축), 구조물 마커, 방향색</td>
|
|
<td>시간축 대체</td>
|
|
</tr>
|
|
<tr class="odd">
|
|
<td>측점 검색</td>
|
|
<td>측점값 입력 → 해당 위치로 이동(여러 곳이면 순환)</td>
|
|
<td>—</td>
|
|
</tr>
|
|
<tr class="even">
|
|
<td>위치 보정</td>
|
|
<td>화면 드래그로 POI 위치/표고 보정·저장</td>
|
|
<td>데이터셋별 영속</td>
|
|
</tr>
|
|
<tr class="odd">
|
|
<td>대용량 재생</td>
|
|
<td>2GB+ 영상 Range/HLS 스트리밍</td>
|
|
<td>로컬·서버</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h2 id="-핵심-기술">□ 핵심 기술</h2>
|
|
<table>
|
|
<thead>
|
|
<tr class="header">
|
|
<th style="text-align: center;">#</th>
|
|
<th>기술</th>
|
|
<th>핵심 내용</th>
|
|
<th>효과</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="odd">
|
|
<td style="text-align: center;">1</td>
|
|
<td>측점(체이니지) 색인·탐색</td>
|
|
<td>영상 매 시점을 노선 측점값으로 환산, 위치 기준 탐색</td>
|
|
<td>시간축 대비 점검 적합</td>
|
|
</tr>
|
|
<tr class="even">
|
|
<td style="text-align: center;">2</td>
|
|
<td>실시간 영상 정합(투영)</td>
|
|
<td>드론 위치·자세·초점 → 핀홀 투영으로 GIS점을 화면 픽셀에 정렬</td>
|
|
<td>서버 없이 클라이언트 60fps</td>
|
|
</tr>
|
|
<tr class="odd">
|
|
<td style="text-align: center;">3</td>
|
|
<td><strong>측점 표고 기반 DEM-free 정합</strong></td>
|
|
<td>측점 실측 정표고를 지면고도로 사용 + 지오이드 datum 정합</td>
|
|
<td>DEM 불필요, 부각오차 42.7°→11°</td>
|
|
</tr>
|
|
<tr class="even">
|
|
<td style="text-align: center;">4</td>
|
|
<td><strong>단일 드래그 역투영 보정</strong></td>
|
|
<td>화면 드래그 1회로 가로·세로·거리 동시 복원(깊이맵 불요)</td>
|
|
<td>지오코딩 오차 손쉬운 교정</td>
|
|
</tr>
|
|
<tr class="odd">
|
|
<td style="text-align: center;">5</td>
|
|
<td>화각(FOV) 1점 보정</td>
|
|
<td>라벨 1개를 끌면 세로 화각(sensorH) 역산(가로 정합 보존)</td>
|
|
<td>영상별 화각 자동 정합</td>
|
|
</tr>
|
|
<tr class="even">
|
|
<td style="text-align: center;">6</td>
|
|
<td>에지보존 적응형 평활</td>
|
|
<td>직선=강하게/회전=즉시추종, 속도적응 EMA</td>
|
|
<td>떨림 억제 + 무지연</td>
|
|
</tr>
|
|
<tr class="odd">
|
|
<td style="text-align: center;">7</td>
|
|
<td>위치(거리/측점)축 진행바</td>
|
|
<td>누적 이동거리·측점 비례 축, 방향은 색으로 분리</td>
|
|
<td>호버·왕복 정확 표현</td>
|
|
</tr>
|
|
<tr class="even">
|
|
<td style="text-align: center;">8</td>
|
|
<td>좌표/측점 이중탐지 + kmExists</td>
|
|
<td>측점·좌표 두 기준 합집합 탐지, 실제 측점 유무 판정</td>
|
|
<td>재진입 마커 누락 해소</td>
|
|
</tr>
|
|
<tr class="odd">
|
|
<td style="text-align: center;">9</td>
|
|
<td>대용량 스트리밍(Range/HLS)</td>
|
|
<td>10MB 청크 Range + HLS 분할(backBufferLength 30)</td>
|
|
<td>2GB+ 안정 재생</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<blockquote>
|
|
<p>세부 알고리즘·수식·소스 위치는 별첨 「기술명세_GhiVideo_종합기술문서」 참조.</p>
|
|
</blockquote>
|
|
<h2 id="-개발-결과-및-이슈사항">□ 개발 결과 및 이슈사항</h2>
|
|
<ul>
|
|
<li>영상 정합 정확도 : 표고 datum 정합으로 <strong>부각오차 42.7°→11.0°</strong>, 측점 기반 지면고도가 구글 DEM 대비 <strong>약 0.2m(2160p에서 ~6px) 일치</strong></li>
|
|
<li>위치 보정 : 역투영 <strong>왕복오차 ≈ 0</strong>(z=42→화면→42.000), 보정값은 데이터셋별 자동 저장·복원</li>
|
|
<li>렌더 성능 : 사전계산(가시성) + RAF(좌표 재투영) 분리로 4K·대용량에서도 <strong>60fps 유지</strong></li>
|
|
<li>측점 탐색 : 좌표/측점 이중탐지 + 합집합 보강으로 <strong>조차장·종점 재진입 마커 누락 해소</strong>, 실제 측점 없는 위치는 측점값 라벨 숨김</li>
|
|
<li>운영 : 사내망 외부접속 지원(포트 55000), 보고서 자동생성(md→HTML/PDF) 도구 구축</li>
|
|
<li>이슈 : 지오코딩 <strong>수평오차는 데이터 한계</strong>(드래그 수동보정) · 지오이드고는 <strong>지역상수</strong>(대전 25.8m, 타지역 재튜닝) · VFR/GPS 노이즈 잔존 · <strong>특허 KIPRIS 전문검색 미수행</strong></li>
|
|
</ul>
|
|
<p>▷ 측점 표고 정합 vs 외부 DEM 활용 (비교)</p>
|
|
<table>
|
|
<thead>
|
|
<tr class="header">
|
|
<th>항목</th>
|
|
<th>측점 표고 정합(본 방식)</th>
|
|
<th>외부 DEM 활용</th>
|
|
<th>비고</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="odd">
|
|
<td>장점</td>
|
|
<td>1. 별도 DEM 취득 불필요<br>2. 노선 기복 자동 반영<br>3. 측량값이라 정밀(~0.2m)</td>
|
|
<td>1. 측점 데이터 없는 구간도 커버</td>
|
|
<td>본 방식은 보유 측점 활용</td>
|
|
</tr>
|
|
<tr class="even">
|
|
<td>단점</td>
|
|
<td>측점 사이 구간은 보간 의존</td>
|
|
<td>1. 취득비용/해상도 한계(30~90m)<br>2. 다운로드·전처리 시간</td>
|
|
<td>DEM은 선로 인접·절벽서 부정확</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<blockquote>
|
|
<p>☞ 정합 정확도가 핵심인 점검·분석 용도에서는 <strong>측점 표고 정합 방식이 비용·정밀도 모두 유리</strong>. 측점 미보유 구간 보강이 필요할 때만 외부 DEM 보조 활용 권장.</p>
|
|
<p>☞ 향후 : ① 발명 B(측점 표고 정합) + C(단일 드래그 역투영) 중심 <strong>특허 출원</strong>(KIPRIS 전문검색 선행) ② 렌즈왜곡·자동 캘리브레이션 ③ 측점 미보유 구간 DEM 자동조회.</p>
|
|
</blockquote>
|
|
</body>
|
|
</html>
|