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

news2024/9/30 9:23:40

目录

步骤:

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()

效果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1072941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在OpenWRT上自动重拨号获取公网IP(手记)

在OpenWRT上自动重拨号获取公网IP(手记) 前言 哈喽,大家是否有过这样的经历:想在家里搭建一个小型的服务器、或者是一个NAS,但由于运营商提供的IP地址是一个内网地址,但有一定的概率能获得公网IP。这篇文…

牙齿矫正后需要戴保持器有哪几种?

牙齿矫正后需要戴保持器有哪几种? 矫正牙齿一般是采取通过牙套产生的力量,能够使牙齿回归到正常的牙列当中,在矫正牙齿之后,就需要适当的佩戴保持器,能够起到固定牙齿的效果,目前临床上常见的保持器有两大…

COS流量被盗刷了

背景 家人们谁懂啊,早上起来发了日常的文章,出门的时候发现手机上腾讯云给的提示:COS欠费了。我不敢相信的我的眼睛!我之前每个月才花费几毛钱的,知道的伙伴都知道我这可是卖废品攒下来的钱!敢看了一下账单…

超高频RFID模具精细化生产管理方案

近二十年来,我国的模具行业经历了快速发展的阶段,然而,模具行业作为一个传统、复杂且竞争激烈的行业,企业往往以订单为导向,每个订单都需要进行新产品的开发,从客户需求分析、结构确定、报价、设计、物料准…

湖南互联网医院|湖南互联网医院牌照办理流程及材料

互联网医牌照,一个让医疗行业焕发数字化新生的通行证。随着时代的进步和技术的发展,互联网已经深入各个行业,医疗领域也不例外。而互联网医牌照的办理流程、内容以及所需材料,则是诸多医疗机构所关注的核心内容。 第一种是实体医…

centos7终端无图形界面安装tbb

1、官网下载tbb: https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#onetbb 2、终端执行: ./l_tbb_oneapi_p_2021.10.0.49543_offline.sh -a --cli3、cd /opt/intel/oneapi 4、source setvars.sh …

一文搞懂二叉树中序遍历的三种方法

系列文章: 相关题目: 94. 二叉树的中序遍历 中序遍历结果为:4 2 5 1 6 3 7 总体上分为两种框架,递归框架和非递归框架,递归框架又分为两种思路:分解思路和遍历思路。 递归 1、分解思路 【分解为子问题】…

微信小程序数据传递的综合指南

前言 数据传递是现代应用程序开发中的一个关键问题。在微信小程序中,传递数据的方式有很多种,每种方式都有其适用的场景和优势。在本文中,我将为大家介绍微信小程序中常用的数据传递方式,并提供一些实用的技巧和建议,帮…

图像分块及拼接

原图: 分块结果: 拼接结果: 代码: import numpy as np import cv2 as cv import matplotlib.pyplot as pltdef get_patch(img,patch_size):imgs []h,w,n img.shapenew_h, new_w patch_size, patch_sizecolint(w/patch_siz…

深度森林(deep-forest)安装

深度森林(deep-forest)安装 1、打开https://pypi.org/,搜索deep-forest,下载wheel文件 在下载好之后,打开文件下载的位置 首先对下载好的wheel文件进行改名,原名是: deep_forest-0.1.7-cp39-c…

符合 EN55022B 规格、LTM4613EY、LTM4613MPV直流µModule稳压器【RG500Q 5G Sub-6 GHz 模块】

一、LTM4613,符合 EN55022B 规格的 36VIN、15VOUT、8A、DC/DC Module 稳压器 (简介)LTM4613 是一款完整、超低噪声、8A 开关模式 DC/DC 电源。封装中内置了开关控制器、功率 FET、电感器和所有的支持元件。LTM4613 的工作输入电压范围为 5V 至…

springboot家政服务管理平台springboot29

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

【数据库审计】2023年数据库审计厂家汇总

我们大家都知道数据库审计的重要意义,不仅可以满足等保合规,还能进行风险告警,保障数据安全。那你知道目前市面上数据库审计厂家有哪些吗?这里小编就给大家汇总一下。 2023年数据库审计厂家汇总 1、行云管家 2、安恒信息 3、…

头戴式耳机什么牌子最好?头戴式耳机推荐性价比高

脖子上挎个头戴式作为随身装备,不仅给服装配饰添加了潮流感,还可以可以随时聆听音乐,随着广大消费者的生活水平不断提高,市面上的头戴式耳机越来越多。 选择头戴式耳机时无非就是听音质、看外观、舒适度等等,那么头戴…

c++视觉----方框滤波

方框滤波 cv::boxFilter()函数是OpenCV中用于应用方框滤波的函数。方框滤波是一种基本的平滑滤波方法,它使用一个均匀权重的矩形核来平均处理像素的值。 以下是cv::boxFilter()函数的基本用法: void cv::boxFilter(cv::InputArray src, // 输入图…

[引擎开发] 杂谈ue4中的Vulkan

接触Vulkan大概也有大半年,概述一下自己这段时间了解到的东西。本文实际上是杂谈性质而非综述性质,带有严重的主观认知,因此并没有那么严谨。 使用Vulkan会带来什么呢?简单来说就是对底层更好的控制。这意味着我们能够有更多的手段…

为什么要学C语言及C语言存在的意义

为什么要学C语言及C语言存在的意义 汇编生C,C生万物。linus说自己最喜欢的语言就是C语言,因为看到写出的代码就能想到对应的汇编码。一方面说明C语言足够简洁,没有像C中一样的复杂概念封装,另一方面也说明C语言足够的底层&#xf…

二、Nginx启停命令和升级更新

1.Nginx服务器启停命令 1.1Nginx服务的信号控制(省略) 1.2Nginx的命令行控制 nginx -? 或者 nginx -h显示帮助信息nginx -v打印版本号信息并退出nginx -V打印版本号信息和配置信息并退出nginx -t测试nginx的配置文件语法是否正确并退出nginx -T测试ng…

弱电工程师和单片机工程师未来那行更有前景?

弱电工程师和单片机工程师未来那行更有前景? 单片机行业不太懂,但是感觉上,单片机行业会更加专业一点,偏研发多一点。 下面稍微说下弱电工程师这个部分,从两个维度上去说,一个是做哪些事情,一个是做哪些系…

L1-035 情人节 c++解法

题目再现 以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。 输入格式: 输入…