Open CV Contours - Разделение вогнутого многоугольника на несколько выпуклых - PullRequest
0 голосов
/ 13 июля 2020

У меня есть изображение ниже в массиве numpy

enter image description here

I want to

  1. separate the blocks into individual contours or any coordinate representation.

  2. I then want to transform any concave polygons into multiple convex polygons.

Like this

enter image description here

So far I've managed to isolate each block into contours with opencv... but is there an easy way to split the L shape objects into two or more square blocks. The new contours of each shape can overlap if needed.

It may also be the case that I have an Image like this which does not have such straight lines.

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

Я использовал cv2.approxPolyDP, чтобы нарисовать форму, но опять же они вогнутые, и мне нужно, чтобы они расщеплялись.

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Один из способов, который я могу придумать, это для каждого контура сначала найти его выпуклую оболочку. См. Эту ссылку

Теперь найдите точки дефекта между контуром и его выпуклой оболочкой. См. Ссылку

Теперь, используя данные о расстоянии дефектов, найти точку с максимальным расстоянием. Эта точка будет точками, где 2 объекта соединяются в форме L. Теперь из этой точки проведите перпендикулярную линию к касательной к контуру в этой точке и снова найдите контуры. Результирующие контуры будут 2 контурами для формы L.

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

0 голосов
/ 13 июля 2020

Хорошо, спасибо, Рахул за ваш ответ.

В итоге я нашел пакет, который помог мне трангулировать полигоны, который решил мою проблему.

скачать с:

pip install sect 

Затем:

from sect.triangulation import constrained_delaunay_triangles

Возьмите контуры, созданные openCV - это сгенерирует их, как показано ниже.

enter image description here

Then "smooth" the colours so there are less of them. I've used this

epsilon = 0.005 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)

then run it through sect

constrained_delaunay_triangles([tuple(x) for x in approx.squeeze()])

The output splits the polygons into triangles removing ALL concave polygons totally.

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

...