Nie mogę uruchomić tej funkcji. Zasadniczo robię wykrywanie funkcji i dopasowywanie do obrazu referencyjnego. Chcę nakładać dopasowane funkcje na obraz wejściowy. Oto mój kod:Android OpenCV: rysowanie zapałek z 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;
}
To funkcja2d.drawMatches, który jest szczególnie problem. Zgodnie z błędem Androida, niektóre wymiary nie są wyrównane. Prawdę powiedziawszy, nie jestem nawet pewien, jak drawMatches
ma działać na Androida, ponieważ nigdzie nie ma żadnej dokumentacji.
Co mogę zrobić, to narysować dopasowania na szczycie obrazu wejściowego. Otrzymałem Feature2d.drawKeypoints
do pracy, ale nie jestem pewien, w jaki sposób chciałbym przekonwertować obiekt MatOfDMatch matches
na obiekt MatOfKeypoint
. Również nie jestem nawet pewien, czy tak działa MatOfDMatch - czy nie ma w nim skojarzeń odpowiadających deskryptorom?
Przykro mi z tego, że jestem w tym miejscu, bardzo ciężko pracuję przy użyciu OpenCV z Androidem. Dokumentacja w C++ jest dobra, ale niewiele ma materiałów z Androidem. Dzięki za pomoc!
Dzięki dotychczasowe. Zacząłem używać imageOut = inputImage.clone(), dzięki czemu można korzystać z funkcji drawMatches. Jednak chcę zwrócić ten obraz, ale to, co widzi użytkownik w aparacie, ale wymiary są nieco inne - to 704 * 480, a nie rozdzielczość aparatu 640 * 480. Biorąc pod uwagę, że mój obraz szablonu ma szerokość 64, wygląda na to, że drawMatches umieszcza je obok siebie. Czy mogę po prostu pokazać prostokąt lub coś w dopasowanym obszarze na obrazie wejściowym? – JDS
Tak, myślę, że tak. Przekształć mecze i punkty kluczowe w listę 'List matches_list = matches.toList(); Lista kp_list = keypoints.toList();' a następnie iteruj listę 'kp_list.get (matches_list.get (i) .queryIdx)' i znajdź minimalne i maksymalne X i Y dopasowanych punktów kluczowych, aby spotkać się z dwoma punktami definiującymi twój prostokąt.Następnie zdefiniuj prostokąt 'Rect roi = new Rect (nowy punkt (minX, minY), nowy punkt (maxX, maxY))', a następnie po prostu wykonaj 'Mat imageFinal = new Mat (inputImage, roi);' i będzie tylko przycinać dopasowany obszar –
andriy