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

使用OpenCV绘制连接对象质心的线,opencv,visual-c++,c++-cli,Opencv,Visual C++,C++ Cli,我使用这里提供的代码找到了图像中多个对象的质心 下面是找到质心并将其存储在向量中的代码 cv::Mat InputImage; cv::Mat CannyOutput; vector<vector<cv::Point> > contours; vector<Vec4i> hierarchy; RNG rng(12345); InputImage = cv::imread("Untitled.jpg"); //E

我使用这里提供的代码找到了图像中多个对象的质心

下面是找到质心并将其存储在向量中的代码

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、折线和直线函数,但没有得到想要的结果。有没有办法做到这一点。我需要用C语言实现它++

输出图像

理想图像


另外,另一方面,如果我用BGR值替换“color”变量,代码似乎没有显示质心。如果我想看到质心,轮廓和质心必须是相同的颜色。当我给出0255255表示轮廓,255255,0表示质心时,质心没有显示。

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

您已经在“mc”中存储了中心。现在,您需要尝试找到相邻的对并将它们连接起来。对于相邻的两个点,所有其他点都应该位于从这两品脱经过的线的同一侧。谢谢,这很有效。虽然,我必须把向量转换成向量。我不必使用多段线。我根据质心向量上的凸包绘制轮廓。