有的时候,我们需要对图像进行孔洞填充,一般想到的方法都是,使用findcontours函数,查找最外层轮廓,然后画出找到的轮廓。
这确实是一种方法,但似乎不够高效。下面贴出一个函数,可以更好的实现这个功能。
话不多说,上代码。开发环境 opencv2.4.13+vs2013 其他vs或者opencv版本应该也可以跑出来
void chao_fillHole(const cv::Mat srcimage, cv::Mat &dstimage) Size m_Size = srcimage.size(); Mat temimage = Mat::zeros(m_Size.height + 2, m_Size.width + 2, srcimage.type());//延展图像 srcimage.copyTo(temimage(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1))); floodFill(temimage, Point(0, 0), Scalar(255)); temimage(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)).copyTo(cutImg); dstimage = srcimage | (~cutImg);
当你仔细看看这几行代码,就会知道,原理很简单了吧。。
运行效果如图所示
![](http://image109.360doc.com/DownloadImg/2020/03/0517/184602123_1_20200305053140409)
|