0
点赞
收藏
分享

微信扫一扫

使用 OpenCV 在 Python 中检测图像中的形状

夏天的枫_ 2022-01-20 阅读 250

OpenCV 是一个开源库,主要用于处理图像和视频以识别形状、对象、文本等。它主要与 python 一起使用。在本文中,我们将了解如何检测图像中的形状。为此,我们需要OpenCV 的cv2.findContours()函数,并且我们将使用cv2.drawContours()函数在图像上绘制边缘。轮廓是形状的轮廓或边界。

方法

  • 导入模块
  • 导入图片
  • 将其转换为灰度图像
  • 对图像应用阈值,然后找出轮廓。
  • 在轮廓范围内运行一个循环并遍历它。
  • 在这个循环中绘制形状的轮廓(使用 drawContours() )并找出形状的中心点。
  • 根据检测到的形状有多少个轮廓点对检测到的形状进行分类,并将检测到的形状名称放在形状的中心点。

使用的功能 

  • cv2.findContours():基本上这个方法找出图像中所有形状的边界点。
  • cv2.drawContours() :此方法绘制轮廓。如果您提供边界点,它也可以绘制形状。

输入:

程序:

  • Python3

import cv2

import numpy as np

from matplotlib import pyplot as plt

  

# reading image

img = cv2.imread('shapes.png')

  

# converting image into grayscale image

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  

# setting threshold of gray image

_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

  

# using a findContours() function

contours, _ = cv2.findContours(

    threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

  

i = 0

  

# list for storing names of shapes

for contour in contours:

  

    # here we are ignoring first counter because 

    # findcontour function detects whole image as shape

    if i == 0:

        i = 1

        continue

  

    # cv2.approxPloyDP() function to approximate the shape

    approx = cv2.approxPolyDP(

        contour, 0.01 * cv2.arcLength(contour, True), True)

      

    # using drawContours() function

    cv2.drawContours(img, [contour], 0, (0, 0, 255), 5)

  

    # finding center point of shape

    M = cv2.moments(contour)

    if M['m00'] != 0.0:

        x = int(M['m10']/M['m00'])

        y = int(M['m01']/M['m00'])

  

    # putting shape name at center of each shape

    if len(approx) == 3:

        cv2.putText(img, 'Triangle', (x, y),

                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

  

    elif len(approx) == 4:

        cv2.putText(img, 'Quadrilateral', (x, y),

                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

  

    elif len(approx) == 5:

        cv2.putText(img, 'Pentagon', (x, y),

                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

  

    elif len(approx) == 6:

        cv2.putText(img, 'Hexagon', (x, y),

                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

  

    else:

        cv2.putText(img, 'circle', (x, y),

                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

  

# displaying the image after drawing contours

cv2.imshow('shapes', img)

  

cv2.waitKey(0)

cv2.destroyAllWindows()

输出:

 

举报

相关推荐

0 条评论