Система для обнаружения дефектов на поверхностях в реальном времени. Работает с камерой, видеофайлами и изображениями через веб-интерфейс.
Дефекты на поверхности (царапины, трещины, стыки) создают резкие перепады яркости. Система обнаруживает их через анализ L-канала (яркость) в цветовом пространстве LAB:
Кадр → CLAHE-улучшение → L-канал → Gaussian Blur → Canny Edges → Dilate → фильтр по длине контура → дефект
- CLAHE нормализует освещение перед анализом
- Gaussian Blur подавляет текстуру поверхности (зерно дерева, риски металла)
- Canny находит резкие границы по яркости
- Фильтр по длине контура отсекает короткие текстурные рёбра — остаются только протяжённые линии стыков и трещин
Проект разбит на независимые микросервисы, общающиеся через queue.Queue:
CaptureService ──frame_queue──► DetectorService ──result_queue──► WebFrontend
▲ │
params dict FastAPI сервер
(params_lock) GET /video/defects (MJPEG)
│ GET /video/light (MJPEG)
POST /params ◄────────────────────────┘
| Файл | Ответственность |
|---|---|
main.py |
Точка входа, запуск потоков |
capture_service.py |
Захват видео/изображений, CLAHE, зум (центральный кроп), пауза |
detector_service.py |
Canny-детекция, классификация дефектов |
web_frontend.py |
FastAPI сервер, MJPEG-стримы, REST API |
static/index.html |
Веб-интерфейс (два видео + слайдеры) |
git clone https://github.com/redizga/defect-detector.git
cd defect-detector
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python main.pyОткрыть браузер: http://localhost:8000
docker compose up -d appДва видеопотока в реальном времени:
| Окно | Содержимое |
|---|---|
| Дефекты | Исходный кадр с зелёным контуром объекта и красными рамками дефектов |
| Световое пространство | L-канал (яркость) + цветовая маска: синие рёбра Canny, красные зоны дефектов |
- Камера — автоматическое сканирование и выбор из списка, поддержка iPhone через Continuity Camera
- Видеофайл — загрузка через
📁 Файл, поддержка mp4, avi, mov и других форматов - Изображение — загрузка jpg, png, bmp, webp, tiff; обрабатывается как статический кадр
| Элемент | Описание |
|---|---|
⏸ / ▶ |
Пауза / возобновление |
| Скруббер | Перемотка к нужной позиции |
| Скорость | 0.1× – 3.0× (слайдер) |
Кнопка ⏸ Снэпшот замораживает оба видеопотока — удобно для детального изучения кадра.
Камера:
| Параметр | Диапазон | Описание |
|---|---|---|
| Zoom | 100–500 | Зум через центральный кроп. 100 = 1×, 500 = 5× |
Детектор:
| Параметр | Диапазон | Описание |
|---|---|---|
| Blur | 1–21 | Размытие перед Canny — подавляет текстуру |
| Canny Low | 0–255 | Нижний порог Canny (слабые края) |
| Canny High | 0–255 | Верхний порог Canny (сильные края) |
| Dilate | 1–15 | Дилатация рёбер — соединяет прерывистые линии |
| Min Perim | 0–2000 | Мин. длина контура (px) — главный фильтр дефектов |
| Min Area | 0–5000 | Мин. площадь зоны дефекта |
Для деревянных поверхностей / стыков досок:
Blur = 7,Canny Low = 15,Canny High = 50- Поднимать
Min Perimпока не останется только линия стыка
Для металлических поверхностей:
Blur = 3–5,Canny Low = 30,Canny High = 90
| Метод | Путь | Описание |
|---|---|---|
GET |
/ |
Веб-интерфейс |
GET |
/video/defects |
MJPEG-поток с метками дефектов |
GET |
/video/light |
MJPEG-поток светового пространства |
POST |
/params |
Обновить параметр {"name": "Blur", "value": 7} |
GET |
/status |
Статус: дефекты, пауза, позиция воспроизведения |
GET |
/trackbars |
Описание слайдеров детектора |
GET |
/trackbars/camera |
Описание слайдеров камеры |
GET |
/sources |
Список доступных камер |
POST |
/source |
Переключить источник {"source": 0} |
POST |
/upload |
Загрузить видеофайл или изображение |
POST |
/seek |
Перемотать {"position": 0.0–1.0} |
POST |
/pause |
Переключить паузу |
POST |
/snapshot |
Переключить заморозку кадра |
opencv-python >= 4.8.0
numpy >= 1.24.0
fastapi >= 0.110.0
uvicorn >= 0.27.0
python-multipart >= 0.0.9
Требуется Python 3.7+.