2011-10-16 19 views
5

Dopo aver scattato una foto con un telefono Android, desidero identificare un oggetto nell'immagine facendo clic su di esso ad esempio. Eventuali oggetti in genere in caso di:
1. Righello
2. persona
3. matita
Sto usando Android precompilati-OpenCV versione 2.3.1 e ho cercato di fare clic nell'oggetto righello e floodFill a segnare esso, ma se i contorni non sono chiusi, l'intera immagine verrà riempita.
a) Ho anche provato a fare clic su oggetto righello e andare a sud, nord, est, ovest per cercare dove sono i bordi e raccogliere queste coordinate, ma ho incontrato problemi pesanti lì (non chiedere).rilevamento oggetti android opencv

Domande:
1. È possibile chiudere i contorni in qualche modo per riempire semplicemente l'oggetto desiderato?
2. Quello che voglio REALMENTE trovare sono le coordinate della parte inferiore E l'altezza di (ad esempio il righello).
QUALSIASI altra soluzione è apprezzata. Come lo realizzeresti?

Aggiornamento: Ho risolto il problema con a) e uso questo approccio al momento (non sono contento). Ho anche provato l'approccio di Entreco, ma sembra non dare la soluzione desiderata ormai.

risposta

6

Non so se l'hai provato, ma in genere, puoi ottenere risultati migliori elaborando l'immagine per prima.

1) Applicare GuassianBlur per rimuovere il rumore

2) Applicare AdaptiveThreshold -> per convertire l'immagine al funzionamento in bianco e nero

3) Applicare Dilate, per riempire le fessure

Utilizzando impostazioni diverse per AdaptiveThreshold e l'operazione Dilate, potresti essere in grado di ottenere contorni chiusi ...

Un esempio che ho usato è simile al seguente:

// 1) Apply gaussian blur to remove noise 
Imgproc.GaussianBlur(mGraySubmat, mIntermediateMat, new Size(11,11), 0); 

// 2) AdaptiveThreshold -> classify as either black or white 
Imgproc.adaptiveThreshold(mIntermediateMat, mIntermediateMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 5, 2); 

// 3) Invert the image -> so most of the image is black 
Core.bitwise_not(mIntermediateMat, mIntermediateMat); 

// 4) Dilate -> fill the image using the MORPH_DILATE 
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_DILATE, new Size(3,3), new Point(1,1)); 
Imgproc.dilate(mIntermediateMat, mIntermediateMat, kernel); 
+0

Grazie mille per la risposta @Entreco. Proverò questo e riferirò. – gartenabfall

+0

@Entreco possiamo disegnare un rettangolo attorno ai contorni chiusi –

+0

non è rilevare il bordo se oggetto rettangolo nero. –

Problemi correlati