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

Приветствую всех. Продолжаю знакомить вас с возможностями OpenPNP.
Сегодня поговорим об автоматическом распознавании элементов в ячейке.
До того как обзавестись станком и начать собирать устройства в более-менее большом объеме, я затаривался резисторами и конденсаторами в маленьких партиях и ссыпал их в ручной "расстановщик".

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Но хранить элементы в катушках гораздо удобнее если ты планируешь их потом использовать в расстановщике. Да и когда покупаешь не 100-200, а 2000-4000 компонентов одного номинала высыпать их куда-то - очень глупо.
Но все же некоторые номиналы я успел раскидать по "ящичкам" и их надо бы как-то утилизировать. Загружать в пустые ленты - вариант, но очень муторно. Особенно, если в каждой плате их больше 10 штук используется.
На помощь приходит "Фидер для рассыпухи". Сегодня расскажу как я его настраивал для распознавания SMD резисторов и конденсаторов с "отфильтровкой" резисторов, лежащих "пузом" вверх.

Первым делом печатаем подложку. Я использовал квадратные коробочки, сделанные на 3Д принтере. "Зеленка" - тоже отпечатанная на принтере пластинка с включенным "разглаживанием" верхнего слоя и в последствии обработанная наждачкой для придания матовости. Это важно. Можно использовать любую яркую цветную бумагу. Но зеленка - классический хромакей и на нее рассчитаны стандартные пайплайны (о них позже) компьютерного зрения в OpenPNP.

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Любое распознавание в OpenPNP, будь то элементы, как в нашем случае, ленты с компонентами, реперные точки для центровки платы и т.д. настраиваются в так называемых Пайплайнах (Pipeline), в которых путем комбинации стандартных шагов и настройки их параметров можно добиться нужного Вам результата. Жмем Edit Pipeline и переходим к редактированию. (Далее я буду пояснять картинки, чтобы меньше писать и больше показывать).

Первым делом идет захват изображения и применение гауссового размытия (BlurGaussian) для фильтрации невидимых нашему глазу артефактов (как видим, у нас 2 резистора вверх тормашками лежат):

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Далее делаем картинку серой (ConvertColor), а после черно-белой (Threshold), задавая порог яркости (шаги gray и highlights). Получаем белые контакты (отражают свет) и "пузики" резисторов.
После мы "ищем все контуры" (FindContours). Каждый замкнутый контур на картинке помечается "к работе"
Но нам сейчас нужно найти резисторы лежащие ненправильно, поэтому фильтруем контуры(FilterContours) по размеру, задав минимальный размер больше, чем контактные площадки, но ограничивая максимальный, чтобы при необходимости отфильтровать засветку.

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Далее для поста я включил пункт отрисовки контуров (DrawContours), чтобы видно было какие остались "в работе".

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Отлично. Мы получили контуры резисторов, которые нам не нужны. Теперь переходим к тем, которые было бы неплохо использовать. Вызываем ImageRecall. Конвертируем цвета из RGB в HSVFull (это важно) и вырезаем на зеленке все резисторы (MaskHSV).

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Тут видно Все наши резисторы. Теперь небольшая магия, Вызываем MaskModels и в качестве параметра modelStageName указываем имя(!) шага, где мы отфильтровали неправильные резисторы (counturingResistors). Вуаля:

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Шик? Уже видно, что резисторы, лежащие неправильно сильно отличаются. Теперь нужно обрезать картинку (MaskRectangle) просто чтобы лишнее убрать. И после применения еще одного размытия (BlurMedian посильней, чем в самом начале Гаусс). И все. Наши контурочки ненужных резисторов почти пропали.

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Осталось сделать определение контуров (FindContours + FilterContours), применить несколько шагов из стандартного Pipeline:
Поиск Прямоугольников + их ориентация. Ну и отрисовать все это дело:

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост
ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Собственно, на этом все. Надеюсь было интересно. ;)

P.S. спасибо @Pas.Ratunkow, за мотивацию :)

TECHNO BROTHER

1.7K поста12.5K подписчика

Добавить пост

Правила сообщества

1-Мы А-политическое сообщество. 2-Запрещено оскорбление: Администрации Пикабу, сообщества, участников сообщества а также родных, близких выше указанных.

3-Категорически запрещается разжигание межнациональной розни или действий, направленных на возбуждение национальной, расовой вражды, унижение национального достоинства, а также высказывания о превосходстве либо неполноценности пользователей по признаку их отношения к национальной принадлежности или политических взглядов. Мат - Нежелателен. Учитесь выражать мысли без матерщины