Использую 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)
Ответ
После того как было потрачено куча времени,я пришел к выводу,что это просто напросто Баг, т.к. скорей всего не корректно спортировался этот метод(а что именно не так встало,не понятно).
Решением проблемы может быть:
Установка новой версии(к примеру OpenCV 3.0.0).
Заимплементить Java Wrapper класс,который можно будет подключить к проекту и успешно юзать(через мир Java'ы).
Такие вот дела.
PS в нативной форме все работает как часы.
Комментариев нет:
Отправить комментарий