2012-06-08 81 views
5

Tôi cố gắng tìm centroid bằng cách sử dụng cv của OpenCV C++ :: Moments. Bất kỳ đối số nào tôi gửi cho nó, Tất cả những gì tôi nhận được đều là số không. Rõ ràng tôi làm điều gì đó rất đơn giản là sai. Đầu ra của mã:OpenCV C++ sử dụng cv :: Moments

23 of 500 elements in unit 3 
point values 2.976444 18.248287 
matrix size 23 
moments 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 
moments 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 

Và mã:

printf("%d of %d elements in unit %d\n",k,number_of_features,i); 
cv::Mat x(k, 1, cv::DataType<cv::Point2f>::type); 
k=0; 
for(int j=0;j <number_of_features;j++) { 
    if(i == labels.at<int>(j)) { 
     x.at<cv::Point2f>(k++) = samples.at<cv::Point2f>(i); 
    } 
} 
printf("point values %f %f\n", x.at<cv::Point2f>(0).x,x.at<cv::Point2f>(0).y); 
cv::Size s=x.size(); 
printf("matrix size %d\n",s.height); 
cv::Moments m=cv::moments(x); 
printf("moments %f %f %f %f %f %f %f %f\n",m.m00,m.m01,m.m20,m.m11,m.m02,m.m30,m.m21,m.m03); 
double h[7]; 
cv::HuMoments(m,h); 
printf("moments %f %f %f %f %f %f %f\n",h[0],h[1],h[2],h[3],h[4],h[5],h[6]); 

Kỳ lạ thay tôi không thể tìm thấy bất kỳ mẫu mã giống hệt nhau từ Google. Tất cả những gì tôi thấy là cách tiếp cận kiểu C.

Trả lời

10

Sử dụng các khoảnh khắc để tìm một centroid là một chút quá mức cần thiết. Bạn có thể sử dụng các thuật toán sau đây để làm điều đó:

sumX = 0; sumY = 0; 
size = array_points.size; 
if(size > 0){ 

    foreach(point in array_points){ 
     sumX += point.x; 
     sumY += point.y; 
    } 

centroid.x = sumX/size; 
centroid.y = sumY/size; 
} 

Hoặc với sự giúp đỡ của boundingRect của OpenCV:

//pseudo-code: 

Rect bRect = Imgproc.boundingRect(array_points); 

centroid.x = bRect.x + (bRect.width/2); 
centroid.y = bRect.y + (bRect.height/2); 
+0

Cảm ơn! Trước tiên, tôi xác nhận phương thức của bạn hoạt động và thứ hai tôi đã tìm thấy lỗi của mình vì làm việc với mã của bạn. Tôi đã sử dụng "i" thay vì "j": x.at (k ++) = samples.at (j/* BUG WAS HERE * /); –

3

Tôi khuyên bạn nên truy cập Hướng dẫn chính thức về những khoảnh khắc. Tìm hiểu và chạy mã đó trước.

http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/moments/moments.html#moments

Một khi nó là thành công, cố gắng thực hiện bất cứ điều gì bạn muốn.

+0

Vâng, nó hoạt động trên chuỗi các đường nét nhưng tôi cần nó để làm việc trên 1D mảng của điểm dấu chấm động. Một cái gì đó trong những khác biệt đó phanh nó. IT nhât thi tôi nghi vậy. –

Các vấn đề liên quan