Quantcast
Channel: OpenCV Q&A Forum - Latest question feed
Viewing all articles
Browse latest Browse all 19555

Error in mass center calculation through moments()

$
0
0
I'm trying to calculate the mass center of images using OpenCV and I got errors, as you can see in the images (the mass center must not be to closest of any side in this cases). Also, I got mass centers that depends of the rotation and that's incorrect. I have tried with [official example code](http://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/moments/moments.html) and I got the same results Next, you can see the code, input image and output image. Only the "0" triangle seems to be right. I tried with different example codes, and the results are the same. Output image: ![Mass center calculated by the program](http://i.stack.imgur.com/kKcPS.png) Input image: ![Image Input](http://i.stack.imgur.com/Uh30O.png) Waited results: ![Image mass center](https://en.wikipedia.org/wiki/Centroid#/media/File:Triangle.Centroid.svg) Example code: #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include #include #include using namespace cv; using namespace std; Mat src; Mat srcGray; RNG rng(12345); int main(int argc, char **argv) { // Load source image and convert it to gray src = imread(argv[1], 1); // Convert image to gray and blur it cvtColor(src, srcGray, CV_BGR2GRAY); blur(srcGray, srcGray, Size(3, 3)); Mat srcThresh; double otsu; otsu = threshold(srcGray, srcThresh, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); Mat cannyOut; Canny(srcGray, cannyOut, otsu, otsu * 1 / 2, 3, 1); // Find contours vector> contours; vector hierarchy; findContours(cannyOut, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); // Get the moments vector mu(contours.size()); for (int i = 0; i < contours.size(); i++) { mu[i] = moments(contours[i], false); } // Get the mass centers: vector 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); } // Draw contours Mat drawing = Mat::zeros(cannyOut.size(), CV_8UC3); string sObjectNumber; // string which will contain the result ostringstream sContourNumber; // stream used for the conversion for (int i = 0; i< contours.size(); i++) { // drawing.setTo(Scalar(0.0,0.0,0.0)); sContourNumber << i; sObjectNumber = sContourNumber.str(); // Convert int to string Point pCoordinates(mc[i].x + 3, mc[i].y - 3); // Text's coordinates (A little bit off from mass center) Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point()); circle(drawing, mc[i], 4, color, -1, 8, 0); // Draw mass center putText(drawing, sObjectNumber, pCoordinates, CV_FONT_HERSHEY_COMPLEX, 1, color, 2, 8); // Write object number sContourNumber.str(""); // Clear string sContourNumber.clear(); // Clear any error flags // imshow("Contours", drawing); // waitKey(); } double hu[7]; for (int i = 0; i < contours.size(); i++) { cout << "Contour: " << i << " Area: " << contourArea(contours[i]) << " Length: " << arcLength(contours[i], true) << "\n"; for (int j = 0; j < 7; j++) { HuMoments(mu[i], hu); cout << "Contour: " << i << " Hu: " << j << " Result: " << hu[j] << "\n"; } cout << "\n"; } imshow("Contours", drawing); waitKey(0); return(0); } Can somebody helpme? Very thanks for all! Diego

Viewing all articles
Browse latest Browse all 19555

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>