/ / Kontury w OpenCV? - c ++, obraz, wideo, opencv

Kontury w OpenCV? - c ++, obraz, wideo, opencv

Narysowałem koło na moim obrazie i chcę znaleźć punkty, w których przecinają się okrąg i konkretny kontur.

W jaki sposób chciałbym znaleźć punkty przecinające się między konturem a okręgiem?

Dzięki

Odpowiedzi:

2 dla odpowiedzi № 1

Ok, oto pomysł, jak możesz to zrobić:

Jeśli znasz środek okręgu i promień, także jeśli uzyskasz kontur, który masz CV_CHAIN_APPROX_NONE : Translates all the points from the chain code into points. wtedy możesz po prostu przejść przez wszystkie punkty sekwencji i zobaczyć, które z nich mają odległość od środka okręgu równą promieniowi. (może być więcej niż 2 przecięcia)

Jeśli twój kontur nie jest uzyskany zCV_CHAIN_APPROX_NONE, wtedy możesz sprawdzić każdą parę 2 punktów w sekwencji i przetworzyć te, które mają jedną na zewnątrz (odległość wyższa niż promień) i jedną wewnątrz (odległość niższa niż promień) lub może na kole (szczęśliwy przypadek). Wtedy będziesz wiedział, że punkt przecięcia znajduje się pomiędzy tymi 2 punktami i możesz go znaleźć przez rozwiązanie 2 równania:

-point jest na linii zbudowanej przez 2 punkty

-point znajduje się w pewnej odległości od środka okręgu równego promieniowi

Jeśli przypadkiem nie wiesz, gdzie jest to koło lub jego promień, możesz uzyskać jego kontur cvFindContours a następnie przejść przez każdy zestaw 2 punktów od drugiego konturu i użyć:

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

W szczególności, jeśli argument measure_dist jestniezerowe, funkcja zwraca odległość do najbliższej krawędzi konturu; ta odległość wynosi 0, jeśli punkt znajduje się wewnątrz kontur i dodatni, jeśli punkt znajduje się na zewnątrz. Jeśli argument measure_dist ma wartość 0, wówczas wartości zwracane są po prostu + 1, - 1 lub 0 w zależności od tego, czy punkt znajduje się wewnątrz, na zewnątrz, lub na krawędzi (lub wierzchołku), odpowiednio. Sam kontur może być sekwencją lub n-by-1 dwukanałowa matryca punktów.

Z tego otrzymasz 2 punkty, jeden na zewnątrz, jeden wewnątrz lub na kole, a odległości każdego z nich od koła. Znowu wystarczająco dużo informacji, aby obliczyć dokładny punkt.

PS: Możesz zoptymalizować algorytm, najpierw sprawdzając, czy prostokąty ograniczające dwóch konturów przecinają się co najmniej. Możesz je zdobyć cvMinAreaRect2