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

来源:互联网 发布:如何查看已占用的端口 编辑:程序博客网 时间:2024/06/07 05:37
#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}
原创粉丝点击