使用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(Contourpt