📜  使用 OpenCV 查找和绘制轮廓 | Python

📅  最后修改于: 2022-05-13 01:54:48.479000             🧑  作者: Mango

使用 OpenCV 查找和绘制轮廓 | Python

轮廓被定义为连接沿图像边界具有相同强度的所有点的线。轮廓在形状分析、查找感兴趣对象的大小和对象检测中派上用场。

OpenCV 具有findContour()函数,有助于从图像中提取轮廓。它在二值图像上效果最好,所以我们应该首先应用阈值技术、Sobel 边缘等。

下面是寻找轮廓的代码——

import cv2
import numpy as np
  
# Let's load a simple image with 3 black squares
image = cv2.imread('C://Users//gfg//shapes.jpg')
cv2.waitKey(0)
  
# Grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  
# Find Canny edges
edged = cv2.Canny(gray, 30, 200)
cv2.waitKey(0)
  
# Finding Contours
# Use a copy of the image e.g. edged.copy()
# since findContours alters the image
contours, hierarchy = cv2.findContours(edged, 
    cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
  
cv2.imshow('Canny Edges After Contouring', edged)
cv2.waitKey(0)
  
print("Number of Contours found = " + str(len(contours)))
  
# Draw all contours
# -1 signifies drawing all contours
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
  
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

我们看到cv2.findContours()函数中有三个基本参数。第一个是源图像,第二个是轮廓检索模式,第三个是轮廓逼近方法,它输出图像、轮廓和层次结构。 “轮廓”是图像中所有轮廓的Python列表。每个单独的轮廓都是对象边界点的 (x, y) 坐标的 Numpy 数组。

轮廓近似法 –
在上面,我们看到轮廓是具有相同强度的形状的边界。它存储形状边界的 (x, y) 坐标。但它会存储所有坐标吗?这是由这种轮廓近似方法指定的。
如果我们通过cv2.CHAIN_APPROX_NONE ,则存储所有边界点。但实际上,我们需要所有的点吗?例如,如果我们必须找到一条直线的轮廓。我们只需要那条线的两个端点。这就是cv2.CHAIN_APPROX_SIMPLE所做的。它去除所有冗余点并压缩轮廓,从而节省内存。