在findContours函数使用了之后,有时候就会面临对Contours内部区域的访问。由于contours不一定是凸图形,所以使用循环操作的时候总感觉不那么方便。比如在下图中,已经使用findContours查找到边界并填充边界内部,然后与源图像进行and运算后的结果:
这时候要对非规则点的区域进行相关特征的计算,比如说是区域的灰度均值。观察图像的特征可以发现除了我们需要的点外,其他的都是黑色的背景(灰度值是0!)。那么就可以使用这个特点来除去背景点了。
步骤:
1、对每一个contours区域求它的包络矩形(为了方便遍历像素,就不使用旋转矩形)
Mat drawing = Mat::zeros(m_SrcImg.size(), CV_8UC3 );
for( int i = 0; i< m_contour->size(); i++ )
{
m_rect = boundingRect(m_contour->at(i));
for (int nX=m_rect.x; nX<(m_rect.x+m_rect.width); ++nX)
{
for (int nY=m_rect.y; nY<(m_rect.y+m_rect.height); ++nY)
{
if (m_SrcImg.at<uchar>(nY,nX) == 0)
continue;
drawing.at<cv::Vec3b>(nY,nX)[0] = 0;
drawing.at<cv::Vec3b>(nY,nX)[1] = 0;
drawing.at<cv::Vec3b>(nY,nX)[2] = 255;
}
}
}<span style="font-family: 'Times New Roman'; font-size: 18px; background-color: rgb(255, 255, 255);">2、对矩形内的每一个像素点进行遍历,对矩形区域的像素遍历显然变得比较方便了。</span>
为了验证矩形区域的有效性,把矩形区域都用颜色标注出来
然后在像素遍历函数中来排除背景像素点就可以了,最后得到的效果如下,这就说明这种方式是可以实现的。
本文详细介绍了如何在图像处理中使用findContours函数查找边界并填充内部区域,进而通过与源图像进行AND运算筛选出特定目标。具体步骤包括求取每个轮廓的包络矩形,并遍历矩形内像素,排除背景点,最终实现非规则区域特征的高效计算。
1939

被折叠的 条评论
为什么被折叠?



