Контуры в OpenCV? - PullRequest
       1

Контуры в OpenCV?

2 голосов
/ 10 ноября 2011

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

Как мне найти точки пересечения между контуром и окружностью?

Спасибо

1 Ответ

2 голосов
/ 10 ноября 2011

Хорошо, вот идея, как вы могли бы сделать это:

Если вы знаете центр круга и радиус, также если ваш контур получен с помощью CV_CHAIN_APPROX_NONE : Translates all the points from the chain code into points. тогда вы можете просто пройти все точки последовательности и посмотреть, какие из них имеют расстояние от центра круга, равное радиусу (может быть более 2 пересечений)

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

-точка находится на линии, построенной из 2-х точек

-точка находится на расстоянии от центра круга, равном радиусу

Если по какой-либо причине вы не знаете, где находится круг или его радиус, вы можете получить его контур с помощью cvFindContours, а затем пройти каждый набор из 2 точек от другого контура и использовать:

    double cvPointPolygonTest(
                  const CvArr* contour,
                  CvPoint2D32f pt,
                  int measure_dist
                  );

В частности, если аргумент measure_dist не равен нулю, функция возвращает расстояние до ближайшего края контура; это расстояние равно 0, если точка находится внутри контур и положительный, если точка находится снаружи. Если аргумент measure_dist равен 0, то возвращаемые значения просто + 1, - 1 или 0 в зависимости от того, находится ли точка внутри, снаружи, или на ребре (или вершине) соответственно. Сам контур может быть последовательностью или Двухканальная матрица точек n-на-1.

Отсюда вы получаете 2 очка, одно снаружи, одно внутри или на круге, а также расстояние каждого до круга. Опять же, достаточно информации, чтобы вычислить точную точку.

PS: Вы можете оптимизировать алгоритм, сначала проверив, пересекаются ли хотя бы ограничивающие прямоугольники двух контуров. Вы можете получить их с cvMinAreaRect2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...