2017-04-03 2 views
0

J'ai tracé une liste de coins que j'ai obtenus en utilisant la détection Harris Corner.Comment trouver les 4 points les plus éloignés de ce rectangle

enter image description here

Maintenant, je dois trouver le 4 favorise les points qui représenteront les coins du rectangle

Je sais que je peux obtenir les deux coins en diagonale supérieure et inférieure en utilisant

max(C); 
    min(C); 

Où C est une matrice n lignes avec une colonne pour x et y comme

x y 
    0 1 
    2 3 
    4 5 
    6 6 

Mais comment puis-je obtenir les deux autres coins?

Je pensais que je pouvais tourner la matrice et l'utilisation min et max à nouveau, mais bien sûr, que me renvoie une énorme matrice colonne de n (et je veux une matrice colonne 2)

Je me sens comme la réponse est évidente , mais je suis découpage :(

+1

Que représentent les lignes de 'C'? Coordonnées sur la limite? Points dans la zone blanche? La zone noire? Utiliser 'min' et' max' comme vous le faites est très dangereux, car il n'y a aucune garantie que les valeurs retournées appartiennent au même coin. Votre entrée est une image en noir et blanc, ou ce 'C'? Souhaitez-vous télécharger les entrées brutes disponibles (que ce soit une image BW ou une matrice de taille limitée)? –

+0

Les rangées de C sont les coordonnées du résultat de la détection d'angle de Harris, les rangées de C sont les coordonnées des points bleus dans l'image que j'ai affichée. Donc je suppose que je n'ai aucun point, si max renvoie la valeur max de chaque col. : '( –

+0

Voici un lien vers les points de données (bien plus grand que ce que j'ai réalisé) http://jmp.sh/v/8lAytDc00UrOa17Z6Oo6 –

Répondre

1

Je ne sais pas comment est limitée la méthode suivante, mais cela a fonctionné pour un exemple similaire à la vôtre:

% detect possible corners 
points = detectHarrisFeatures(BW); 
C = points.Location; 
% compute par-wise distances between all points 
D = pdist2(C,C); 
p = zeros(1,4); 
% compute maximum distance to find first pair 
[m,idx1] = max(D,[],2); 
[~,idx2] = max(m); 
idx1 = idx1(idx2); 
p(1:2) = [idx1, idx2]; 
% add first pair distance to distance matrix so the next pair will be 
% distant from this pair as well, and compute max distance again 
D = bsxfun(@plus,D,sum(D([idx1 idx2],:),1)); 
[m,idx1] = max(D,[],2); 
[~,idx2] = max(m); 
idx1 = idx1(idx2); 
p(3:4) = [idx1, idx2]; 
% plot 
imshow(BW); 
hold on; 
plot(C(:,1),C(:,2),'g.'); 
plot(C(p,1),C(p,2),'rx','LineWidth',2); 

enter image description here

une autre option est d'utiliser les fonctions FEX comme Polygon simplification et Decimate Polygon, et de définir le nombre de vertex désiré à 4.

+0

NB: Ceci utilise la Computer Vision Toolbox (c'est-à-dire 'detectHarrisFeatures'). L'OP peut ne pas avoir accès à cela. – rayryeng

+0

vrai. c'était juste pour obtenir un exemple de points possibles comme le PO ont déjà. – user2999345

+0

D'accord! Je l'aime encore malgré çà. J'aurais abordé cela avec Harris Corners moi-même. – rayryeng

1

Une autre solution de rechange, si vous ne voulez pas utiliser la détection d'angle:

im=zeros(100); 

im(40:70,30:80)=1; 
im=imrotate(im,rand*100); 

[x,y]=find(im); 
x=x+2*randn(size(x)); 
y=y+2*randn(size(y)); 
X=[x(:),y(:)]; 

d=ceil(pdist2(X,X)*10)/10; 

[a,b]=find(d==max(d(:))); 

xm=x(a); 
ym=y(a); 

figure,plot(x,y,'ks') 
hold on, plot(xm,ym,'ro','MarkerSize',12,'MArkerFaceColor','r') 
axis image 

enter image description here

+0

NB: 'pdist2' nécessite la boîte à outils Statistiques. – rayryeng