如何检查一个轮廓是否嵌套/嵌入opencv中

pzo*_*pzo 9 opencv image-processing hierarchy contour

我有两个轮廓,我想检查它们之间的关系(如果其中一个是嵌套的).通常,我会将findContours函数与CV_RETR_TREE检索模式一起使用.但是,我从不同的来源获得了轮廓(使用MSER方法).我实际上不仅有轮廓,还有区域遮罩,如果有帮助的话.例如,假设我想将字母"O"分段,那么我将使用以下蒙版或轮廓:

1)

0 0 0 0 0 0
0 1 1 1 1 0
0 1 0 0 1 0
0 1 0 0 1 0
0 1 1 1 1 0
0 0 0 0 0 0 
Run Code Online (Sandbox Code Playgroud)

2)

0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 1 0 0
0 0 1 1 0 0
0 0 0 0 0 0
0 0 0 0 0 0 
Run Code Online (Sandbox Code Playgroud)

如何轻松检查第二个轮廓在第一个轮廓内?我考虑过检查边界框之间的关系,但这并未涵盖所有可能的情况.

Sam*_*Sam 7

使用cv::pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)要知道从轮廓上的点是否在另一个里面.

您必须检查边界情况(您选择的第一个点对于两个多边形都是通用的,等等)

if(pointPolygonTest(contour, pointFromOtherContour, false) > 0)
{
    // it is inside
}
Run Code Online (Sandbox Code Playgroud)

该函数确定该点是在轮廓内,外部还是位于边缘(或与顶点重合).它相应地返回正(内部),负(外部)或零(边缘)值.

何时measureDist=false,返回值分别为+ 1,-1和0.否则,返回值是该点与最近轮廓边之间的有符号距离.