Opencv学习笔记 轮廓的中心点 vs 连通区域的质心

        寻找轮廓并绘制中心点的参考代码及结果:

Mat image01 = Cv2.ImRead(@"C://Users//xiaomao//Desktop//123.png");

OpenCvSharp.Point[][] contours;
OpenCvSharp.HierarchyIndex[] hierarchy;
Cv2.FindContours(image01.CvtColor(ColorConversionCodes.BGR2GRAY), out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple );
Cv2.DrawContours(image01, contours, -1, new Scalar(0, 255, 0), 2);
foreach (OpenCvSharp.Point[] point in contours)
{
    OpenCvSharp.Moments M = Cv2.Moments(point);
    int cX = (int)(M.M10 / M.M00);
    int cY = (int)(M.M01 / M.M00);
    Cv2.Circle(image01, cX, cY, 2, new Scalar(0, 0, 255), -1);
}

Cv2.ImShow("Image", image01);

Opencv学习笔记 轮廓的中心点 vs 连通区域的质心_第1张图片Opencv学习笔记 轮廓的中心点 vs 连通区域的质心_第2张图片

 Opencv学习笔记 轮廓的中心点 vs 连通区域的质心_第3张图片Opencv学习笔记 轮廓的中心点 vs 连通区域的质心_第4张图片

        以下是寻找并绘制质心的代码及结果:

//原图灰度化
Mat img = src.CvtColor(ColorConversionCodes.BGR2GRAY);
//二值处理
img = img.Threshold(0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);

//寻找并标记区域个数
Mat labelMat = new Mat();
Mat stats = new Mat();
Mat centroids = new Mat();
int num = Cv2.ConnectedComponentsWithStats(img, labelMat, stats, centroids, PixelConnectivity.Connectivity8);

//循环质心
for (int h = 0; h < centroids.Height; h++)
{
    double a = centroids.At(h, 0);
    double b = centroids.At(h, 1);
    OpenCvSharp.Point point = new OpenCvSharp.Point(a, b);
    Cv2.Circle(src, point, 2, new Scalar(0, 0, 255));
}
Cv2.ImShow("绘制质心", src);

  Opencv学习笔记 轮廓的中心点 vs 连通区域的质心_第5张图片Opencv学习笔记 轮廓的中心点 vs 连通区域的质心_第6张图片

Opencv学习笔记 轮廓的中心点 vs 连通区域的质心_第7张图片Opencv学习笔记 轮廓的中心点 vs 连通区域的质心_第8张图片

        看着应该是相同的。 

你可能感兴趣的:(OpenCv,图像处理,1024程序员节,opencv)