在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>
为了验证矩形区域的有效性,把矩形区域都用颜色标注出来
然后在像素遍历函数中来排除背景像素点就可以了,最后得到的效果如下,这就说明这种方式是可以实现的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)