主要步骤
- 用
findContours
获取连通域轮廓 - 通过
Moments
对象获取轮廓所在重心 findContours
函数的讲解
实现代码
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("F:\\testdata\\test.jpg", 0);
threshold(src, src, 0, 255, THRESH_OTSU);
//获取图像轮廓
vector<vector<Point>>contours; //每个轮廓中的点
vector<Vec4i>hierarchy; //轮廓的索引???
findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
for (int i = 0; i < contours.size(); ++i)
{
Mat tmp(contours.at(i));
Moments moment=moments(tmp, false);
if (moment.m00 != 0)//除数不能为0
{
int x = cvRound(moment.m10 / moment.m00);//计算重心横坐标
int y = cvRound(moment.m01 / moment.m00);//计算重心纵坐标
circle(src, Point(x, y), 5, Scalar(0));
}
}
imshow("src", src);
waitKey(0);
return 0;
}
程序效果
原图
test.jpg
标记重心
res.jpg
网友评论