Неточное определение формы прямоугольника с одним срезанным углом

У меня есть видеопоток с камеры с ручным управлением, расположенной сверху и обращенной к объекту на столе. Объект примерно имеет форму равнобедренной трапеции с короткой стороной, всегда обращенной вверх, но он не всегда идеально выровнен и имеет отверстия.

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

введите здесь описание изображения

Я использую opencv и могу извлечь контур объекта. (черный — фон, серый — контур/выпуклая оболочка, темно-серый — ограничивающий прямоугольник, а точки в кружках — точки контура)

введите здесь описание изображения

Таким образом, вы можете сказать, что я пытаюсь определить, когда контур выглядит как этот 5-сторонний многоугольник. Который можно описать как прямоугольник с треугольником, вырезанным из любого из верхних углов введите здесь описание изображения

Проблема в том, что объект не является идеальной трапецией, не идеально выровнен и имеет случайные отверстия, из-за чего извлечение контура приобретает более сложную форму. например: введите здесь описание изображения

Он изменился, но форма все еще похожа на 5-сторонний многоугольник. Из-за отверстий в объекте контур может иметь некоторые другие сложные формы, поэтому мне нужно, чтобы соответствие формы было как можно более точным, но при этом надежным, чтобы приспособиться к несовершенной форме.

Я не могу просто использовать соотношение пикселей объекта к пикселям фона из-за отверстий, и мне трудно программно идентифицировать форму исключительно по положению точек контура, потому что это не точная форма. Я предполагаю, что сопоставление шаблонов и сопоставление форм не будут идеальными, потому что размер формы неизвестен, и из-за других форм контур может быть (например, треугольник с вершиной, обращенной влево)

Мне нужно определить, что камера отошла от объекта, как только это произойдет, потому что впоследствии это отбрасывает мою обработку.


person Ta946    schedule 02.08.2018    source источник


Ответы (1)


Отвечая на мой вопрос, я нашел решение, и, надеюсь, это может кому-то помочь.

Я решил это в 2 шага. 1) изменить форму контура до приближенной менее сложной формы (более коллинеарные точки и прямые углы). 2) определить, является ли эта новая форма такой же, как тот 5-сторонний многоугольник, который представляет собой прямоугольник с треугольником, вырезанным из одного из верхних углов.

1) упрощение контура:

из точек контура я сортирую точки по их значениям x и группирую их, если они ближе, чем 10% ширины изображения (в основном просто группируя точки, которые близки по оси x, игнорируя их значения y на данный момент), затем заменяю значения x каждой точки со средним значением значений x группы. Затем я делаю то же самое для значений y, группируя с 10% высоты изображения. Это попытка сделать точки коллинеарными вдоль осей x и y, чтобы упростить форму. Это работает для меня, потому что я пытаюсь найти точки для формы, которая является почти вертикальной/горизонтальной (не будет работать с угловыми формами)

введите здесь описание изображения

2) найти только треугольник в верхнем левом или правом углу:

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

Отфильтруйте контуры, площадь которых меньше 5% площади изображения, чтобы удалить шум. Если обнаружено более 1 контура, это не наша желаемая форма.

Когда мы находим только 1 контур, используем аппроксимацию контура, чтобы удалить любые дефекты. Результатом должен быть контур из 3 точек (который представляет собой треугольник), если количество точек аппроксимированного контура не равно 3, это не наша желаемая форма.

Затем мы проверяем 3 точки контура, «угловая» точка должна лежать либо в левом, либо в правом углу ограничивающей рамки, значение y «средней» точки должно быть равно значению y верхней стороны ограничивающего прямоугольника. поле, а значение x "боковой" точки должно быть таким же, как и у угла. Если не все 3 точки удовлетворяют этому условию, это не наша желаемая форма.

Наконец, я проверяю угол между боковой и средней точками относительно оси x просто для проверки работоспособности, чтобы убедиться, что угол находится в диапазоне от 10 до 80 градусов, поскольку я ожидаю наклона.

person Ta946    schedule 05.08.2018