这是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中的代码。我无法将群众中心转换为安卓。
//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()));
提前致谢。
答案 0 :(得分:8)
此代码将找到所有轮廓的位置。
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));
}
答案 1 :(得分:2)
假设您将轮廓存储在List<Point>
中,您可以这样做:
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 :(得分:0)
尝试
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()));
因为mc
是MathOfPoint2f
类型,其构造函数需要Point
类型参数。
注意:虽然这个问题大约在2年前提出,但我给出了这个答案,因为我认为这是c ++代码的确切转换。这对我有用。