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

这篇具有很好参考价值的文章主要介绍了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()

效果展示:

OpenCV实现单目相机检测物体尺寸,OpenCV从入门到精通,opencv,人工智能,单目相机,计算机视觉,python,图像处理文章来源地址https://www.toymoban.com/news/detail-727298.html

到了这里,关于OpenCV实现单目相机检测物体尺寸的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV实现求解单目相机位姿

            单目相机通过对极约束来求解相机运动的位姿。参考了ORBSLAM中单目实现的代码,这里用opencv来实现最简单的位姿估计.    首先通过ORB特征提取,获取两幅图像的匹配度,我将其连线出来的效果:   RANSAC的算法原理可以google,很容易理解。先看看ORBSLAM中的实现:

    2024年02月06日
    浏览(46)
  • 基于opencv测量图片中物体的尺寸(matlab实现)

    问题重述 已知书本上右下角放一枚一元人民币(直径2.5厘米),请利用计算机视觉技术预测图片中目标的实际尺寸。 手动或自动地对已知物体进行标注和测量,得到其尺寸信息(例如像素大小)。 对图像进行预处理,包括灰度化、二值化、去除噪声等操作,以便更好地分割

    2024年02月10日
    浏览(135)
  • 【计算机视觉】OpenCV实现单目相机标定

    文章目录 单目相机标定(基于Python OpenCV) 1.上期填坑 2.单目相机标定 2.1 数据采集 2.2 角点提取 2.3 参数求解 2.4 参数评估(重投影误差) 2.5 相机位姿(棋盘位姿)可视化 2.6 同Matlab标定结果比较 在开始本篇博客之前,先填一下上一篇博客【计算机视觉】基于ORB角点+RANSAC算法实现图像

    2023年04月18日
    浏览(62)
  • 单目相机测距(3米范围内)二维码实现方案(python代码 仅仅依赖opencv)

    总体思路:先通过opencv 识别二维码的的四个像素角位置,然后把二维码的物理位置设置为 ,相当于这是一个任意找的物体上的四个点,对应的我们找到了在图像中对应的像素坐标。这就解决了世界坐标系与像素坐标系之间的对应问题,然后再通过PNP求解的方式,就可以通过

    2024年02月04日
    浏览(47)
  • OpenCV快速入门:移动物体检测和目标跟踪

    在当今的数字化世界中,计算机视觉技术正在迅速发展并被广泛应用于各种场合。特别是在移动物体检测和目标跟踪领域,这项技术不仅对于安全监控系统至关重要,也在自动驾驶、交互式媒体、机器人技术等多个领域发挥着重要作用。 本文将介绍使用OpenCV进行移动物体检测

    2024年02月04日
    浏览(48)
  • 【单目3D】在自动驾驶中将 2D 物体检测提升到 3D

    单目 3D 目标检测使用 RGB 图像来预测目标 3D 边界框。由于 RGB 图像中缺少关键的深度信息,因此该任务从根本上说是不适定的。然而在自动驾驶中,汽车是具有(大部分)已知形状和大小的刚体。那么一个关键的问题是如何有效地利用汽车的强大先验,在传统 2D 对象检测之上

    2024年02月19日
    浏览(38)
  • opencv实战---物体尺寸测量

    物体尺寸测量的思路是找一个确定尺寸的物体作为参照物,根据已知的计算未知物体尺寸。 如下图所示,绿色的板子尺寸为220*300(单位:毫米),通过程序计算白色纸片的长度。 目录 1、相关库 2、读图+图片预处理 3、寻找轮廓 4、找到参照物的轮廓,并且进行图像矫正 5、

    2023年04月13日
    浏览(45)
  • 基于YOLOv8和RealsenseD455相机实现物体距离检测

    目录 前言 一、Yolov8环境搭建 二、配置RealSense-ros功能包 1.安装ROS-humble 2.安装Intel RealSense SDK 2.0 ​编辑 3.克隆ROS功能包 三、物体距离检测代码实现 1.算法流程: 2.代码示例: 3.效果展示: 要基于YOLOv8和RealsenseD455相机实现物体距离检测,可以按照以下步骤进行操作: 准备环境

    2024年01月17日
    浏览(43)
  • opencv-python实战---物体长度尺寸测量

    本文的主要算法实现思路:找一个最小面积的矩形提供长宽由此推算出其他物体的长度 博主只写了测量物体最左最右的长度,只能测量矩形。 如图  最左边的为参照物,然后测量上下两个物体的最左和最右长度。 opencv-python  == 4.7.0.72 numpy == 1.24.2 minArea为图片中最小的识别面

    2024年02月13日
    浏览(45)
  • 棋盘格测距-单目相机(OpenCV/C++)

    1’ 通过cv::findChessboardCorners寻找棋盘格角点 2‘ 用cv::solvePnP计算旋转向量rvec和平移向量tvec 3’ 通过公式计算相机到棋盘格的距离   已完成单目相机标定的情况下: (可以参考  虽然是我很久之前写的python的,但实现是没啥问题) 需要以下内容: 1、已知相机的内参矩阵 c

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包