Настройка компьютерного зрения в OpenPNP для сортировки SMD-компонентов из россыпи

Всем привет! Продолжаем изучать функционал OpenPNP. В этой статье я расскажу, как настроить автоматическое распознавание электронных компонентов, рассыпанных в ячейке (так называемой "рассыпухи").

Проблема ручной сортировки

До того как у меня появился станок для сборки, я паял устройства небольшими партиями, а резисторы и конденсаторы хранил в ручном комбайне.

Однако гораздо практичнее хранить компоненты на катушках с лентой, особенно если вы планируете использовать их позже с помощью автоматического питателя (фидера). Когда покупаешь не 100-200, а несколько тысяч компонентов одного номинала, просто высыпать их в общую коробку — неразумно. Некоторые номиналы у меня уже оказались в таких "коробочках", и их нужно было как-то привести в порядок. Заправлять их обратно в пустые ленты вручную — процесс крайне утомительный, особенно если на плате используется больше десятка таких компонентов. Решением стал инструмент Reference Loose Part Feeder.

Подготовка: создание фона для распознавания

Первый шаг — подготовка фона. Я использовал квадратные ячейки, напечатанные на 3D-принтере. В качестве подложки взял зеленую пластину, также напечатанную на принтере с включенной опцией сглаживания верхнего слоя. Её поверхность была дополнительно обработана наждачной бумагой для придания матовости. Это важно для снижения бликов. В принципе, можно использовать и цветную бумагу, но зеленый цвет ("хромакей") является классическим для компьютерного зрения. Многие стандартные конвейеры обработки (pipeline) в OpenPNP заточены именно под него, что упрощает настройку.

Принцип работы конвейеров (Pipelines) в OpenPNP

Все операции распознавания в OpenPNP — будь то поиск компонентов в россыпи, выравнивание платы по меткам или другие задачи — настраиваются с помощью так называемых Pipelines (Конвейеров). Это последовательность стандартных шагов обработки изображения. Комбинируя эти шаги и настраивая их параметры, можно достичь нужного результата. Давайте создадим или отредактируем такой конвейер.

Пошаговая настройка конвейера для резисторов

1. Захват и первичная обработка: Сначала система захватывает изображение. К нему применяется размытие по Гауссу (BlurGaussian), чтобы убрать мелкие цифровые шумы и артефакты, невидимые глазу. На этом этапе уже можно заметить, что некоторые резисторы лежат неправильно (например, "пузом" вверх).

2. Выделение контуров: Изображение преобразуется в оттенки серого (ConvertColor), а затем в черно-белое (Threshold) с заданием порога яркости. В результате мы получаем четкие белые области — это могут быть как контактные площадки (хорошо отражающие свет), так и перевернутые резисторы. Далее алгоритм ищет все замкнутые контуры (FindContours).

3. Фильтрация по размеру: Теперь нужно отделить перевернутые резисторы от контактных площадок. Используем шаг FilterContours, задав минимальный размер контура больше, чем у площадки, и максимальный, чтобы отсечь слишком большие случайные блики.

Для наглядности я добавил шаг DrawContours, который подсвечивает все контуры, прошедшие фильтрацию.

Отлично! Неправильно лежащие резисторы выделены.

Обратите внимание: Портит ли зрение комьютер или телефон?.

Но нам нужны и правильные компоненты. Переходим к их поиску.

Выделение правильных компонентов на зеленом фоне

4. Работа с цветом: Вызываем шаг ImageRecall, чтобы вернуться к исходному цветному изображению. Затем преобразуем цветовую модель из RGB в HSVFull (это важно для более точного выделения цветов). После этого применяем маску (MaskHSV), которая оставляет только объекты зеленого цвета — то есть наши резисторы на фоне.

Теперь на изображении видны все резисторы, и правильные, и перевернутые.

5. Применение логической маски (магия): Здесь происходит ключевой момент. Используем шаг MaskModels. В параметре modelStageName указываем имя того этапа, на котором мы фильтровали неправильные резисторы (например, "contouringResistors"). Этот шаг вычитает из текущего изображения те области, которые были найдены ранее. Результат впечатляет:

Элегантно, не правда ли? Перевернутые резисторы практически исчезли.

Финальная обработка и определение позиций

6. Очистка и уточнение: Обрезаем изображение (MaskRectangle), чтобы убрать лишние края. Затем применяем более сильное медианное размытие (BlurMedian), которое лучше сглаживает шумы, чем гауссово на первом этапе. В итоге остаются только четкие области правильных компонентов.

7. Обнаружение и ориентация: Осталось снова найти контуры (FindContours + FilterContours), а затем, используя стандартные шаги конвейера, определить для каждого компонента ограничивающий прямоугольник и его угол поворота. Для визуализации можно добавить шаг отрисовки.

На этом настройка завершена. Система теперь может автоматически находить и определять положение правильно ориентированных SMD-резисторов и конденсаторов в россыпи. Надеюсь, этот материал был вам полезен и интересен! ;)

P.S. Отдельная благодарность @Pas.Ratunkow за мотивацию :)

Больше интересных статей здесь: Гаджеты.

Источник статьи: ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи.