Промышленное использование C++ & OpenCV. Часть 1: Постановка задачи и методы реализации

Чтобы не перегружать данную статью, разобью ее на 2 части:

1. Постановка задачи и методы реализации;
2. Программное распознавание и электроника.

Инженер


Начну с того, что я начинающий инженер. Будучи студентом устроился работать программистом на завод. Завод занимался производство лако-крышечных изделий. По простому: крышек для закаток.

Через некоторое время я получил задачу в любимом для многих свободном формате. Мне было позволено пофантазировать на эту тему и через некоторое время предоставить свои «мисли» по этому поводу.

Фантазии


Считать крышки в стопке — казалось бы, что сложного? Берём номинальную стопку, кладём рядом со стопкой, которую считаем и «на глазок (по высоте)» определяем 50 штук или не 50.

Не тут-то было. На производстве уже использовали данный метод, и погрешность была, скажу я вам, +\- 2 штуки.

За счет процесса изготовления и нарезки уплотняющей резинки, которая есть в каждой крышке, высота могла отклоняться на пол сантиметра в обе стороны.



«Мисли»


Сразу вспомнил, что когда-то имел дело с OpenCV. Решил использовать связку OpenCV & C++.

Было сделано несколько фотографий и проведено несколько дней в попытках понять, как же… Из-за постоянно меняющегося освещения было не ясно, как выделять интересующую часть из общей картины. Потом на скорую руку была сделана закрытая «камера» с контролируемой средой. Под контролируемой средой я подразумеваю контролируемое расположение веб-камеры и источника света.

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



Первый успех


Наконец-то начали получаться именно те снимки, которые мы хотели.



Но тут начались безсонные ночи, которые пролетали незаметно… Энтузиазма было хоть отбавляй. Через несколько дней\ночей я получил первый результат. Придуманный мной «алгоритмишка» начал выдавать правильные значения. После предварительной демонстрации вышестоящему руководству было дано добро на продолжение данного проекта.

Технологический процесс упаковки изделий

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

Задача стояла такая: считать количество изделий в стопке перед тем, как они будут упакованы и выводить в понятном для оператора виде количество. В случае, если в стопке было «не 50», независимо в какую сторону, термопак не должен был пропускать данную стопку на упаковку.

Справа в вертикальном положение вы можете увидеть «номинальную» пачку, с которой все и сравнивалось.



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

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

Техническая реализация
Для выполнения подсчета решили использовать FoxConn на Atome. Было куплено некоторое количество этих милах.

image

Разрешение на запуск термопака и визуальное отображение количества изделий было повешено на Arduino Nano.

image

Камеру выбрали Logitech 920e:

image

В качестве засветки взяли светодиодную ленту с линзой из оргстекла.

Во второй части опишу алгоритм поиска, подсчета и в деталях расскажу об электронике, которая была разработана и изготовлена.
Поделиться публикацией
Комментарии 34
    +3
    Стопка вся такая ребристая, периодическая. Навевает мысли о разложении Фурье, частоте и всем таком.
    Ардуина на вывод одного бита — уничтожение воробья конечно же. Один бит можно вывести путем пищания в звуковую карту и пары транзисторов.
      0
      Вы правы. Стопка периодическая и «алгоритм» работает без рядов Фурье. Более подробно я опишу все в следующей статье.
      1) По поводу Arduino (выстрел из пушки по воробьям) я согласен. Сейчас мы передаем 3 байта, в которых первые два байта это «восьмерки» на сегментах, а последний третий для проверки четности.
      2) Да, можно было использовать звуковую карту, только вот нужно было бы изобретать велосипед, т.к. мы не только передаем данные, но и получаем от ардуино.
        +3
        Третий байт, наверное, A xor B?
          0
          Именно так)
            0
            A xor B ловит в худшем случае инверсию только одного бита — существует ситуация инверсии двух бит, когда XOR дает ложноотрицательный результат: Если перевернуть A[0] и B[0], A xor B останется прежним.

            По сути, этот контроль целесообразен только на этапе передачи данных от конвертера FT232 до чипа, ведь данные, которые идут по USB, уже контролируются при помощи CRC, который является более сильным — ловит все одинарные и двойные ошибки.

              0
              Скажу честно, на момент первого проектирования вопрос контроля передаваемых данных не стоял, в худшем случае мы вывели не то значение для оператора и запустили бы повторный подсчет.
              А контроль четности был больше сделан для себя, из интереса)
                0
                Меня этот вопрос заинтересовал с позиции экономичности / минималистичности кода / более широкого использования аппаратуры контроллера — ведь в USART уже существует контроль четности, с той же стойкостью по пессимистичному сценарию (гарантированно ловит ровно одну инверсию), который реализован аппаратно, а значит, «дешевле» применения дополнительного xor-байта.

                Тем более, появление наводки амплитудой, достаточной для инверсии бита на коротенькой дорожке означает работу в условиях дичайших помех — от таких наводок и дисплей сам по себе врать начнет.
        +2
        Я тоже за ряды Фурье. Если взять одномерный массив пикселей вдоль стопки, то будет виден явный пик на частоте чередования крышек вдоль стопки.
          –2
          Я все опишу в следующей статье) Все встанет на свои места)
            +7
            Мне кажется, что статья все-таки быстро закончилась.
          +1
          фурье не дает пространственной локализации — в итоге чтобы точно понять, где именно в кадре начинается и где заканчивается периодичность (то есть где начало и гле конец стопки), придется делать фурье много раз над буферами с почти 100% перекрытием. Тем более, что нам спектральные составляющие ни к чему, нужен только период основной частоты — можно использовать автокорреляцию, пройдясь слева направо несколькими пробными лучами, и на каждом из них а) найти период по максимуму АКФ, б) найти примерно начало и конец, свернув луч с одним периодом синтезированной синусоиды найденного периода в) синтезировать N периодов синусоиды (N = 45..55) и свернуть по очереди с диапазоном между началом и концом (может быть покачать слегка вправо-влево в поисках максимума для данного N) г) выбрать N, для которого КФ максимальна, д) усреднить или статобработать (убрать выбросы, взять медиану итд) результат по всем лучам — это первое, что приходит в голову, хотя может быть метод будет вычислительно затратным из-за множественных КФ
          +2
          а еще можно использовать весы
            +1
            Весы не вариант.
            Я в статье писал о том что из-за процесса уплотняющей резинки ее толщина как и вес может варьироваться. На весе одной крышке разницы не заметим. Но вот когда из 50, то вес может отклоняться прилично.
            +7
            Этакое бюджетное решение у вас получилось (я ни в коем случае не говорю, что это плохо, просто всё что «завод» и «промышленность» у меня ассоциируется с соответствующими камерами, ПЛК, но уж никак не с АТмега и Ардуиной). С другой стороны если работает и задачу решает — то почему бы и нет.

            Как альтернатива — вы могли взять промышленную смарт-камеру, типа такой:
            image
            и практически сразу получить решение. Компьютер у неё внутри — такая камера самодостаточна. Плюс есть входы-выходы. Там довольно удобная среда, где вообще ни строчки кода писать не надо:
            image
            В вашем случае освещение довольно приличное — даже простой детектор «из коробки» в авторежиме все крышки уверенно находит (а если не найдёт, там минимально параметры подкрутить можно, либо препроцессинг добавить).
            Я к NI отношения не имею, просто работаю с их оборудованием — в вашем случае работы на несколько часов. Но бюджетным такое решение, конечно не будет.
            Помимо NI смарт камеры есть у Cognex, но там программная среда не так удобна.
              +2
              По правде говоря моя вина есть в том что я не изучил предложения рынка…
              И бросился сразу в огонь и воду.
              Если честно меня заинтересовало Ваше предложение по поводу смарт-камеры.Спасибо за Совет)
                0
                Делай сам, так интереснее ;)
                +3
                Ну как же на несколько часов, если большая часть работы в виде монтажа и подбора освещения никуда не денется. То, что автор несколько ночей парился с алгоритмом скорее всего просто неудачный выбор С++ как языка прототипирования, в нем цикл проб и ошибок довольно затянутый.
                А так работы с такой камерой не меньше, зато вместо зарплаты собственному работнику бабло уходит солидным дядям с солидным vendor lock-in. В общем, мечта откатчиков из отдела закупок.

                И чтобы два раза не вставать, по-моему освещение диодами, покрытыми матовым стеклом и расположенными слева-сбоку, сработало бы лучше — на фото свет бьет прямо в промежуток, ухудшая контраст, а здесь бы подошло рассеянное освещение, аналог микроскопии темного поля.
                  +1
                  Возни с такой камерой сильно меньше по многим причинам (это утверждение базируется на моём многолетнем опыте — я программировал довольно много таких систем и так и сяк). Ну, окей — скажем при наличии некоторого опыта там программной части реально на несколько часов работы.
                  Я на досуге сделаю обзор промышленных камер (скорее даже два — один по обычным камерам, а второй по смартам), и всё встанет на свои места. В веб камере нет ничего плохого (тем более, что современные вебки весьма неплохие и недорогие), но у пром. камер есть свои приятные плюшки.
                    +2
                    Да штуки хорошие, но цены — 1800 евро за младшую модель 640х480, это около месяца работы специалиста в России. За половину этой суммы и неделю времени можно сделать решение из бытовой вебки и raspberry pi в едином корпусе, если хочется чего-то типа втыкнул-и-забыл. Вот когда нужен объектив нормальный, наверное нужно будет раскошелиться. Я, кстати, так делал, делал контроль изображения солнечного имитатора из вебки, дискеты (светофильтра), скотча и пластилина. Провел нужные исследования и забил. Сначала хотели закупить промышленные камеры, но я узнал все так за несколько часов — а камер по-моему и через полгода так и не было из-за бюрократии.
                      0
                      Вы правы. Rapsberry это идеальный вариант.
                      Я думаю что следующим шагом будет все таки замена, сравнительно дорогих неттопов на Raspberry. Компактно, производительно и быстро заменяемо
                        0
                        Тут вы правы. Я, кстати, наблюдаю такую тенденцию, что на россиийских заводах делают (стараются во всяком случае) такие штуки самостоятельно (и лучше себя, любимого в общем-то никто не сделает), а вот в европе видимо невыгодно держать на заводе специалиста «широкого профиля», поэтому такие системы заказывают на стороне «под ключ». Ну а если в систему стоимостью несколько десятков тысяч евро поставить вебку с малинкой, то конечный заказчик… ну в общем будет несколько недоволен — он ожидает некороый уровень надёжности (ну или солидности что ли). Поэтому и ставят дорогие комплектующие — их стоимость размывается на стоимость всей системы. Ну плюс ещё есть определённые гарантии от производителя камер, фреймграбберов и т.д. — если конвейер встанет, то камеру можно заменить, а вот если если вебка вышла из строя и уже снята с производства, то придётся мудрить с новой моделью. Свой спец быстро справится с проблемой, а вот обновление старой системы, особенно вне гарантийного срока, может вылиться в круглую сумму.
                          0
                          >Я, кстати, наблюдаю такую тенденцию, что на россиийских заводах делают (стараются во всяком случае) такие штуки самостоятельно (и лучше себя, любимого в общем-то никто не сделает), а вот в европе видимо невыгодно держать на заводе специалиста «широкого профиля», поэтому такие системы заказывают на стороне «под ключ». Квалифицированная рабочая сила сильно дешевле высокотехнологичных продуктов, особенно импортных и особенно сейчас. Это плохо, конечно. Но тут что есть то есть. Я сомневаюсь, что завод по производству крышек для банок в Германии в принципе способен себе позволить держать специалиста по машинному обучению уровня siemdi даже если бы хотел. Хотя надо сказать, по моему опыту в США бизнесмены попроще, чем в Европе, так что дело не только в ненастроенной российской экономике, но и немецком менталитете. Хотя может я как фрилансер-одиночка просто с очень продвинутыми и бедными общаюсь — но в Европе таких в разы меньше все равно. >Ну а если в систему стоимостью несколько десятков тысяч евро поставить вебку с малинкой, то конечный заказчик… ну в общем будет несколько недоволен Ну конечно это чисто «для себя», даже в России. Но можно заказать какую-нибудь OEM вебку и запаковать ее в корпус, а разницу положить в карман. У меня есть пример еще хлеще — нам требовались конкретные диоды с диаграммой направленности 120 градусов, а не 30; на уровне полностью рабочего прототипа это решается спиливанием эпоксидной линзы (итоговая цена сто рублей за пучок), но этот колхоз в космический прибор не поставишь, так что требовалась официальная доработка. Завод-изготовитель заломил по-моему два миллиона за ОКР, а других сертифицированных изготовителей и нет. А с такой ценой можно было уже начинать думать о японских лампочках… Правда, с их паранойей по поводу военного применения это по-моему тоже не взлетело и бабло ушло в Томск. В общем, несколько миллионов за то, что можно в гараже сделать за рубль пучок — и при полной функциональной эквивалентности! А есть и обратный пример, когда реверс-инженеринг раствора для напыления родия сэкономил кучу денег.
                            0
                            Соглашусь с AndreyDmitriev и megalol разработать самому в разы быстрее. Качество и надежность конечно вопрос очень важный… но опять-таки если хорошо подумать и грамотно спроектировать то можно быть на уровне готовых решений. Еще один очень важный вопрос- СТОИМОСТЬ. Стоимость сторонних решений на несколько порядков выше чем стоимость готового «Под ключ». К примеру Raspberry + БП + WebCam + LCD || LED + Человеко часы = 600 уе. а стоимость готового решения 2к уе. при этом всем если в «своем» сломается камера или флешка в распе или что-то еще, его легко заменить и это все, а вот если в «под ключ» что-то сломается то в связи со своей «моноблочностью» заменить его будет стоить все равно 2к уе. (не важно, отвалился проводок, или сгорел проц).

                            В общем на просторах стран СНГ все очень сильно отличается от остальных стран. И не всегда в худшую сторону.
                            Не буду раздувать споры по поводу выше написанного, скажу лишь что это чисто субъективные выводы из ситуации с которой столкнулся лицом к лицу
                        +1
                        ждём обещанного обзора
                          0
                          Я не забыл — обзор уже в процессе написания.
                    –1
                    А почему бы не считать по весу стопки? Неужели такая сильная разница в весе крышек?
                      +1
                      вопрос отпадает — увидел коммент
                      +3
                      Это делается гораздо проще. С одного края в стопку с крышками подаётся «щелчок» от пьезы. Сколько придёт отражённых импульсов, разных по амплитуде, столько и крышек. Пьеза, вибродатчик и микроконтроллер.
                        0
                        Как говорится «на вкус и цвет… фломастеры разные». Каждый видит решение данной проблемы основываясь на своем опыте и знаниях.
                          +3
                          Согласен. Просто предложил другое решение. Сейчас уровень электронщиков так упал, что им проще поставить целый компьютер делать простую работу, с которой справятся и пара транзисторов. Я помню, как в институте мы собирали прибор для подсчёта малька в проточной трубе для рыбозавода. Причём, малёк это не неподвижная стопка крышек с хорошим освещением… Он хаотично движется по всем осям. Кроме того, прибор в реальном времени отделял тела мальков от мусора, листиков, водорослей. Там стояла советская камера, объектив от «Зенита», а вся электроника была собрана на транзисторах и примитивных логических микросхемах.
                          Мне вспоминается история, которую рассказывал нам наш профессор, работавший в советское время на оборонку… Когда, американцы начали разбирать угнанный к ним предателем советский самолёт, они очень удивлялись. Вся электроника была построена на лампах. Они тратили кучу средств и сил, чтобы охладить транзисторные цепи в своих самолётах, а тут какие-то русские всё так гениально придумали. Лампе то температура нипочём.
                          Потом профессор смеялся и добавлял: у нас просто не было тогда транзисторов, вот и приходилось на лампах извращаться)
                            0
                            Дело не только в уровне электронщиков. Прогресс-то тоже на месте не стоит — если четверть века назад пришлось бы «мудрить» аналоговое решение, то теперь зачастую в этом просто нет необходимости. В конкретном данном случае можно собрать систему и на рассыпухе — но времени придётся положить уйму. Это как программировать на ассемблере (да вы и сами предлагаете микроконтроллер).
                            Что касается пьезы — тут можно налететь на грабли с переотражениями сигнала в пачке и с плохим прижимом (ведь крышечки там с резиновыми прокладками в пачке). Я плохо себе представляю вибродатчик, который будет устойчиво ловить 50 импульсов из такого пакета. Тут придётся воспользоваться чем-то типа головки утразвукового дефектоскопа — а эта штука может оказаться сильно недешёвой. Решение с камерой тут практически оптимально и весьма бюджетно.
                          0
                          А переотражения как отделять в такой периодичной структуре?
                          +2
                          На что только не пойдут люди лишь бы случайно не продать лишнюю крышечку :)
                            +3
                            Полагаю, что заплатив за пятьдесят крышечек, а получив лишь сорок девять, вы уже не будете так, хммм, «благожелательно» настроены :)

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое