2013-08-20 85 views
2

这是C++代码。如何获得轮廓的质心? Android opencv

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())); 

在此先感谢。

+0

什么是错误信息? – Aurelius

回答

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

假设你有存储在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(); 
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())); 

因为,mcMathOfPoint2f类型,它的构造需要Point类型参数。

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