Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Imgproc.FindContours не заполняет List<MatOfPoint> контуров Opencv Android

#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 в нативной форме все работает как часы.

Комментариев нет:

Отправить комментарий