Non riesco a far funzionare questa funzione. Fondamentalmente sto facendo il rilevamento di funzionalità e la corrispondenza con un'immagine di riferimento. Voglio sovrapporre le caratteristiche corrispondenti sopra la mia immagine di input. Ecco il mio codice:Android OpenCV: disegno corrisponde a feature2d
public Mat startProcessing(Mat inputImage) {
Imgproc.cvtColor(inputImage, rgb, Imgproc.COLOR_GRAY2RGB);
myFeatures.detect(rgb, keypoints);
descriptorExtractor.compute(inputImage, keypoints, imageDescriptors);
descriptorMatcher.match(templateDescriptors, imageDescriptors, matches);
Features2d.drawMatches(rgb, keypoints, templateImage, templateKeypoints, matches, rgb);
Imgproc.cvtColor(rgb, outputImage, Imgproc.COLOR_RGB2RGBA);
return outputImage;
}
È Caratteri2d.drawMatch che è specificamente il problema. Secondo l'errore di Android che ho ottenuto, alcune dimensioni non si stanno allineando. A dire il vero, non sono nemmeno sicuro di come drawMatches
funzioni su Android perché non c'è documentazione da nessuna parte.
Quello che voglio essere in grado di fare è disegnare le corrispondenze sopra l'inputImage. Ho ottenuto il Feature2d.drawKeypoints
per funzionare, ma non sono sicuro di come procedere per la conversione di MatOfDMatch matches
in un oggetto MatOfKeypoint
. Inoltre non sono nemmeno sicuro che sia così che funziona MatOfDMatch - non ha qualche associatività all'interno di esso corrispondente ai descrittori?
Ci scusiamo per essere ovunque, sto attraversando un periodo davvero difficile con OpenCV con Android. La documentazione del C++ è buona, ma c'è poco materiale per Android. Grazie per qualsiasi aiuto!
Grazie finora. Ho iniziato a usare imageOut = inputImage.clone() e questo fa funzionare drawMatches. Tuttavia, voglio restituire questa immagine, ma ciò che l'utente vede sulla fotocamera, ma le dimensioni sono leggermente diverse: è 704 * 480 invece della risoluzione della mia fotocamera di 640 * 480. Dato che la mia immagine modello ha larghezza 64, sembra che drawMatches li stia mettendo fianco a fianco. Posso semplicemente mostrare un rettangolo o qualcosa sopra l'area corrispondente sull'immagine di input? – JDS
Sì, penso di si. Trasforma corrispondenze e punti chiave per elencare 'Elenco matches_list = matches.toList(); Elenco kp_list = keypoints.toList();' e quindi scorrere l'elenco 'kp_list.get (matches_list.get (i) .queryIdx)' e trova le X e Y minime e massime dei punti chiave corrispondenti per incontrare due punti che definiranno il tuo rettangolo.Quindi definisci un rettangolo 'Rect roi = new Rect (new Point (minX, minY), new Point (maxX, maxY))' e poi fai 'Mat imageFinal = new Mat (inputImage, roi);' e ritaglierà solo l'area abbinata –
andriy