#android #opencv #xamarin #monodroid
Использую OpenCV4Android версии 2.4.11 (разработка ведется под Xamarin.Android).
Я пытаюсь найти Границы прямоугольного объекта(лист бумаги формата А4) посредством
OpenCV.
Пытаюсь реализовать следующий алгоритм:
Canny edge -> Largest contour -> largest rectangle -> find corners -> perspective change.
Вот мой код:
using(Bitmap _img = BitmapFactory.DecodeFile(App._file.Path)) {
if (_img != null) {
m = new Mat();
grayM = new Mat();
Utils.BitmapToMat(_img, m);
//apply filter
Imgproc.Canny(m, m, 100, 100, 3, true);
//gaus Blur
Imgproc.GaussianBlur(m, m, new Org.Opencv.Core.Size(5, 5), 5);
//list for contours
List < MatOfPoint > Contours = new List < MatOfPoint > ();
Mat hierarcy = new Mat();
//our method to find contours,via filling List(Contours)
Imgproc.FindContours(m, Contours, hierarcy, Imgproc.RetrList, Imgproc.ChainApproxSimple);
System.Console.WriteLine(Contours.Count + " Contours founded");
//Dont know why,but Contours list is always empty(no values)
if (Contours.Count != 0) {
MatOfPoint temp = Contours[0];
}
}
И тут я застрял, потому что не понимаю, почему FindContours не заполняет значениями
мой список List(всегда пустой).
Перепробовал наверное все,все равно не хочет.
В чем же может быть проблема?
Так же,довольно странная проблема:
Исходное изображение #1
если я использую только такие методы, как Imgproc.Canny и Imgproc.GaussianBlur ,
то тогда результат выглядит примерно так(контуры обведены отлично):
В противном случае,а именно когда я использую метод Imgproc.FindContours,то результат
выглядит гораздо хуже,ежели без использования самого метода(нахождения контуров),к
тому же List он не заполняет,т.е. лист остается пустым,после инициализации:
Другое исходное изображение #2:
без использования метода Imgproc.FindContours(только Imgproc.Canny вместе с Imgproc.GaussianBlur) :
а здесь уже применяется FindContours метод :
Все же не могу понять,где моя ошибка. Может кто то подсказать\объяснить что я делаю
не так,а так же как мне достичь моей цели?
Заранее благодарю!
PPS позже выложу результаты альтернативных алгоритмов(к примеру,через HoughLinesP
или FeatureDetector.Fast)
Ответы
Ответ 1
После того как было потрачено куча времени,я пришел к выводу,что это просто напросто Баг, т.к. скорей всего не корректно спортировался этот метод(а что именно не так встало,не понятно). Решением проблемы может быть: Установка новой версии(к примеру OpenCV 3.0.0). Заимплементить Java Wrapper класс,который можно будет подключить к проекту и успешно юзать(через мир Java'ы). Такие вот дела. PS в нативной форме все работает как часы.
Комментариев нет:
Отправить комментарий