【问题标题】:How to get the mass center of a contour ? Android opencv如何获得轮廓的质心?安卓opencv
【发布时间】:2013-08-23 03:34:10
【问题描述】:

这是 C++ 代码。

vector<Moments> mu(contours.size() );
  for( int i = 0; i < contours.size(); i++ ){
      mu[i] = moments( contours[i], false );
  }

//Mass center
vector<Point2f> mc( contours.size() );
  for( int i = 0; i < contours.size(); i++ ){ 
    mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); 
  }

这是我目前在 android 中的代码。我无法将质量中心转换为 android。

//moments
List<Moments> mu = new ArrayList<Moments>(contours.size());
  for (int i = 0; i < contours.size(); i++) {
    mu.add(i, Imgproc.moments(contours.get(i), false));
  }

//mass center
List<MatOfPoint2f> mc = new ArrayList<MatOfPoint2f>(contours.size()); 
  for( int i = 0; i < contours.size(); i++ ){
    mc.add((mu.get(i).get_m10() / mu.get(i).get_m00() ,   mu.get(i).get_m01()/mu.get(i).get_m00()));
  }

这一行有错误:

mc.add((mu.get(i).get_m10() / mu.get(i).get_m00() , mu.get(i).get_m01()/mu.get(i).get_m00()));

提前致谢。

【问题讨论】:

  • 错误信息是什么?

标签: android opencv centroid


【解决方案1】:

假设您将轮廓存储在List&lt;Point&gt; 中,您可以这样做:

MatOfPoint mop = new MatOfPoint();
mop.fromList(contour);

Moments moments = Imgproc.moments(mop);

Point centroid = new Point();

centroid.x = moments.get_m10() / moments.get_m00();
centroid.y = moments.get_m01() / moments.get_m00();

【讨论】:

    【解决方案2】:

    此代码将找到所有轮廓的位置。

    List<Moments> mu = new ArrayList<Moments>(Contours.size());
        for (int i = 0; i < Contours.size(); i++) {
            mu.add(i, Imgproc.moments(Contours.get(i), false));
            Moments p = mu.get(i);
            int x = (int) (p.get_m10() / p.get_m00());
            int y = (int) (p.get_m01() / p.get_m00());
            Core.circle(rgbaImage, new Point(x, y), 4, new Scalar(255,49,0,255));
        }
    

    【讨论】:

      【解决方案3】:

      试试

      mc.add(new MatOfPoint2f(new Point(mu.get(i).get_m10() / mu.get(i).get_m00(), mu.get(i).get_m01() / mu.get(i).get_m00())));
      

      而不是

      mc.add((mu.get(i).get_m10() / mu.get(i).get_m00() , mu.get(i).get_m01()/mu.get(i).get_m00()));
      

      由于mcMathOfPoint2f类型,其构造函数需要Point类型参数。

      注意:虽然这个问题是在 2 年前提出的,但我给出了这个答案,因为我认为这是该 c++ 代码的精确转换。这对我有用。

      【讨论】:

        猜你喜欢
        • 2018-09-09
        • 2020-05-22
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 2019-08-17
        • 1970-01-01
        相关资源
        最近更新 更多