使用OpenCV绘制连接对象质心的线

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用OpenCV绘制连接对象质心的线相关的知识,希望对你有一定的参考价值。

我已使用此处OpenCV examples提供的代码找到了图像中多个对象的质心

这里是找到质心并将其存储在向量中的代码。

cv::Mat InputImage;
    cv::Mat CannyOutput;
    vector<vector<cv::Point> > contours;
    vector<Vec4i> hierarchy;
    RNG rng(12345);
    InputImage = cv::imread("Untitled.jpg");

    //Edge detection
    Canny(InputImage, CannyOutput, 100, 150);

    //Contour detection
    cv::findContours(CannyOutput, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));

    //Finding Moments

    vector<Moments> mu(contours.size());
        for (int i = 0; i < contours.size(); i++)
            {
                mu[i] = moments(contours[i], false);
            }

    //Calculating Centroid

    vector<Point2f> mc(contours.size());
        for (int i = 0; i < contours.size(); i++)
            {
                mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);
            }

    // Drawing 
    Mat drawing = Mat::zeros(CannyOutput.size(), CV_8UC3);
        for (int i = 0; i< contours.size(); i++)
            {
                Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
                //Drawing contour
                drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, cv::Point());
                //Drawing circles with centroid as centre
                circle(drawing, mc[i], 4, color, -1, 8, 0);
            }

我想做的是绘制一个以质心为顶点的多边形。我使用了drawcontours,polyline和line函数,但没有得到理想的结果。有没有办法做到这一点? 。我需要在C ++中实现]

输出图像

enter image description here

所需图像

enter image description here

另外,如果将'color'变量替换为BGR值,则代码似乎没有显示质心。如果我想看到形心,似乎轮廓和形心必须具有相同的颜色。当我为轮廓提供((0,255,255,0)并为质心提供(255,255,0)时,质心未显示。

答案

对于给定的样本图像,您可以使用convexhull获得中心的顺序,然后使用polylines绘制它们。

以上是关于使用OpenCV绘制连接对象质心的线的主要内容,如果未能解决你的问题,请参考以下文章

目标跟踪入门:使用OpenCV实现质心跟踪

OpenCV:如何绘制一条颜色与其应绘制的表面相反的线?

openCV C++ 将对象/斑点减少到质心

如何从 OpenCV C++ 中的 HoughLines 函数输出中绘制所需的线?

[OpenCV实战]9 使用OpenCV寻找平面图形的质心

如何重新绘制可移动的两个 UIView 之间连接的线