1

フレームに凸状の欠陥を置くことに問題があります。それらを計算するために、c++ ソースを変更しました。これがアーカイブしたものです。

    mConvexityDefectsMatOfInt4 = new MatOfInt4();

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

ただし、Imgproc.drawContours(...) メソッドには、パラメータとして渡される凸性欠陥が 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() に変換して、凸性の欠陥を描画できるようにする方法は?

4

2 に答える 2

4

convexityDefect(私自身、OpenCV 用の Java インターフェースを書いた人を殺したいほど苦労していました!)

今答え:

docsに記載されているように、MatOfInt4基本的には次の情報を含む 4 要素の整数配列です。

start_index
end_index
farthest_pt_index
fixpt_depth

mConvexityDefectsMatOfInt4以下を使用して、整数のリストに変換できます。

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

これで、 の 4 つの連続する各要素がcdList上記の情報を保持します。

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 つの各要素の 3 番目のインデックスを使用できます。この場合: 26、33、...

それが役に立てば幸い。

于 2013-08-15T12:56:29.097 に答える
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);
    }
}
于 2015-11-03T02:07:43.913 に答える