我有这个代码,我使用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);
}
2 回答
在上面的代码中,
Scalar color(.....)
定义了每个轮廓的颜色 . 目前,这是在for循环中,因此它为每个轮廓创建一个新颜色 .将
Scalar color(.....)
移出for循环,您只能为轮廓分配一种颜色 .我建议你创建一个标量向量,包含你想要的每个形状的颜色 . total_shape对应于您想要着色的形状的一侧 . 例如,如果要为包含八边形的形状着色,则total_shape = 8 1.将颜色存储到矢量shape_colors .
然后,当您想要为轮廓着色时,请检查每个轮廓有多少个点 . 根据点编号,从shape_color和voila中选择颜色,相同形状的颜色方案相同 .
但是,根据形状的角度,轮廓结果可能会返回太多的点 . 我们需要使用
approxPolyDP
将轮廓简化为最简单的形式 . 意思是我们想要一个矩形只包含4个点,一个三角形3和一个五边形5个点 . 该功能的详细说明由link给出 . 通过这样做,我们将能够通过它包含的总点数来确定轮廓的形状 .这是整个代码:
这是结果: