open CV识别矩形

本文介绍了如何使用OpenCV库在灰度图像中识别矩形,通过Canny边缘检测、轮廓检测和优化条件(面积、长宽比)来减少误判。提供了Python示例代码并讨论了改进方法。
摘要由CSDN通过智能技术生成

要使用OpenCV库在一幅灰度图像中识别所有的矩形,你可以采取以下步骤:

  1. 加载图像并将其转换为灰度图像。
  2. 使用边缘检测算法(如Canny边缘检测)检测图像中的边缘。
  3. 使用轮廓检测函数(cv2.findContours())找到所有的轮廓。
  4. 对每个检测到的轮廓进行逼近以获得矩形。
  5. 过滤掉太小或太大的矩形。
  6. 绘制矩形并显示结果。

下面是一个基本的Python示例代码:

import cv2
import numpy as np

# 加载图像
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

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

# 遍历轮廓
for contour in contours:
    # 计算轮廓的周长
    perimeter = cv2.arcLength(contour, True)
    # 近似轮廓
    approx = cv2.approxPolyDP(contour, 0.02 * perimeter, True)
    # 如果近似轮廓有四个顶点,则认为它是一个矩形
    if len(approx) == 4:
        # 绘制矩形
        cv2.drawContours(image, [approx], 0, (0, 255, 0), 2)

# 显示结果
cv2.imshow('Rectangles', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
 

确保将 'image.jpg' 替换为你要处理的图像的路径。这个代码会在图像中找到所有的矩形并用绿色的线框标出。

但上述代码在执行过程中出现误判,对于一些明显不是矩形的地方仍然被识别为了矩形,对上述代码优化以解决此问题

你可以考虑以下几种方法:

  1. 添加面积限制: 可以排除面积太小或太大的轮廓,以减少误判。
  2. 添加长宽比限制: 可以排除长宽比不符合矩形的轮廓,如过于细长或过于扁平的轮廓。
  3. 添加角度限制: 可以排除倾斜角度太大的轮廓,以减少对非直角矩形的误判。
  4. 更严格的逼近: 考虑调整逼近方法的参数,以获取更接近实际矩形形状的轮廓。

下面是修改后的代码:

import cv2
import numpy as np

# 加载图像
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

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

# 遍历轮廓
for contour in contours:
    # 计算轮廓的面积
    area = cv2.contourArea(contour)
    # 计算轮廓的周长
    perimeter = cv2.arcLength(contour, True)
    # 近似轮廓
    epsilon = 0.02 * perimeter
    approx = cv2.approxPolyDP(contour, epsilon, True)
    # 如果近似轮廓有四个顶点,则认为它是一个矩形
    if len(approx) == 4 and area > 1000 and area < 10000:  # 添加面积限制
        # 获取矩形的边界框
        x, y, w, h = cv2.boundingRect(approx)
        aspect_ratio = float(w) / h
        # 添加长宽比限制
        if aspect_ratio > 0.8 and aspect_ratio < 1.2:
            # 绘制矩形
            cv2.drawContours(image, [approx], 0, (0, 255, 0), 2)

# 显示结果
cv2.imshow('Rectangles', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个修改后的代码在轮廓近似之前添加了面积限制,并在识别矩形后添加了长宽比限制。确保调整面积和长宽比的阈值以适应你的特定应用场景。

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值