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(5, 5), Point(-1, -1));
    morphologyEx(srcImage, dstImage, MORPH_OPEN, element, Point(-1, -1),2);
    imshow("【开运算/闭运算】", dstImage);

    vector<vector<Point>>contour;//用来储存轮廓
    vector<Vec4i>hierarchy;

    findContours(dstImage, contour, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    for (unsigned int i = 0; i < contour.size(); ++i)
    {
        centerPoints(contour[i];
    }

    Mat drawing = Mat::zeros(dstImage.size(), CV_8UC3);
    for (int unsigned i = 0; i < contour.size(); i++)
    {
        Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));
        drawContours(drawing, contour, i, color, 1, 8, vector<Vec4i>(), 0, Point());

    }
    imshow("轮廓图", drawing);//画出轮廓线,在轮廓线上显示坐标
    //计算矩
    vector<Moments>mu(contour.size());
    for (unsigned int i = 0; i < contour.size(); i++)
    {
        mu[i] = moments(contour[i], false);
    }
    //计算矩中心
    vector<Point2f>mc(contour.size());
    for (unsigned int i = 0; i < contour.size(); i++)
    {
        mc[i] = Point2f(static_cast<float>(mu[i].m10 / mu[i].m00), static_cast<float>(mu[i].m01 / mu[i].m00));
    }
    for (unsigned int i = 0; i< contour.size(); ++i)
    {
        circle(drawing, mc[i], 5, Scalar(0, 0, 255), -1, 8, 0);
        rectangle(drawing, boundingRect(contour.at(i)), Scalar(0, 255, 0));
        char tam[100];
        sprintf_s(tam, "(%0.0f,%0.0f)", mc[i].x, mc[i].y);
        putText(drawing, tam, Point(mc[i].x, mc[i].y), FONT_HERSHEY_SIMPLEX, 0.4, Scalar(255, 0, 255), 1);
        //计算质心 坐标
        cout << "质心点坐标:" << "(" << (int)mc[i].x << "." << (int)mc[i].y << ")" << endl;
        //下标输出
    }
    namedWindow("Contours", WINDOW_AUTOSIZE);
    imshow("Contours", drawing);
    waitKey(0);
    return 0;
}
void centerPoints(vector<Point>contour)
{
    double factor = (contourArea(contour) * 4 * CV_PI) /
            (pow(arcLength(contour, true), 2));
    cout << "factor:" << factor << endl;  //计算出圆形度factor
}
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值