使用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,一经查实,立即删除!

相关文章

如何远程访问运行电脑上运行的程序?

远程访问运行电脑上运行的程序的实用指南 一、使用远程桌面协议&#xff08;RDP&#xff09;适用场景配置步骤 二、利用虚拟网络计算&#xff08;VNC&#xff09;适用范围配置过程 三、通过 SSH 隧道主要针对实现方式 四、借助 TeamViewer 等第三方工具特点使用方法 五、注意事…

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;你会发现其实…

linux 下载依赖慢和访问github代码慢

1 pip install 下载依赖慢&#xff0c;添加清华镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 2 git 出现错误 Could not resolve host: github.com 原来是因为github.com没有被主机给解析&#xff0c; 第一步 先 ping 看一下主机地址 …

CAPL如何对txt文件进行读写

文章目录 简单示例CANoe示例Example fileGetStringExample fileGetStringSZ可以将一些测试过程中的日志输出到txt文档。 简单示例 dword txtHandle = 0;//TXTchar fileBuffer[128];txtHandle = OpenFileWrite ("TEST.txt",2); //参数为0,清空文件内容,重新写入

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点击或者复制转到。 导入模…

大厂开发必知必会:Devops、CI/CD、流水线和Paas的关系解析说明

为什么作为程序开发人员需要了解ci/cd流程和原理&#xff1f; 作为程序开发人员&#xff0c;了解CI/CD&#xff08;持续集成/持续交付&#xff09;的流程和原理具有以下几个重要的理由&#xff1a; 1. 提高代码质量和稳定性 自动化测试&#xff1a;CI/CD流程中集成了自动化测…

C++容器map的常见用法

文章目录 1.map和multimap容器1.map容器的构造和赋值1.构造函数2.赋值操作 2.map容器的大小和交换1.获取大小2.交换内容 3.map容器的插入和删除1.插入元素2.删除元素3.注意事项 4.map容器的查找和统计1.查找元素2.统计元素3.示例 5.map容器的排序1.自定义排序规则2.注意点3.示例…

责任链模式在金融业务中的应用及其框架实现

引言 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它通过为请求创建一个处理链&#xff0c;使多个对象都有机会处理这个请求。责任链模式通过将请求的发送者和接收者解耦&#xff0c;使得多个接收者可以依次处理请求&am…

Linux——命令执行原理,命令别名

### 执行原理 - 系统为了让用户在命令行快速方便地执行命令&#xff0c;将可执行文件的路径存储在环境变量PATH中&#xff0c;使得shell知道命令的可执行文件位置 - PATH环境变量&#xff1a;当用户每次执行外部命令的时候都会去该变量所记录的路径下搜索和命令同名的二进制文件…

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

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

计算机网络之以太网

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

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

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

RPM方式安装mysql

下载离线版本mysql。 mysql-5.7.33-1.el7.x86_64.rpm-bundle.tar 解压 26468960 Dec 11 2020 mysql-community-client-5.7.33-1.el7.x86_64.rpm315280 Dec 11 2020 mysql-community-common-5.7.33-1.el7.x86_64.rpm3918736 Dec 11 2020 mysql-community-devel-5.7.33-1.el…

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

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