2013-08-20 135 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++代碼的確切轉換。這對我有用。