等高线可以简单地解释为连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度。等高线是形状分析、目标检测和识别的有用工具。
cv2.findcontours() 函数中有三个参数,
第一个是源图像
第二个是轮廓检索模式
第三个是轮廓近似方法
它输出图像、轮廓和层次。轮廓是图像中所有轮廓的python列表。每个轮廓都是对象边界点(x,y)坐标的numpy数组。
使用 cv2.drawContours, 它也可以用来绘制任何给出边界点的形状。它的第一个参数是源图像,第二个参数是应该作为等高线列表,第三个参数是等高线索引(在绘制个体轮廓时使用)。要绘制所有轮廓,传递-1)、颜色、厚度等。
要绘制图像中的所有轮廓:
要绘制第4个轮廓:
但大多数情况下,下面的方法更适合:
这是 cv2.findContours 函数中的第三个参数的说明。
如果传递 cv2.CHAIN_APPROX_NONE,则存储所有边界点。但实际上我们需要所有的要点吗?例如,你发现了一条直线的轮廓。你需要这条线上所有的点来代表这条线吗?不,我们只需要这条线的两个端点。这就是 cv2.CHAIN_APPROX_SIMPLE所做的。它删除所有冗余点并压缩轮廓,从而节省内存。
你可以提取有用的数据,如面积、质心等。质心可以通过下面的方式来获取
它将一个轮廓形状近似为另一个形状,根据我们指定的精度,顶点数量较少。
为了理解这一点,假设您试图在图像中找到一个正方形,但是由于图像中的一些问题,您没有得到一个完美的正方形,而是一个“坏形状”(如下面第一幅图像所示)。现在可以使用此函数来近似形状。在这里,第二个参数称为epsilon,它是从轮廓到近似轮廓的最大距离。这是一个精度参数。为了得到正确的输出,需要明智地选择epsilon。
下图,在第二幅图像中,绿线显示了epsilon=10%弧长的近似曲线。第三张图片显示的epsilon=弧长的1%相同。第三个参数指定曲线是否关闭。
凸面船体看起来类似于轮廓近似,但事实并非如此(在某些情况下两者都可能提供相同的结果)。在这里,cv2.converxHull()函数检查曲线是否存在凸性缺陷,并对其进行修正。一般来说,凸曲线是指总是凸出的曲线,或者至少是平的曲线。如果它在内部膨胀,就称为凸性缺陷。例如,检查下面的手图像。红线表示手的凸面外壳。双面箭头标记显示了凸性缺陷,即船体与轮廓的局部最大偏差。
points 是我们经过的轮廓。
hull 是输出,通常我们避免它。
clockwise :方向标志。如果为真,则输出凸壳为顺时针方向。否则,它是逆时针方向的。
returnPoints :默认为真。然后返回船体点的坐标。如果为false,则返回与外壳点对应的轮廓点索引。
因此,如上图所示,要得到一个凸面外壳,以下就足够了:
有一个函数可以检查曲线是否是凸的,cv2.isContourConvex()。它只是返回正确还是错误。
直的矩形,不考虑物体的旋转。所以边界矩形的面积不会是最小的。它由函数 cv2.boundingrect() 找到。
设(x,y)为矩形信态扒的左上角坐标,(w,h)为滑昌矩形的宽度和高度。
在这里,边界矩形是用最小面积绘制的,因此它也考虑了旋转。使用的函数是 cv2.minareect() 。但是要画这个矩形,我们需要四个角。它是通过函数 cv2.boxpoints() 获得的。
在这里闭禅,我们将学习提取一些经常使用的对象属性,如坚固性、等效直径、遮罩图像、平均强度等。
范围是轮廓区域与边界矩形区域的比率。
坚固性是指轮廓面积与其凸面外壳面积之比。
等效直径是面积与轮廓面积相同的圆的直径。
方向是指向对象的角度。下面的方法也给出了长轴和短轴的长度。
在某些情况下,我们可能需要包含该对象的所有点。可以这样做:
这里,有两种方法,一种是使用numpy函数,另一种是使用opencv函数(最后一行注释)。结果也相同,但有轻微的差异。numpy以(行、列)格式给出坐标,而opencv以(x、y)格式给出坐标。所以基本上答案会互换。注意,row=x,column=y。
极端点是指物体的最上面、最下面、最右边和最左边的点。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)