Нахождение дефектов обводящего контура — КиберПедия 

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Нахождение дефектов обводящего контура

2022-07-06 16
Нахождение дефектов обводящего контура 0.00 из 5.00 0 оценок
Заказать работу

 

Теперь найдем так называемые дефекты обводящего контура. Создадим очередной массив-объект для хранения информации, на сей раз в формате MatOfInt4, под названием convDef. Этот массив хранит данные сгруппировано по четыре числа формата Integer. Используется этот формат потому что для описания каждого дефекта метод выделяет по четыре величины: start, end, defect, depth.

 

Рис. 20. Схематичное изображение возвращаемых значений метода Imgproc.convexityDefects

 

Для полноценного описания в данном проекте достаточно точек start, end и defect. Для удобства создадим так же обычный одномерный массив типа Integer и назовем его cdList. Методом Imgproc.convexityDefects выделим массив дефектов обводящего контура. Метод имеет три атрибута: внутренний, контур, обводящий контур, и объект в который будет записываться информация, convDef. Но формат IntOfMat4 неудобен для использования и не принимается методами рисования, поэтому переведем всю информацию в обычный массив data методом convDef.get(0).toList. Также создадим массив cdList, который наполнится натуральными числами от нуля до количества дефектов умноженное на четыре. Теперь информация записана так: в нулевом элементе находится число, характеризующее start первого дефекта, в первом - end первого дефекта, во втором defect первого дефекта, в третьем - depth первого дефекта, в четвертом - start второго дефекта и так далее. Теперь создадим три массива типа Point, в одном из них будут храниться все точки start, во втором все точки end, а в третьем - все точки defect.

После этого можно сразу создать цикл, рисующий все точки из массивов на экране, на этот раз методом Imgproc.circle и посмотреть на соответствующий результат.

 

Рис. 21. Вид программы с найденными экстремальными точками

 

Фильтрация точек дефектов

 

Прежде чем приступать к анализу найденных точек, необходимо отфильтровать результаты, так как не все из них несут полезную информацию. Нужно, во-первых, исключить все точки defect, образующие с соседними точками start и end слишком большой угол, так как даже максимальный угол отклонения между указательным и большими пальцами не может превышать π/2 и эти точки не несут в себе информации о положении пальцев. Во-вторых, нужно исключить точки start, которые находятся слишком близко друг к другу, так как алгоритм может ошибочно выделять несколько рядом стоящих точек и один палец будет считаться за два. И, в-третьих, нужно исключить точки, находящиеся в непосредственной близости к краю изображения, ведь, как показывает практика, алгоритм часто дает просчеты и в этих областях. Для работы с каждым из трех массивов точек создадим еще по два массива - x и y координат соответственно. Назовем их соответственно startX, startY,endX, endY, defectX, defectY, и присвоим им тип double. Наполнить их информацией о соответствующих координатах каждой точки можно с помощью цикла по всем индексам точек. Далее условными операторами будем производить фильтрацию. Сделаем внутри цикла оператор if с тремя условиями прохождения фильтрации. Если координаты точек defect и start с неким порядковым номером будут отвечать заданным условиям, то эти точки будут записаны в новые массивы, названные defectFiltered и startFiltered. Эти условия будут объединены как логические элементы «и», то есть присвоение случится только если все три условия одновременно будут выполнены.

Первое условие - это достаточно малая величина угла между двумя точками start и точкой defect, находящейся между ними. В java и OpenCV не существует стандартной функции для нахождения угла, описанного тремя точками, поэтому придется сделать ее самостоятельно. По теореме косинусов можно найти любой угол треугольника, если известно три его стороны. Поэтому построим воображаемый треугольник из точекstart,defectиendи вычислим длины его сторон, зная координаты точек. Затем применим теорему косинусов и запишем значение угла в переменную angle. Теперь можно создать первое условие - точка будет записываться в конечный массив только когда значение угла меньше определенного значения. Пока остановимся на значении π/2.

Второе условие - это достаточно большое расстояние между точками startи end. Если расстояние между двумя точками будет меньше определенного значения, то соответствующая точка start должна записаться в конечный массив, поэтому с помощью цикла сравним каждую точку start [i] с точкой end [i]. При сумме квадратов координат больше определенного значения, точка записывается в конечный массив.

Третье условие наиболее просто в реализации: необходимо чтобы каждая координата находилась в определенном интервале, это можно реализовать с помощью оператора «и» (значение должно быть больше нижнего значения и, в то же время, меньше верхнего значения). Выберем значения отступов по 30 пикселей с каждого края экрана.

 

Рис. 22. Вид программы после фильтрации точек дефектов

 

Обработка результатов

 

Итак, теперь мы имеем достаточно много информации о положении руки: каждый из пяти пальцев обозначен точкой из массива, причем номер пальца, считая слева направо, соответствует номеру элемента массива. Четыре промежутка между пальцами так же обозначены точками из другого массива. В дальнейшем, обрабатывая эту информацию, можно получать разнообразные результаты. Для примера усовершенствуем код, чтобы программа выводила на экран количество не прижатых пальцев, и, если пальцы соединены, меняла цвет внутреннего контура на красный. Информация о количестве пальцев уже присутствует в программе - это размер массива startFiltered. Преобразуем ее в тип данных String и выведем на экран методом Imgproc.putText. Метод для вычисления углов тоже уже был создан в процессе произведения фильтрации, поэтому воспользуемся им, только на этот раз суммируем все углы циклом и выведем их среднее арифметическое. Среднее арифметическое теперь снова можно сравнить с порогом, только теперь при его значении меньше порога объект класса Scalar, отвечающий за цвет внутреннего контура, будет менять свои атрибуты. Конечный результат можно наблюдать на рис. 23.

 

Рис. 23. Конечный вариант программы

 


 


Поделиться с друзьями:

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.008 с.