OpenCV中几何形状识别

引言

OpenCV是一个非常强大的开源计算机视觉库,它提供了大量用于图像处理和计算机视觉任务的函数和工具。其中之一是几何形状识别,它可以识别图像中的几何形状,如圆、矩形、三角形等。本文将介绍如何使用OpenCV进行几何形状识别,并给出相关的代码示例。

准备工作

在开始之前,我们需要安装OpenCV库。可以使用以下命令在Python环境中安装OpenCV:

pip install opencv-python

安装完成后,我们可以开始编写代码了。

识别几何形状

下面是一个使用OpenCV进行几何形状识别的示例代码:

import cv2
import numpy as np

def detect_shapes(image_path):
    # 读取图像
    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)

    # 边缘检测
    edges = cv2.Canny(blurred, 50, 150)

    # 轮廓检测
    contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for contour in contours:
        # 近似多边形
        approx = cv2.approxPolyDP(contour, 0.04 * cv2.arcLength(contour, True), True)

        # 根据边数判断几何形状
        if len(approx) == 3:
            shape = "Triangle"
        elif len(approx) == 4:
            x, y, w, h = cv2.boundingRect(approx)
            aspect_ratio = float(w) / h
            if aspect_ratio >= 0.95 and aspect_ratio <= 1.05:
                shape = "Square"
            else:
                shape = "Rectangle"
        elif len(approx) == 5:
            shape = "Pentagon"
        else:
            shape = "Circle"

        # 在图像上绘制几何形状
        cv2.drawContours(image, [approx], -1, (0, 255, 0), 2)
        cv2.putText(image, shape, (approx[0][0][0], approx[0][0][1]), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

    # 显示图像
    cv2.imshow("Shapes", image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 调用函数进行几何形状识别
detect_shapes("image.jpg")

在此示例中,我们首先读取图像,并将其转换为灰度图像。然后,我们对灰度图像进行模糊处理和边缘检测,以找到图像中的边缘。接下来,我们使用轮廓检测函数找到图像中的轮廓。然后,我们对每一个轮廓进行多边形近似,并根据边数判断几何形状。最后,我们在图像上绘制出识别到的几何形状。

类图

下面是OpenCV中几何形状识别的类图:

classDiagram
    class OpenCV {
        + detect_shapes(image_path: str): None
    }

    class Image {
        - path: str
        + __init__(path: str)
        + read(): None
        + show(): None
        + apply_filter(filter: Filter): None
    }

    class Filter {
        + apply(image: Image): None
    }

    class GrayScaleFilter {
        + apply(image: Image): None
    }

    class BlurFilter {
        + apply(image: Image): None
    }

    class CannyFilter {
        + apply(image: Image): None
    }

    class ContourDetector {
        + detect(image: Image): List[Contour]
    }

    class Contour {
        - points: List[Point]
        + __init__(points: List[Point])
        + approximate(epsilon: float): List[Point]
    }

    class Point {
        - x: int
        - y: int
        + __init__(x: int, y: int)
    }

    OpenCV --> Image
    Image --> Filter
    Filter <|-- GrayScaleFilter
    Filter <|-- BlurFilter