C Open CV为相同形状的轮廓绘制一种颜色

loading...


0

我有这个代码,我使用Image Moments . 我希望每种形状的轮廓画一次颜色 . 现在如果我有五个三角形,所有三角形都是用不同的颜色绘制的 . 我想要做的就是将形状彼此分开,用相同的颜色绘制它们 .

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

findContours(src, contours, hierarchy,
    CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

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

for (int i = 0; i < contours.size(); i++)
{
    Scalar color(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
    drawContours(dst, contours, i, color, CV_16U, 8, hierarchy);
}

loading...

2回答

  • 0
    for (int i = 0; i < contours.size(); i++)
    {
        Scalar color(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        drawContours(dst, contours, i, color, CV_16U, 8, hierarchy);
    }
    

    在上面的代码中, Scalar color(.....) 定义了每个轮廓的颜色 . 目前,这是在for循环中,因此它为每个轮廓创建一个新颜色 .

    Scalar color(.....) 移出for循环,您只能为轮廓分配一种颜色 .

    Scalar color(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
    
    for (int i = 0; i < contours.size(); i++)
    {
        drawContours(dst, contours, i, color, CV_16U, 8, hierarchy);
    }
    

  • 0

    我建议你创建一个标量向量,包含你想要的每个形状的颜色 . total_shape对应于您想要着色的形状的一侧 . 例如,如果要为包含八边形的形状着色,则total_shape = 8 1.将颜色存储到矢量shape_colors .

    std::vector<Scalar> shape_colors;
    for (int i = 0; i < total_shape; i++)
    {
        Scalar color(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        shape_colors.push_back(color);
    }
    

    然后,当您想要为轮廓着色时,请检查每个轮廓有多少个点 . 根据点编号,从shape_color和voila中选择颜色,相同形状的颜色方案相同 .

    但是,根据形状的角度,轮廓结果可能会返回太多的点 . 我们需要使用 approxPolyDP 将轮廓简化为最简单的形式 . 意思是我们想要一个矩形只包含4个点,一个三角形3和一个五边形5个点 . 该功能的详细说明由link给出 . 通过这样做,我们将能够通过它包含的总点数来确定轮廓的形状 .

    for (int i = 0; i < contours.size(); i++)
    {
        cv::Mat approx;
        approxPolyDP(contours[i], approx, 30, true);
    
        int n = approx.checkVector(2);
        drawContours(dst, contours, i, shape_colors[n],25);
    }
    

    这是整个代码:

    void process()
    {
        cv::Mat src;
        cv::Mat dst;
        cv::RNG rng;
    
        std::string image_path = "Picture1.png";
        src = cv::imread(image_path,0);
        dst = cv::imread(image_path);
        vector<vector<Point> > contours;
        vector<Vec4i> hierarchy;
    
        cv::threshold(src, src, 120, 255, cv::THRESH_BINARY);
    
        findContours(src, contours, hierarchy,
            CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
    
    
        int total_shape = 10;
        std::vector<Scalar> shape_colors;
        for (int i = 0; i < total_shape; i++)
        {
            Scalar color(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
            shape_colors.push_back(color);
        }
    
        for (int i = 0; i < contours.size(); i++)
        {
            cv::Mat approx;
            approxPolyDP(contours[i], approx, 30, true);
    
            int n = approx.checkVector(2);
            drawContours(dst, contours, i, shape_colors[n],25);
        }
    
        cv::imshow("dst", dst);
        cv::waitKey(0);
    }
    

    这是结果:

评论

暂时没有评论!