使用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_height
    return 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过 Parallels Desktop 虚拟机安装运行 macOS 15 Sequoia

在 Apple 的 WWDC 24 大会上&#xff0c;macOS Sequoia 15 成为全场热议的焦点。 作为科技爱好者和开发者&#xff0c;我们都迫不及待想要体验这些最新功能。但如果直接把整个 Mac 升级到测试版&#xff0c;可能不太现实&#xff0c;特别是当你需要保持主系统稳定的时候。 幸…

Alpha2:使用深度强化学习挖掘公式化的超额收益因子(附论文及源代码)

原创文章第577篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 今天说说因子挖掘&#xff0c;我们之前交付的Deap遗传算法因子挖掘&#xff0c;大家可以前往温习一下&#xff1a; 源码发布Quantlab4.2&#xff0c;Deap因子挖掘|gplearn做不到的…

小程序分包加载、独立分包、分包预加载等

一、小程序分包加载 小程序的代码通常是由许多页面、组件以及资源等组成&#xff0c;随着小程序功能的增加&#xff0c;代码量也会逐渐增加&#xff0c; 体积过大就会导致用户打开速度变慢&#xff0c;影响用户的使用体验。分包加载是一种小程序优化技术。将小程序不同功能的代…

springboot基础入门2(profile应用)

Profile应用 一、何为Profile二、profile配置方式1.多profile文件方式2.yml多文档方式 三、加载顺序1. file:./config/: 当前项目下的/config目录下2. file:./ &#xff1a;当前项目的根目录3. classpath:/config/:classpath的/config目录4. classpath:/ : classpath的根目录 四…

LabVIEW环境下OCR文字识别的实现策略与挑战解析

引言 在自动化测试领域&#xff0c;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术扮演着重要角色&#xff0c;它能够将图像中的文字转换成机器可编辑的格式。对于使用LabVIEW约5个月&#xff0c;主要进行仪器控制与数据采集的你而言…

什么是T0策略?有没有可以持仓自动做T的策略软件?

​​行情低迷&#xff0c;持仓被套&#xff0c;不想被动等待&#xff1f;长期持股&#xff0c;想要增厚持仓收益&#xff1f;有没有可以自动做T的工具或者策略&#xff1f;日内T0交易&#xff0c;做到降低持仓成本&#xff0c;优化收益预期。 什么是T0策略&#xff1f; 可以提…

知识图谱和 LLM:多跳问答

检索增强生成&#xff08;RAG&#xff09;应用程序通过将外部来源的数据集成到 LLM 中&#xff0c;擅长回答简单的问题。但他们很难回答涉及将相关信息之间的点连接起来的多部分问题。这是因为 RAG 应用程序需要一个数据库&#xff0c;该数据库旨在存储数据&#xff0c;以便轻松…

c++ 里如何检测内存泄露:比如用了 new ,但没有用 delete

&#xff08;1 方法一&#xff09; 用 MFC 框架的 F5 不带断点的调试。可以在输出窗口提示是否有内存泄露。 &#xff08;2 方法二&#xff09; &#xff0c;在 main 函数中添加如下代码&#xff0c;用 F5 不带断点的调试&#xff1a; int main() {_CrtSetDbgFlag( _CRTDBG_A…

JAVA 集合+对象复制工具类

JAVA 集合对象复制工具类 import jakarta.annotation.Nullable;import java.util.ArrayList; import java.util.List; import java.util.function.BiFunction; import java.util.function.Consumer;public class BeanUtil extends cn.hutool.core.bean.BeanUtil {/*** 数据拷贝…

Linux高并发服务器开发(十三)Web服务器开发

文章目录 1 使用的知识点2 http请求get 和 post的区别 3 整体功能介绍4 基于epoll的web服务器开发流程5 服务器代码6 libevent版本的本地web服务器 1 使用的知识点 2 http请求 get 和 post的区别 http协议请求报文格式: 1 请求行 GET /test.txt HTTP/1.1 2 请求行 健值对 3 空…

SQL索引事务

SQL索引事务 索引 创建主键约束(primary key),唯一约束(unique),外键约束(foreign key)时,会自动创建对应列的索引 1.1 查看索引 show index from 表名 现在这个表中没有索引,那么我们现在将这几个表删除之后创建新表 我们现在建立一个班级表一个学生表,并且学生表与班级表存…

EVM-MLIR:以MLIR编写的EVM

1. 引言 EVM_MLIR&#xff1a; 以MLIR编写的EVM。 开源代码实现见&#xff1a; https://github.com/lambdaclass/evm_mlir&#xff08;Rust&#xff09; 为使用MLIR和LLVM&#xff0c;将EVM-bytecode&#xff0c;转换为&#xff0c;machine-bytecode。LambdaClass团队在2周…

无人机水运应用场景

航行运输 通航管理&#xff08;海事通航管理处&#xff09; 配员核查流程 海事员通过VHF&#xff08;甚高频&#xff09;系统与船长沟通核查时间。 无人机根据AIS&#xff08;船舶自动识别系统&#xff09;报告的船舶位置&#xff0c;利用打点定位 功能飞抵船舶上方。 使用…

大型能源电力集团需要什么样的总部数据下发系统?

能源电力集团的组织结构是一个复杂的系统&#xff0c;包括多个职能部门和子分公司。这些子分公司负责具体的电力生产、销售、运维等业务。这些部门和公司协同工作&#xff0c;确保电力生产的顺利进行&#xff0c;同时关注公司的长期发展、市场拓展、人力资源管理、财务管理和公…

SCI一区级 | Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断

SCI一区级 | Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断 目录 SCI一区级 | Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现BO-Transformer-LSTM特征分类预测/故障诊断&…

winform2

12.TabControl 导航控制条 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace zhiyou_…

发现CPU占用过高,该如何排查解决?

1.使用top命令 查看cpu占用最多的进程 2.使用 top -H -p pid 发现有两个线程占用比较大 3.将线程id转换为16进制 使用命令 printf 0x%x\n pid 4.使用 jstack pid | grep 线程id(16进制&#xff09; -A 20 &#xff08;显示20行&#xff09; 根据代码显示进行错误排查

2024年7月5日 (周五) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 《乐高地平线大冒险》为何不登陆…

娱乐圈惊爆已婚男星刘端端深夜幽会

【娱乐圈惊爆&#xff01;已婚男星刘端端深夜幽会&#xff0c;竟是《庆余年》二皇子“戏外风云”】在这个信息爆炸的时代&#xff0c;娱乐圈的每一次风吹草动都能瞬间点燃公众的热情。今日&#xff0c;知名娱乐博主刘大锤的一则预告如同投入湖中的巨石&#xff0c;激起了层层涟…

关于下载obsidian SimpRead Sync中报错的问题

参考Kenshin的配置方法&#xff0c;我却在输入简悦的配置文件目录时多次报错。 bug如下&#xff1a; 我发现导出来的配置文件格式如下&#xff1a; 然后根据报错的bug对此文件名进行修改&#xff0c;如下&#xff1a; 解决。