我正在使用OpenCV 2.4.11 for Android(Xamarin)。我正在尝试检测rect对象(纸张)并制作wrapPerspective,熟悉这个tutorial但是对于Android,就像这样的步骤:
Canny edge - >最大轮廓 - >最大的矩形 - >找到角落 - >透视变化。
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
如果我只使用这些方法 Imgproc.Canny 和 Imgproc.GaussianBlur 那么结果是这样的(轮廓标记得很好)
否则,当我添加 Imgproc.FindContours 时,结果比不使用此方法更糟糕(正如我所说,不填充我的轮廓列表):
另一个图像源#2:
没有 Imgproc.FindContours (仅 Imgproc.Canny Imgproc.GaussianBlur ):
使用 FindContours 方法:
不明白我的 错误在哪里 。有人可以为我解释,我做错了或者我如何实现目标? 任何帮助将不胜感激,谢谢!
答案 0 :(得分:1)
花了太多时间后,我的结论是 BUG ,因为这种方法并没有很好地移植(dunno为什么)。
您可以尝试重新安装新版本(例如Opencv 3.0.0)或以纯模式(Java)实现,然后在MonoProject中绑定。
享受!
答案 1 :(得分:0)
我遇到了同样的问题。我发现解决方案是使用JavaList作为轮廓列表。
参考:https://github.com/TrekDev/Xamarin.Android.OpenCV/issues/1