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 № 1Ok, 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