OpenCV Java凸性缺陷(计算机视觉)

时间:2013-08-06 06:38:59

标签: java android c++ opencv convexity-defects

我将凸起缺陷放在框架上有问题。为了计算它们,我修改了c ++源代码,这就是我存档的内容:

    mConvexityDefectsMatOfInt4 = new MatOfInt4();

    if(contours.size() > 0 && convexHullMatOfInt.rows() > 0)
        Imgproc.convexityDefects(contours.get(0), convexHullMatOfInt,   mConvexityDefectsMatOfInt4);

但是,Imgproc.drawContours(...)方法要求将convexityDefects传递给它作为参数将是ArrayList。我不知道如何进行转换。我也有类似凸壳的问题,但我发现了一个解决方法:

  convexHullMatOfInt = new MatOfInt();
  convexHullPointArrayList = new ArrayList<Point>();
  convexHullMatOfPoint = new MatOfPoint();
  convexHullMatOfPointArrayList = new ArrayList<MatOfPoint>();

  //Calculate convex hulls
  if(contours.size() > 0)
  {
    Imgproc.convexHull( contours.get(0), convexHullMatOfInt, false );
    for(int j=0; j < convexHullMatOfInt.toList().size(); j++)
      convexHullPointArrayList.add(contours.get(0).toList().get(convexHullMatOfInt.toList().get(j)));
    convexHullMatOfPoint.fromList(convexHullPointArrayList);
    convexHullMatOfPointArrayList.add(convexHullMatOfPoint);   
  }

凸性缺陷的类似解决方案无效。有谁知道如何解决这个问题?

如何从MatOfInt4()转换为ArrayList()以便能够绘制凸起缺陷?

2 个答案:

答案 0 :(得分:4)

(我自己在使用convexityDefect时遇到了很多困难,我想杀死为OpenCV编写Java接口的人!)

现在回答:

docs中所述,MatOfInt4基本上是一个包含以下信息的4元素整数数组:

start_index
end_index
farthest_pt_index
fixpt_depth

您可以使用以下内容将mConvexityDefectsMatOfInt4转换为整数列表:

List<Integer> cdList = mConvexityDefectsMatOfInt4.toList();

现在,cdList中的每4个连续元素都包含上述信息:

cdList 0 : 23    
cdList 1 : 30      
cdList 2 : 26    
cdList 3 : 18101
-----------------
cdList 4 : 30
cdList 5 : 44
cdList 6 : 33
cdList 7 : 43738

因此,例如,如果您只想绘制每个凹面的最远点,您可以简单地使用每个4个元素的第三个索引。在这种情况下:26,33,......

希望它有所帮助。

答案 1 :(得分:2)

以下是一个例子:

for (int i = 0; i < contours.size(); i++) {
    convDef.add(new MatOfInt4());
    Imgproc.convexityDefects(contours.get(i), hull.get(i),
        convDef.get(i));
    cdList = convDef.get(i).toList();
    Point data[] = contours.get(i).toArray();

    for (int j = 0; j < cdList.size(); j = j+4) {
        Point start = data[cdList.get(j)];
        Point end = data[cdList.get(j+1)];
        Point defect = data[cdList.get(j+2)];
        //Point depth = data[cdList.get(j+3)];

        Imgproc.circle(mat, start, 5, new Scalar(0, 255, 0), 2);
        Imgproc.circle(mat, end, 5, new Scalar(0, 255, 0), 2);
        Imgproc.circle(mat, defect, 5, new Scalar(0, 255, 0), 2);
    }
}