#include<iostream>
#include"opencv2\opencv.hpp"
#include<math.h>
using namespace std;
using namespace cv;
RNG g_rng(12345);
int g_nElementShape=MORPH_RECT;
Mat srcImage, dstImage;
void centerPoints(vector<Point>contour);
int main()
{
srcImage = imread(“bw_0133.png”, 0);//读取文件,可以是文件目录
if (!srcImage.data){ printf(“图片读取错误!\n”); return false; }
namedWindow(“原图”);
imshow(“原图”, srcImage);
//进行开运算平滑
//namedWindow("【开运算/闭运算】", 1);
Mat dstImage = Mat::zeros(srcImage.rows, srcImage.cols, CV_8UC3);
Mat element = getStructuringElement(g_nElementShape,
Size(<span class="hljs-number">5</span>, <span class="hljs-number">5</span>), Point(-<span class="hljs-number">1</span>, -<span class="hljs-number">1</span>));
morphologyEx(srcImage, dstImage, MORPH_OPEN, element, Point(-<span class="hljs-number">1</span>, -<span class="hljs-number">1</span>),<span class="hljs-number">2</span>);
imshow(<span class="hljs-string">"【开运算/闭运算】"</span>, dstImage);
<span class="hljs-stl_container"><span class="hljs-built_in">vector</span><<span class="hljs-stl_container"><span class="hljs-built_in">vector</span><Point></span>></span>contour;<span class="hljs-comment">//用来储存轮廓</span>
<span class="hljs-stl_container"><span class="hljs-built_in">vector</span><Vec4i></span>hierarchy;
findContours(dstImage, contour, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < contour.size(); ++i)
{
centerPoints(contour[i];
}
Mat drawing = Mat::zeros(dstImage.size(), CV_8UC3);
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> <span class="hljs-keyword">unsigned</span> i = <span class="hljs-number">0</span>; i < contour.size(); i++)
{
Scalar color = Scalar(g_rng.uniform(<span class="hljs-number">0</span>, <span class="hljs-number">255</span>), g_rng.uniform(<span class="hljs-number">0</span>, <span class="hljs-number">255</span>), g_rng.uniform(<span class="hljs-number">0</span>, <span class="hljs-number">255</span>));
drawContours(drawing, contour, i, color, <span class="hljs-number">1</span>, <span class="hljs-number">8</span>, <span class="hljs-stl_container"><span class="hljs-built_in">vector</span><Vec4i></span>(), <span class="hljs-number">0</span>, Point());
}
imshow(<span class="hljs-string">"轮廓图"</span>, drawing);<span class="hljs-comment">//画出轮廓线,在轮廓线上显示坐标</span>
<span class="hljs-comment">//计算矩</span>
<span class="hljs-stl_container"><span class="hljs-built_in">vector</span><Moments></span>mu(contour.size());
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < contour.size(); i++)
{
mu[i] = moments(contour[i], <span class="hljs-keyword">false</span>);
}
<span class="hljs-comment">//计算矩中心</span>
<span class="hljs-stl_container"><span class="hljs-built_in">vector</span><Point2f></span>mc(contour.size());
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < contour.size(); i++)
{
mc[i] = Point2f(<span class="hljs-keyword">static_cast</span><<span class="hljs-keyword">float</span>>(mu[i].m10 / mu[i].m00), <span class="hljs-keyword">static_cast</span><<span class="hljs-keyword">float</span>>(mu[i].m01 / mu[i].m00));
}
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i< contour.size(); ++i)
{
circle(drawing, mc[i], <span class="hljs-number">5</span>, Scalar(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">255</span>), -<span class="hljs-number">1</span>, <span class="hljs-number">8</span>, <span class="hljs-number">0</span>);
rectangle(drawing, boundingRect(contour.at(i)), Scalar(<span class="hljs-number">0</span>, <span class="hljs-number">255</span>, <span class="hljs-number">0</span>));
<span class="hljs-keyword">char</span> tam[<span class="hljs-number">100</span>];
sprintf_s(tam, <span class="hljs-string">"(%0.0f,%0.0f)"</span>, mc[i].x, mc[i].y);
putText(drawing, tam, Point(mc[i].x, mc[i].y), FONT_HERSHEY_SIMPLEX, <span class="hljs-number">0.4</span>, Scalar(<span class="hljs-number">255</span>, <span class="hljs-number">0</span>, <span class="hljs-number">255</span>), <span class="hljs-number">1</span>);
<span class="hljs-comment">//计算质心 坐标</span>
<span class="hljs-built_in">cout</span> << <span class="hljs-string">"质心点坐标:"</span> << <span class="hljs-string">"("</span> << (<span class="hljs-keyword">int</span>)mc[i].x << <span class="hljs-string">"."</span> << (<span class="hljs-keyword">int</span>)mc[i].y << <span class="hljs-string">")"</span> << endl;
<span class="hljs-comment">//下标输出</span>
}
namedWindow(<span class="hljs-string">"Contours"</span>, WINDOW_AUTOSIZE);
imshow(<span class="hljs-string">"Contours"</span>, drawing);
waitKey(<span class="hljs-number">0</span>);
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
void centerPoints(vector<Point>contour)
{
double factor = (contourArea(contour) * 4 * CV_PI) /
(pow(arcLength(contour, true), 2));
cout << “factor:” << factor << endl; //计算出圆形度factor
}