2012-06-08 9 views
5

Intento buscar centroide utilizando cv :: Moments de OpenCV C++. Sean cuales sean los argumentos que le presento, todo lo que recibo son ceros. Claramente hago algo simplemente incorrecto. Salida de código:OpenCV C++ uso de cv :: Momentos

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 

Y código:

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

extraño que no puedo encontrar ningún ejemplo de código idénticos de Google. Todo lo que veo son enfoques de estilo C.

Respuesta

10

Usar momentos para encontrar un centroide es un poco exagerado. Se puede utilizar el siguiente algoritmo para hacerlo:

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; 
} 

O con la ayuda de boundingRect de OpenCV:

//pseudo-code: 

Rect bRect = Imgproc.boundingRect(array_points); 

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

Gracias! Primero confirmo que tu método funciona y en segundo lugar encontré mi error porque estoy trabajando con tu código. Estaba usando "i" en lugar de "j": x.at (k ++) = samples.at (j/* BUG FUE AQUÍ * /); –

Cuestiones relacionadas