Imgproc.FindContours不会填充Contours Opencv Android的List <matofpoint>

时间:2015-10-21 08:58:23

标签: android opencv xamarin transform perspective

我正在使用OpenCV 2.4.11 for Android(Xamarin)。我正在尝试检测rect对象(纸张)并制作wrapPerspective,熟悉这个tutorial但是对于Android,就像这样的步骤:
 Canny edge - &gt;最大轮廓 - &gt;最大的矩形 - &gt;找到角落 - &gt;透视变化。

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];
                    }
}    

我被困在这里,因为我不明白为什么这个方法(Imgproc.FindContours)没有填充我的轮廓列表(总是空的)。

同样奇怪的故障:
这是源图像#1 Source Image
如果我只使用这些方法 Imgproc.Canny Imgproc.GaussianBlur 那么结果是这样的(轮廓标记得很好) Canny with GaussianBlur

否则,当我添加 Imgproc.FindContours 时,结果比不使用此方法更糟糕(正如我所说,不填充我的轮廓列表):
With Imgproc.FindContours

另一个图像源#2:
Source Image 2
没有 Imgproc.FindContours (仅 Imgproc.Canny Imgproc.GaussianBlur ):
w/o FindContours
使用 FindContours 方法:
with Contours

不明白我的 错误在哪里 。有人可以为我解释,我做错了或者我如何实现目标? 任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:1)

花了太多时间后,我的结论是 BUG ,因为这种方法并没有很好地移植(dunno为什么)。
您可以尝试重新安装新版本(例如Opencv 3.0.0)或以纯模式(Java)实现,然后在MonoProject中绑定。 享受!

答案 1 :(得分:0)

我遇到了同样的问题。我发现解决方案是使用JavaList作为轮廓列表。

参考:https://github.com/TrekDev/Xamarin.Android.OpenCV/issues/1