#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
}
opencv基础之测试质心和圆形度
最新推荐文章于 2024-05-13 09:26:00 发布