opencv基础之测试质心和圆形度

#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>&lt;<span class="hljs-stl_container"><span class="hljs-built_in">vector</span>&lt;Point&gt;</span>&gt;</span>contour;<span class="hljs-comment">//用来储存轮廓</span>
<span class="hljs-stl_container"><span class="hljs-built_in">vector</span>&lt;Vec4i&gt;</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 &lt; 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 &lt; 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>&lt;Vec4i&gt;</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>&lt;Moments&gt;</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 &lt; 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>&lt;Point2f&gt;</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 &lt; contour.size(); i++)
{
    mc[i] = Point2f(<span class="hljs-keyword">static_cast</span>&lt;<span class="hljs-keyword">float</span>&gt;(mu[i].m10 / mu[i].m00), <span class="hljs-keyword">static_cast</span>&lt;<span class="hljs-keyword">float</span>&gt;(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&lt; 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> &lt;&lt; <span class="hljs-string">"质心点坐标:"</span> &lt;&lt; <span class="hljs-string">"("</span> &lt;&lt; (<span class="hljs-keyword">int</span>)mc[i].x &lt;&lt; <span class="hljs-string">"."</span> &lt;&lt; (<span class="hljs-keyword">int</span>)mc[i].y &lt;&lt; <span class="hljs-string">")"</span> &lt;&lt; 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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值