Хорошо, вот идея, как вы могли бы сделать это:
Если вы знаете центр круга и радиус, также если ваш контур получен с помощью 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