使用OpenCV的findContours函数查找轮廓,当参数为CV_RETR_LIST时,查找到的轮廓不建立等级关系,也就是当前模式下不存在父轮廓或内嵌轮廓的位置关系,所以当图中存在环形轮廓内外嵌套时(如下图所示数字轮廓8),如果要判断轮廓位置关系,需要自行判断。判断方法是可通过遍历轮廓点,计算每个轮廓点的四邻域点的灰度值来判断,方法一调用OpenCV的pointPolygonTest函数来判断点是否在轮廓内部,方法二则是通过点的灰度值来判断是否在轮廓内部,方法二相较于方法一运行速度更快。

方法一:
cv::Mat src;//二值图像
std::vector<std::vector<cv::Point>> allContours;//轮廓
std::vector<cv::Vec4i> allHierarchy;//层次结构信息
//查找轮廓
cv::findContours(src, allContours, allHierarchy, cv::RETR_LIST, cv::CHAIN_APPROX_NONE, cv::Point(0, 0));
int cnt = 0;
std::vector<cv::Point> Contourpts = allContours [0];
for (int i = 0; i < Contourpts.size(); i++)
{
cv::Point point1, point2, point3, point4;
point1 = cv::Point(Contourpts[i].x, std::min(Contourpts[i].y + 1, src.rows - 1));
point2 = cv::Point(std::min(Contourpts[i].x + 1, src.cols - 1

本文介绍了如何使用OpenCV在CV_RETR_LIST模式下判断轮廓是内轮廓还是外轮廓。当存在环形轮廓内外嵌套时,可以借助pointPolygonTest函数或通过点的灰度值判断。方法二在效率上优于方法一。

6万+

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



