使用OpenCV找灰度图质心

这个东西最近坑了我两天的时间。 比较值得注意的几点: 1.Mat的遍历方式,只有灰度图才能使用Mat::at来遍历,如果不是灰度图也不会报错,但是不会得到想要的结果
2.图像质心的公式。

#include <assert.h>
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;  
using namespace cv;

void gravityCenter(Mat src, CvPoint &cent)  
{
  assert(src.channels() == 1);
  long xsum = 0;
  long ysum = 0;
  long count = 0;

  for(int i = 0; i < src.rows; i++) {
    for(int j = 0; j < src.cols; j++) {
      if(src.at<uchar>(i, j) != 0) {
        xsum += j;
        ysum += i;
        count++;
      }
    }
  }

  cent.x = cvRound(double(xsum) / double(count));
  cent.y = cvRound(double(ysum) / double(count));
}

int main()  
{
  Mat src;

  src = Scalar(255, 255, 255) - imread("center.png");

  cvtColor(src, src, CV_BGR2GRAY);

  CvPoint cent;
  gravityCenter(src, cent);

  cout<<"x:"<<cent.x<<" y:"<<cent.y<<endl;

  cvtColor(src, src, CV_GRAY2BGR);

  circle(src, cent, 10, Scalar(0, 200, 200));

  imshow("img", src);
  waitKey(0);

  return 0;
}