2017-10-12 4 views
2

J'ai marqué en vert une pièce (vert) dans l'image de la pièce et je passe une ligne au-dessus. Comment puis-je trouver les points x, y qu'ils croisent? Merci d'avance.points d'intersection de la ligne et l'objet - Matlab

enter image description here

clc; 
clear; 

I = imread('coins.png'); 
BW = im2bw(I); 

BW_filled = imfill(BW,'holes'); 

boundaries = bwboundaries(BW_filled); 
figure,imshow(I) ; 

hold on; 

b = boundaries{1}; 
plot(b(:,2),b(:,1),'g','LineWidth',1); 

h = imline; 
myPoints = wait(h); 
delete(h) ; 
x1 = round(myPoints(1,1),2); 
y1 = round(myPoints(1,2),2); 
x2 = round(myPoints(2,1),2); 
y2 = round(myPoints(2,2),2); 

%plot line 
x=[x1 x2]; 
y=[y1 y2]; 
plot(x',y','r') 

Répondre

4

Trouver des intersections entre la ligne et le cercle.

k = abs((b(:,2)-x1) * (y2-y1) - (b(:,1)-y1) * (x2-x1)); 
[~,idx] = sort(k); 
scatter(b(idx(1:2),2), b(idx(1:2),1)) 

Ceci est une méthode simple. Il capture tous les points du cercle et vérifie chacun d'eux par rapport au line equation.

Idéalement, nous avons (x-x1)/(x2-x1) = (y-y1)/(y2-y1), ou dites d = (x-x1)/(x2-x1) - (y-y1)/(y2-y1) puis d=0 est la situation idéale. Lorsque le point s'écarte de la ligne, d augmente en valeur absolue. Par conséquent, le plus petit d fait référence au point le plus proche de la ligne. Dans ce cas, il devrait y avoir deux points, donc je cherche les deux plus petites valeurs.

Un problème possible pourrait être la précision. Lorsque les points sur le cercle sont éloignés l'un de l'autre, il est possible que les deux points les plus proches se trouvent au même point d'intersection, laissant l'autre non détecté. Un contrôle plus compliqué s'appliquerait, par exemple choisir les quatre plus proches et ensuite distinguer. Cependant, vous pouvez éviter cela en conservant une densité de points élevée.


EDIT: ajouté une telle vérification.

k = abs((b(:,2)-x1) * (y2-y1) - (b(:,1)-y1) * (x2-x1)); 
[~,idx] = sort(k); 

f4x = b(idx(1:4),2); 
f4y = b(idx(1:4),1); 
choose = [1,2;1,3;1,4;2,3;2,4;3,4]; 
dist = sqrt((f4x(choose(:,1))-f4x(choose(:,2))).^2 + .... 
    (f4y(choose(:,1))-f4y(choose(:,2))).^2); 
[~, idx2] = sort(dist,'descend'); 

px = b(idx(choose(idx2(1,:),:).'),2); 
py = b(idx(choose(idx2(1,:),:).'),1); 

scatter(px, py) 

Quelques résultats

>> idx(1:4) 

ans = 

    28 
    112 
    113 
    29 

>> dist 

dist = 

    55.7853 
    55.5428 
    1.0000 
    1.0000 
    55.5428 
    55.3173 
+0

est-il un moyen de le rendre plus sensible? par exemple en ajoutant une distance entre tous ces points – hsi

+0

@ user2676173 Oui, vous pouvez ajouter une vérification de la distance relative entre chacun des quatre premiers points. Recherchez la première paire de deux une distance distincte à part. – Yvon

+0

Est-il possible de remplacer le scatter par l'impoint? – user2916044