这几天一直在学习特征点检测、角点检测相关的内容,更新的略慢,这篇博文将主要介绍一下图像的轮廓方面的知识和openCV中的相关操作。
轮廓检测
参考资料
- OpenCV-Python Tutorial
- Computer Vision: Algorithms and Applications
0. 什么是轮廓?
所谓轮廓,简单地可以解释为,一些连续的,沿着曲线边界的,点的集合,这些点拥有相同的颜色或者亮度。【In English, Contours can be explained simply as a curve joining all the continuous points (along the boundary), having same color or intensity。】这些轮廓往往在目标检测和目标识别中很有作用。
下面是几个在使用opencv作轮廓检测时需要注意的点:
- 为了更精确地提取轮廓,请使用二值图。也就是说,在使用轮廓提取函数前,请将源图片运用阈值进行
二值化(cv2.threshold())
或者采用Canny边缘检测
。 - findContours 函数会修改源图片,如果希望在轮廓检测后继续使用源图片,务必提前保存在另一个变量中。
- 在OpenCV中,轮廓检测视作从黑色背景中提取白色的物体,所以,在结果中,白色表示物体,黑色表示背景。
1. 基本使用
下面是一个轮廓检测的基本使用例子:
def find_contours_of_binary_image():
im = cv2.imread('rectangle.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print("一共检测到%d个轮廓" % len(contours))
for i in range(len(contours)):
print("第%d个轮廓:" % (i + 1))
print(contours[i])
# -1 代表画出所有轮廓
res