我将凸起缺陷放在框架上有问题。为了计算它们,我修改了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()以便能够绘制凸起缺陷?
答案 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);
}
}