这个东西最近坑了我两天的时间。
比较值得注意的几点:
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 ¢)
{
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;
}