2012-06-08 19 views
5

मैं ओपनसीवी सी ++ के सीवी :: क्षणों का उपयोग करके सेंट्रॉइड खोजने की कोशिश करता हूं। मैं जो भी तर्क प्रस्तुत करता हूं, मैं वापस प्राप्त करता हूं, शून्य हैं। स्पष्ट रूप से मैं कुछ बहुत गलत करता हूँ। कोड के आउटपुट:ओपनसीवी सी ++ सीवी का उपयोग :: क्षण

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 

और कोड:

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

अजीब मैं गूगल से किसी भी समान कोड का नमूना नहीं मिल रहा। मैं देखता हूं कि सी शैली दृष्टिकोण है।

उत्तर

10

एक सेंट्रॉइड खोजने के लिए क्षणों का उपयोग करना थोड़ा अधिक है Imo। आप यह करने के लिए निम्नलिखित कलन विधि का उपयोग कर सकते हैं:

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

या OpenCV के boundingRect की मदद से:

//pseudo-code: 

Rect bRect = Imgproc.boundingRect(array_points); 

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

धन्यवाद! सबसे पहले मैं आपकी विधि के कार्यों की पुष्टि करता हूं और दूसरा मुझे आपकी बग मिली क्योंकि आपके कोड के साथ काम करना। मैं "जे" के बजाय "i" का उपयोग कर रहा था: x.at (के ++) = samples.at (जे/* बग यहां था * /); –

3

मैं आपको क्षणों पर आधिकारिक ट्यूटोरियल देखने की सलाह दूंगा। पहले उस कोड को जानें और चलाएं।

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

एक बार जब यह सफलता है, जो चाहो लागू करने के लिए प्रयास करें।

+0

खैर, यह आकृति के अनुक्रम पर काम करता है, लेकिन मैं के 1 डी सरणी पर काम करने की जरूरत फ्लोटिंग पॉइंट पॉइंट्स। उन मतभेदों में कुछ तोड़ दिया। कम से कम मुझे तो यही लगता है। –

संबंधित मुद्दे