2011-11-15 17 views
11

Mi scuso se questa domanda è già stata trattata in questo sito, ma non riesco a trovare una risposta immediata. Sto creando un'app per Android che utilizza OpenCV per scattare una foto, elaborarla per rilevare oggetti e calcolare le coordinate di quegli oggetti nella scena.Caricamento di un'immagine tramite OpenCV in Android

Tutte le esercitazioni che trovo per Android sembrano essere l'elaborazione in tempo reale dell'anteprima della fotocamera o l'utilizzo di C++, che preferirei fortemente non dover andare giù per la strada C++. Sono sicuro che mi manca qualcosa di semplice ma non so cosa sia.

In un'altra nota, gli oggetti che sto cercando di rilevare sono palle da biliardo su un tavolo. Quale sarebbe la migliore tecnica di pre-elaborazione per individuare meglio le palle? Ho fatto un rapido test usando il metodo canny e sembra che la luce che si riflette sulle palle rompa la forma del cerchio.

+1

Prova a guardare in HoughCircles – Adrian

risposta

16

per caricare le immagini in Android, è possibile utilizzare

Bitmap bMap=BitmapFactory.decodeResource(getResources(),R.drawable.image1) 

dove image1 è un immagine sotto cartella Risorse del progetto Android. Quindi convertire Bitmap in byte o Mat ed elaborare in C++ (OpenCV) o Java con i metodi matToBitmap o MatToBitmap in android-opencv.

Se hai dimestichezza nella lavorazione utilizzando il tipo di dati Mat, è possibile utilizzare (è necessario android-opencv progetto per utilizzare questo)

Mat m = Highgui.imread("/media/path_to_image"); 

È possibile utilizzare blob, cerchi Hough per rilevare palle da biliardo. Non c'è un modo certo per rispondere a questo. Puoi provare a utilizzare gli spazi di colori RGB o Lab normalizzati per giocare (per rimuovere il riflesso delle palle da biliardo) per vedere se rilevi palle da biliardo (eseguendo cerchi di hough, rivelatori di blob).

Lo scenario in tempo reale richiede l'utilizzo di tecniche di apprendimento automatico per rilevare le palle da biliardo utilizzando determinati vettori di caratteristiche, quindi eseguire addestramento e test.

+0

Grazie, sono stato in grado di capirlo, ma ho anche scoperto javacv che rimane più fedele al codice nativo opencv, rendendo così più facile seguire insieme ad altri tutorial. – vince88

+0

@ vince88 dove hai trovato i tutorial di javacv? E potresti dirmi come installarlo su Windows? Grazie. –

+0

Anche dopo aver dichiarato il tipo di dati Mat che cosa devo fare per visualizzarlo? –

2

So che è troppo tardi, ma qualcuno potrebbe usarlo.

Highgui è stato rimosso da opencv per Android.

È possibile utilizzare invece Imgcodes.

Mat BGRMat = Imgcodecs.imread(getResources().getDrawable(R.drawable.img).toString()); 
+0

non troppo tardi, mi ha aiutato! getDrawable è deprecato e puoi usare: Mat BGRMat = Imgcodecs.imread (ResourcesCompat.getDrawable (getResources(), R.drawable.img, null) .toString()); – syonip

+1

in realtà non potrei fare questo lavoro, perché una risorsa drawable non ha un path imread può usare. toString() restituisce semplicemente il nome della risorsa ... – syonip

+0

@syonip Vedo il tuo codice sopra, e ci sono alcuni errori :) Assicurati di copiare il codice correttamente. Ad esempio, dopo il metodo getResources(), dovresti inserire. (Punto) invece di (virgola). In bocca al lupo... –

5

questo funziona per me (ottenuto la risposta da qui: How to get Mat with a drawable input in Android using OpenCV)

Mat img = null; 
try { 
    img = Utils.loadResource(this, R.drawable.image_id, CvType.CV_8UC4); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

Ciao, ho usato questo codice per caricare un'immagine RGB, ma per alcuni reson il tipo 'Mat' era' CV_8UC1'. qualche idea per quale motivo? – noamgot