0

我正在学习如何识别提供的图像中的形状。我能够通过几何体中存在的边数来识别形状。但现在我想知道有没有办法区分图像中的正方形和矩形?这是我的代码。目前我只是为几何图形绘制轮廓。

import cv2

raw_image = cv2.imread('test1.png')
cv2.imshow('Original Image', raw_image)
cv2.waitKey(0)

bilateral_filtered_image = cv2.bilateralFilter(raw_image, 5, 175, 175)
cv2.imshow('Bilateral', bilateral_filtered_image)
cv2.waitKey(0)

edge_detected_image = cv2.Canny(bilateral_filtered_image, 75, 200)
cv2.imshow('Edge', edge_detected_image)
cv2.waitKey(0)

_, contours, hierarchy = cv2.findContours(edge_detected_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

contour_list = []
for contour in contours:
    approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)
    area = cv2.contourArea(contour)
    if ((len(approx) >= 3)):
        contour_list.append(contour)

cv2.drawContours(raw_image, contour_list,  -1, (0,0,0), 2)
cv2.imshow('Objects Detected',raw_image)
cv2.waitKey(0)

这是示例图像

4

4 回答 4

3

如果它的宽度和高度相同,它就是一个正方形。否则它是一个矩形。

for contour in contours:
    approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)
    area = cv2.contourArea(contour)
    if ((len(approx) == 4)):
        (x, y, w, h) = cv2.boundingRect(approx)
        if  ((float(w)/h)==1):
            cv2.putText(raw_image, "square", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.7, 0, 2)
        else:
            cv2.putText(raw_image, "rectangle", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.7, 0, 2)

        contour_list.append(contour)

此更改仅检测正方形和矩形。在 for 循环中进行必要的更改以检测圆圈。您可以与之合作len(approx)以做出这种区分。

在此处输入图像描述

于 2017-11-13T06:07:02.867 回答
1

我有另一种方法:

  1. 找到所有连接的组件。

  2. 找到原始图像中的特征点,因为在这种情况下我们有简单的几何体而不是复杂的物体,您可以使用 Harris 角点算法将角点作为特征点。

  3. 将位于相同连接组件上的这些特征点分组。

  4. 在所有连接的组件上使用这些特征点之间的关系(距离/角度),因此您可以对这些几何形状进行分类。

于 2017-11-13T05:28:41.140 回答
1

矩形和正方形之间的区别在于正方形有 4 条相等的边,使其成为特殊的矩形。我在幼儿园学到了这个。

有无数种方法可以识别正方形。

它的周长总是等于 sqrt(area),因此它的圆度总是 0.0625

所有角之间的距离是 a 或 a * sqrt(2)

质心到所有 4 个边的距离 a / 2 相同

...

你给它命名。

于 2017-11-13T06:15:03.557 回答
0

我在评论中读到形状可能会旋转。在这种情况下 cv2.boundingRect() 不会给出正确的结果,因为这个函数总是给出一个直立的矩形。对于一般检测矩形(旋转与否),您应该尝试 cv2.minAreaRect() 它将返回一个矩形,该矩形将根据轮廓旋转,并且具有覆盖轮廓的最小区域。然后,您可以检查其纵横比以查看它是正方形还是矩形。

于 2020-05-03T16:47:29.337 回答