使用OpenCV对图像进行三角形检测、颜色识别与距离估算【附代码】

文章目录

  • 前言
  • 功能概述
  • 必要环境
  • 一、代码结构
    • 1. 参数定义
    • 2. 距离估计
    • 3. 颜色转换
    • 4. 图像处理函数
      • 4.1 读取图像和预处理
      • 4.2 轮廓检测
      • 4.3 过滤面积并检测三角形
      • 4.4 提取边框并计算距离
  • 二、效果展示
    • 红色三角形
    • 绿色三角形
    • 蓝色三角形
    • 黄色三角形
  • 三、完整代码获取
  • 总结


前言

本文将介绍一个基于OpenCV的课题项目,该项目的实现过程包括图像的读取与预处理、轮廓检测、形状识别、颜色分析以及距离计算。所涉及的技术和方法可以广泛应用于机器人视觉系统、自动化检测设备以及其他需要图像识别与处理的场景


功能概述

1. 三角形检测:从图像中检测出三角形
2. 颜色识别:分析每个三角形的颜色并转换为相应的英文名称
3. 距离估算:基于图像中三角形的像素高度,估算其实际距离


必要环境

安装OpenCV和NumPy库

  1. 安装opencv:
    pip install opencv-python==4.4.0.42 -i https://pypi.tuna.tsinghua.edu.cn/simple
    
  2. 安装numpy:
    pip install numpy==1.23.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
    

一、代码结构

1. 参数定义

parser = argparse.ArgumentParser(description="Process images to detect contours and classify colors.")
parser.add_argument("--folder_path", type=str, default='src', help="Path to the folder containing images.")
parser.add_argument("--min_area", type=int, default=5000, help="Minimum area of contours to be considered.")
args = parser.parse_args()

参数作用如下:
–folder_path:指定要处理的图片文件夹路径
–min_area:设置轮廓的最小面积,低于该面积的轮廓将被忽略

2. 距离估计

该函数接收物体在图像中的像素高度、物体的实际高度以及相机的焦距,最终返回相机到物体的距离

def compute_zc_real_height(pixel_height, real_height, fy):zc = (real_height * fy) / pixel_heightreturn zc

3. 颜色转换

该函数用于将图像中计算出的颜色均值,转换为对应的英文颜色名称,并计算颜色均值与预定义颜色的距离,将其归类为最接近的颜色类别

def color_to_chinese_name(mean_val):color_names = {(10, 30, 90): "red",(21, 62, 21): "green",(75, 60, 12): "blue",(5, 81, 121): "yellow",}mean_val = tuple(map(int, mean_val[:3]))closest_color = min(color_names.keys(), key=lambda c: np.linalg.norm(np.array(c) - np.array(mean_val)))return color_names[closest_color]

4. 图像处理函数

该函数作用是处理图像,检测三角形,并计算其颜色和距离

4.1 读取图像和预处理

img = cv2.imread(image_path)
if img is None:print(f"无法读取图像: {image_path}")return# 转换图像为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 应用阈值过滤掉无用的信息
ret, thresh = cv2.threshold(gray, 100, 255, 0)

这一部分代码的作用是读取输入图像并进行预处理:

  • cv2.imread(image_path):读取图像文件。如果图像无法读取,返回 None 并打印错误信息
  • cv2.cvtColor(img, cv2.COLOR_BGR2GRAY):将读取的彩色图像转换为灰度图,以便于后续处理
  • cv2.threshold(gray, 100, 255, 0):应用阈值操作,将图像二值化,使得图像中的前景(可能是形状)与背景分离。这一步能够简化轮廓检测

4.2 轮廓检测

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(f"检测到的轮廓数量: {len(contours)}")

这一部分代码检测图像中的轮廓:

  • cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE):查找二值化图像中的轮廓。RETR_TREE 模式会检测所有轮廓并建立层次结构,CHAIN_APPROX_SIMPLE 方法会压缩水平、垂直和对角线方向的轮廓段,从而节省内存

4.3 过滤面积并检测三角形

for cnt in contours:area = cv2.contourArea(cnt)if area < min_area:continue# 多边形逼近轮廓approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True)

这部分代码将遍历所有轮廓,过滤掉面积小于 min_area 的轮廓,并对剩余轮廓进行多边形近似处理。

  • cv2.contourArea(cnt):计算轮廓的面积
  • approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True):将轮廓 cnt 近似为一个精度为其周长1%的多边形

4.4 提取边框并计算距离

x, y, w, h = cv2.boundingRect(cnt)# 使用颜色值为绘图设置颜色
color = (int(mean_val[0] + 50), int(mean_val[1] + 50), int(mean_val[2]) + 50)xmin, ymin, xmax, ymax = x, y, x + w, y + h# 计算距离
dist = compute_zc_real_height(abs(ymax - ymin), 0.147, 920) * 100

这一部分代码用于计算三角形边界框到摄像头的距离

  • x, y, w, h = cv2.boundingRect(cnt):计算轮廓的边界框
  • color = (int(mean_val[0] + 50), int(mean_val[1] + 50), int(mean_val[2]) + 50):调整颜色值以便于绘制
  • compute_zc_real_height:用于计算相机到目标的实际距离

二、效果展示

红色三角形

在这里插入图片描述

绿色三角形

在这里插入图片描述

蓝色三角形

在这里插入图片描述

黄色三角形

在这里插入图片描述

三、完整代码获取

通过前面的教程,有一定基础的同学应该能够直接复现出结果,不过如果还有其他问题,可以参考以下链接获取完整代码
链接:使用OpenCV对图像进行三角形检测、颜色识别与距离估算


总结

本期博客就到这里啦,喜欢的小伙伴们可以点点关注,感谢!

最近经常在b站上更新一些有关目标检测的视频,大家感兴趣可以来看看 https://b23.tv/1upjbcG

学习交流群:995760755

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

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

相关文章

springai+pgvector+ollama实现rag

首先在ollama中安装mofanke/dmeta-embedding-zh:latest。执行ollama run mofanke/dmeta-embedding-zh 。实现将文本转化为向量数据 接着安装pgvector&#xff08;建议使用pgadmin4作为可视化工具&#xff0c;用navicate会出现表不显示的问题&#xff09; 安装好需要的软件后我们…

【Linux进阶】磁盘分区3——目录树,挂载

Linux安装模式下&#xff0c;磁盘分区的选择&#xff08;极重要&#xff09; 在Windows 系统重新安装之前&#xff0c;你可能会事先考虑&#xff0c;到底系统盘C盘要有多大容量&#xff1f;而数据盘D盘又要给多大容量等&#xff0c;然后实际安装的时候&#xff0c;你会发现其实…

CV02_超强数据集:MSCOCO数据集的简单介绍

1.1 简介 MSCOCO数据集&#xff0c;全称为Microsoft Common Objects in Context&#xff0c;是由微软公司在2014年推出并维护的一个大规模的图像数据集&#xff0c;旨在推动计算机视觉领域的研究&#xff0c;尤其是目标识别、目标检测、实例分割、图像描述生成等任务。该数据集…

Qt项目:基于Qt实现的网络聊天室---注册模块

文章目录 基本页面设计创建登录界面创建注册界面优化样式完善注册类界面 客户端逻辑完善客户端增加post逻辑客户端配置管理 邮箱注册服务认证服务读取配置邮箱验证服务联调设置验证码过期封装redis操作类封装redis连接池注册功能Server端接受注册请求封装mysql连接池封装DAO操作…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥导入介绍及算法规格】

密钥导入介绍及算法规格 如果业务在HUKS外部生成密钥&#xff08;比如应用间协商生成、服务器端生成&#xff09;&#xff0c;业务可以将密钥导入到HUKS中由HUKS进行管理。密钥一旦导入到HUKS中&#xff0c;在密钥的生命周期内&#xff0c;其明文仅在安全环境中进行访问操作&a…

【CV炼丹师勇闯力扣训练营 Day24:§7 回溯3】

CV炼丹师勇闯力扣训练营 代码随想录算法训练营第24天 93 复原IP地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.…

JavaEE——计算机工作原理

冯诺依曼体系&#xff08;VonNeumannArchitecture&#xff09; 现代计算机&#xff0c;大多遵守冯诺依曼体系结构 CPU中央处理器&#xff1a;进行算术运算与逻辑判断 存储器&#xff1a;分为外存和内存&#xff0c;用于存储数据&#xff08;使用二进制存储&#xff09; 输入…

鸿蒙开发设备管理:【@ohos.account.appAccount (应用帐号管理)】

应用帐号管理 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入模…

景区智慧公厕解决方案,公厕革命新方式

在智慧旅游的浪潮下&#xff0c;景区智慧公厕解决方案正悄然引领着一场公厕革命&#xff0c;不仅革新了传统公厕的管理模式&#xff0c;更以智能化、人性化的服务理念&#xff0c;为游客提供了前所未有的舒适体验。作为智慧城市建设的重要一环&#xff0c;智慧公厕解决方案正逐…

计算机网络之以太网

上文内容&#xff1a;总线局域网以及冲突的解决方法 1.以太网的起源 1.1起源 60年代末期&#xff0c;夏威夷大学Norman Abramson等研制ALOHA无线网络系统,实现Oahu岛上的主机和其它岛及船上的读卡机和终端通信&#xff1b; 出境信道地址&#xff1a;主机到终端&#xff1…

如何利用好用便签提高工作效率?

在忙碌的工作中&#xff0c;我们经常需要记住许多琐碎的任务。如果这些任务被遗忘&#xff0c;可能会对我们的工作产生影响。这时&#xff0c;便签就成为了我们的得力助手。通过合理的使用和管理&#xff0c;便签不仅能帮助我们记住重要的事项&#xff0c;还能提高我们的工作效…

Redis基础教程(十四):Redis连接

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

在Windows可以如此丝滑的测试ios应用

在没有Mac本的时候,又想测试iphone或者ipad该怎么办? 最简单的办法当然是买一个了,如果经济上觉得不划算的话,不妨看看这篇文章,或许能帮到您,有任何问题欢迎一起交流。 原理图 开发环境 操作系统:Windows11 被测设备: iPad mini 15.5 注意事项 一定要安装iTunes!一…

NET程序开发可能会用到的一些资料文档

NET程序开发使用的一些资料文件&#xff0c;NET高级调试&#xff0c;NET关键技术深入解析&#xff0c;WPF专业编程指南&#xff0c;程序员求职攻略&#xff0c;WPF编程宝典等。 下载链接&#xff1a;https://download.csdn.net/download/qq_43307934/89518582

GPT-4o将改变论文学术文风,科学家揭示5年内百万篇论文“is”“are”词频减少10%!

在最近的一项研究中&#xff0c;意大利国际高等研究院&#xff08;SISSA&#xff09;的博士生耿明萌量化了 ChatGPT 对学术论文写作的影响。 与以往主要分析 ChatGPT 生成的段落或文章不同&#xff0c;这次研究更关注整体情况。 论文地址&#xff1a;https://arxiv.org/pdf/2…

SpringBoot怎么单独关闭某个类打印出来的日志?

application.yml文件增加以下内容&#xff1a; logging:level:org.springframework.amgp.rabbit: OFF 配置logging:level是配置的什么&#xff1f; 在application.yml文件中配置logging.level是用来设置日志级别的。这是Spring Boot应用中的一个常用配置&#xff0c;它允许您…

Spring AOP实现操作日志记录示例

1. 准备工作 项目环境&#xff1a;jdk8springboot2.6.13mysql8 1.1 MySQL表 /*Navicat Premium Data TransferSource Server : localhostSource Server Type : MySQLSource Server Version : 50730Source Host : 127.0.0.1:3306Source Schema …

双扩散金属氧化物半导体(DMOS)应用广泛 超结VDMOS市场需求空间大

双扩散金属氧化物半导体&#xff08;DMOS&#xff09;应用广泛 超结VDMOS市场需求空间大 双扩散金属氧化物半导体简称DMOS&#xff0c;是MOS管的一种。MOS管全称为金属氧化物半导体场效应管&#xff0c;又称为MOSFET&#xff0c;是一种利用改变电压来控制电流的半导体器件。  …

《梦醒蝶飞:释放Excel函数与公式的力量》8.8 STDEVP函数

8.8 STDEVP函数 STDEVP函数是Excel中用于计算总体数据的标准偏差的函数。标准偏差是统计学中的一个重要指标&#xff0c;用于衡量数据集中各数值偏离平均值的程度。总体标准偏差考虑了整个数据集&#xff0c;而不是样本。 8.8.1 函数简介 STDEVP函数用于返回总体数据的标准偏…

Redis 中的通用命令(命令的返回值、复杂度、注意事项及操作演示)

Redis 中的通用命令(高频率操作) 文章目录 Redis 中的通用命令(高频率操作)Redis 的数据类型redis-cli 命令Keys 命令Exists 命令Expire 命令Ttl 命令Type命令 Redis 的数据类型 Redis 支持多种数据类型&#xff0c;整体来说&#xff0c;Redis 是一个键值对结构的&#xff0c;…