OpenCV实现单目相机检测物体尺寸

目录

步骤:

Canny边缘检测算法介绍:

多边形逼近

代码实现:

效果展示:


步骤:

  1. 导入必要的库:cv2用于图像处理,numpy用于数组操作。
  2. 定义了一个函数preprocess,用于对图像进行预处理。首先将图像转换为灰度图,然后进行高斯模糊来平滑图像。接着使用腐蚀操作进一步去除噪声,并最后通过Canny边缘检测算法得到图像的边缘。
  3. 定义了一个函数get_object_contour,用于获取物体的轮廓并进行多边形逼近。它使用cv2.findContours函数来获取图像中的轮廓,并找出最大的轮廓。然后使用cv2.approxPolyDP进行多边形逼近,并绘制出逼近的多边形。
  4. 打开摄像头,创建VideoCapture对象。
  5. 进入循环,读取摄像头捕获的图像。
  6. 调用preprocess函数对图像进行预处理和边缘检测。
  7. 调用get_object_contour函数获取物体的轮廓并进行多边形逼近。
  8. 在原图上绘制出逼近的多边形。
  9. 显示处理后的图像。
  10. 如果按下ESC键,则退出循环。
  11. 释放摄像头和窗口。

这段代码可以实现实时检测物体边缘并进行可视化显示。您需要根据实际情况调整摄像头的索引(例如0表示默认摄像头,1表示外部摄像头)。

Canny边缘检测算法介绍:

Canny边缘检测算法是一种经典且广泛应用的图像边缘检测算法,由John F. Canny于1986年提出。它的主要目标是发现图像中最明显的边缘,并尽量减少误检和漏检。

Canny边缘检测算法的步骤如下:

  1. 高斯模糊(Gaussian Blur):为了减少噪声对边缘检测的影响,首先对图像进行高斯模糊处理。高斯模糊通过使用一个高斯核函数对图像进行卷积操作,使得图像的细节被模糊化,从而平滑图像。

  2. 计算图像梯度(Gradient Computation):使用Sobel算子计算图像在水平和垂直方向上的梯度值。梯度表示图像中像素强度变化最大的方向,可以用来定位边缘。

  3. 非极大值抑制(Non-maximum Suppression):在图像的梯度方向上,对每个像素点进行非极大值抑制。这一步的目的是保留梯度变化最大的像素点,抑制其他像素点,进一步细化边缘。

  4. 双阈值处理和边缘连接(Double Thresholding and Edge Tracking):根据设定的阈值,将梯度幅值分为强边缘、弱边缘和非边缘三个部分。其中,高于高阈值的像素被确定为强边缘,低于低阈值的像素被排除,而介于两个阈值之间的像素被标记为弱边缘。然后,通过强边缘像素附近连接的方式,将弱边缘像素与强边缘像素进行连接,形成完整的边缘。

Canny边缘检测算法利用了梯度和边缘灰度变化的特点,具有良好的准确性和较低的误检率。它在计算机视觉、图像处理等领域广泛应用,常用于目标检测、边缘提取、图像分割等任务。

多边形逼近

approx = cv2.approxPolyDP(max_contour, epsilon, True)

原理:

cv2.approxPolyDP是OpenCV中的一个函数,用于对轮廓进行多边形逼近。

多边形逼近的原理是通过使用Douglas-Peucker算法来近似表示一条曲线(即轮廓)为更简单的多边形。该算法会选择曲线上的关键点,并删除其中一些点,以保持逼近误差在可接受范围内。这样可以将复杂的曲线轮廓逼近为近似的多边形轮廓。

函数cv2.approxPolyDP的参数包括输入的轮廓、所需逼近的精度(即逼近的程度)以及布尔值closed用于指示是否封闭多边形。逼近的精度由一个称为ε(epsilon)的参数决定,它定义了逼近的最大距离。

首先,cv2.approxPolyDP会根据输入的轮廓计算出逼近的多边形轮廓。然后,根据逼近的结果,将多边形的顶点绘制在图像上。

通过调整逼近的精度参数ε,可以控制多边形逼近的程度。较小的ε会得到更接近原始轮廓的多边形,而较大的ε会得到更简化的多边形。

多边形逼近在图像处理中常用于边缘检测、轮廓分析、形状识别等任务。它可以将复杂的轮廓简化为更易处理的形状,并提取出物体的大致形状和结构信息。

代码实现:

import cv2
import numpy as np


def preprocess(image):
    # 进行图像预处理(例如灰度化、高斯模糊等)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    kernal = np.ones((5, 5), np.uint8)
    blurred = cv2.erode(blurred, kernal)  # 腐蚀
    blurred = cv2.erode(blurred, kernal)
    edges = cv2.Canny(blurred, 50, 150)

    return edges


def get_object_contour(image):
    # 获取物体轮廓
    _, contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if len(contours) > 0:
        # 找出最大的轮廓
        max_contour = max(contours, key=cv2.contourArea)
        # 进行多边形逼近
        epsilon = 0.02 * cv2.arcLength(max_contour, True)
        approx = cv2.approxPolyDP(max_contour, epsilon, True)
        # 绘制逼近的多边形
        cv2.drawContours(frame, [approx], 0, (0, 255, 0), 2)
        return approx
    return None


# 打开摄像头
cap = cv2.VideoCapture(1)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 图像预处理及边缘检测
    edges = preprocess(frame)

    # 获取物体轮廓并进行多边形逼近
    approx = get_object_contour(edges)

    # 显示图像
    cv2.imshow('Object Detection', frame)

    # 按下ESC键退出
    if cv2.waitKey(1) == 27:
        break

# 释放摄像头和窗口
cap.release()
cv2.destroyAllWindows()

效果展示:

相关推荐
昨日之日200632 分钟前
Moonshine - 新型开源ASR(语音识别)模型,体积小,速度快,比OpenAI Whisper快五倍 本地一键整合包下载
人工智能·whisper·语音识别
浮生如梦_34 分钟前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
深度学习lover35 分钟前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
热爱跑步的恒川2 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
API快乐传递者2 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
阡之尘埃4 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
孙同学要努力6 小时前
全连接神经网络案例——手写数字识别
人工智能·深度学习·神经网络
Eric.Lee20216 小时前
yolo v5 开源项目
人工智能·yolo·目标检测·计算机视觉
其实吧37 小时前
基于Matlab的图像融合研究设计
人工智能·计算机视觉·matlab
丕羽7 小时前
【Pytorch】基本语法
人工智能·pytorch·python