iArt.ai
AI 모션 그래픽 소프트웨어, 누구나 사용할 수 있는 After Effects 대안, 텍스트 프롬프트로 몇 분 안에 애니메이션·설명 영상 제작
브라우저에서 문서 스캔: OpenCV.js 자동 감지, 수동 코너 조정 및 원근 보정. 백엔드 없이
Escáner de documentos en el navegador: detección automática con OpenCV.js, ajuste manual de esquinas y corrección de perspectiva. Sin backend.
미디어JavaScript · CSSGitHub @rzazo24온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Escáner de documentos en el navegador: detección automática con OpenCV.js, ajuste manual de esquinas y corrección de perspectiva. Vanilla JS, sin backend.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Escáner de documentos que corre entero en el navegador: detecta el documento con la cámara, corrige la perspectiva y exporta un PNG limpio en blanco y negro, escala de grises o color — o un PDF con varias páginas de una tacada — sin subir nada a ningún servidor. Toda la visión por computador (detección de bordes, contornos y warpPerspective) la hace OpenCV.js cargado por CDN. Uno más de una serie de proyectos pequeños para portfolio, junto a BusYa (tiempos de paso EMT/CRTM) y Disaster Watch (alertas globales GDACS).README 전문 보기 ↗
Escáner de documentos que corre entero en el navegador: detecta el documento con la
cámara, corrige la perspectiva y exporta un PNG limpio en blanco y negro, escala de
grises o color — o un PDF con varias páginas de una tacada — sin subir nada a ningún
servidor. Toda la visión por computador (detección de bordes, contornos y
warpPerspective) la hace OpenCV.js cargado
por CDN.
Uno más de una serie de proyectos pequeños para portfolio, junto a BusYa (tiempos de paso EMT/CRTM) y Disaster Watch (alertas globales GDACS).
Demo en vivo: https://zscanner.vercel.app/
getUserMedia y, en cada frame, un bucle de detección
corre el documento a través de OpenCV.js: gris → GaussianBlur → Canny →
findContours → approxPolyDP, buscando el cuadrilátero convexo más grande. El
contorno detectado se dibuja en tiempo real sobre el preview.Canny se recalculan en cada frame a partir de la mediana de brillo de
la imagen (heurística estándar, sigma=0.33), en vez de usar un par de valores fijos —
así la detección se adapta sola a luz mala o poco contraste en vez de depender de un
ajuste manual único que solo funciona bien en una escena. Si ese cálculo no encuentra
ningún cuadrilátero, se reintenta una vez con umbrales más permisivos antes de rendirse
en ese frame.getPerspectiveTransform + warpPerspective usando las 4 esquinas encontradas.<input type="file">). Al no depender de getUserMedia ni del bucle de detección,
es una vía de escaneo completamente independiente de la cámara en vivo: sigue
funcionando igual aunque haya algún problema puntual con esta última. La imagen
elegida siempre pasa por el ajuste manual de esquinas (no hay detección automática
posible sobre una foto ya tomada).adaptiveThreshold, con el tamaño de bloque
escalado a la resolución real del recorte para no verse ruidoso a resoluciones de
captura más altas) — blanco y negro puro, máximo contraste, archivo más pequeño.sw.js) cachea el shell estático de la app
(HTML/CSS/JS/iconos) con estrategia stale-while-revalidate, para que cargue al instante
y la interfaz funcione sin conexión en visitas repetidas; si detecta una versión nueva
mientras la app está abierta, muestra un aviso con un botón para recargar en vez de
hacerlo solo (podría cortar una captura o un arrastre de esquinas en curso).El área mínima del contorno, el tamaño del blur, el epsilon de approxPolyDP, y los
frames requeridos para bloquear/soltar la detección, son overridables por query string,
para probar valores distintos sin tocar código. Pasar cannyLow/cannyHigh explícitos
desactiva el cálculo automático por mediana y fuerza esos valores fijos (o desactívalo a
mano con autoCanny=0):
index.html?minArea=0.1&cannyLow=40&cannyHigh=120&blur=7&epsilon=0.015&stableFrames=3&missGrace=8
Añadiendo ?debug=1 aparece además un panel con sliders para los mismos parámetros,
con el valor aplicándose en vivo al siguiente frame.
<canvas> en memoria (nunca en
disco ni en el servidor) — funciona bien para el uso típico de escanear un puñado de
hojas, pero muchas páginas de alta resolución seguidas pueden notarse en RAM en un
móvil modesto. No hay un límite explícito de páginas ni una barra de progreso durante
la generación del PDF.onnxruntime-web. No es un simple añadido:
sería un modelo extra que descargar (además de OpenCV.js, no en su lugar), y las
implementaciones que existen usan un bundler porque el backend WASM rápido de
onnxruntime-web necesita cabeceras Cross-Origin-Opener-Policy/
Cross-Origin-Embedder-Policy para SharedArrayBuffer (configurables en Vercel sin
build step, pero no es un CDN-y-listo como OpenCV.js). Si se aborda, mejor como
modo opt-in (p. ej. ?ml=1) que conviva con el pipeline clásico, no como reemplazo.js/*.js con import/export) que el navegador resuelve directamente, sin
bundler.manifest.webmanifest + sw.js.WhitePaperTransform de
OSS-DocumentScanner
— reimplementada aquí directamente contra OpenCV.js, no copiada de su código C++.zscanner/
├── css/
│ └── styles.css
├── js/
│ ├── dom.js # referencias a elementos del DOM
│ ├── state.js # estado mutable compartido entre módulos
│ ├── ui.js # transiciones entre las 3 pantallas (cámara/ajuste/resultado)
│ ├── camera.js # getUserMedia y mapeo de coordenadas vídeo → stage
│ ├── detection.js # pipeline de OpenCV.js + parámetros ajustables
│ ├── adjust.js # esquinas arrastrables sobre el frame congelado
│ ├── perspective.js # warpPerspective + modos de salida + descarga
│ ├── pages.js # sesión multipágina: miniaturas + exportar PDF (jsPDF)
│ ├── share.js # guardar/compartir un archivo (Web Share API o descarga clásica)
│ └── main.js # orquestación: carga de OpenCV.js, SW y listeners de botones
├── icons/ # iconos de la PWA (192/512/512-maskable/apple-touch-icon)
├── index.html
├── favicon.svg
├── manifest.webmanifest
├── sw.js # service worker: cachea el shell estático, nunca OpenCV.js
├── LICENSE
├── CHANGELOG.md
└── README.md
No requiere instalación de dependencias ni build step. Basta con servir los archivos estáticos, por ejemplo:
python3 -m http.server 8000
# o: npx serve .
Y abrir http://localhost:8000 en el navegador. La cámara requiere HTTPS o localhost
(la excepción que los navegadores hacen para getUserMedia en desarrollo).
Sin configuración de build: Vercel sirve index.html, css/ y js/ tal cual como
sitio estático.
Ver CHANGELOG.md.
Código bajo licencia MIT (ver LICENSE). OpenCV.js se carga desde su propio CDN oficial y se rige por su propia licencia (Apache 2.0).