颜色识别

颜色识别

计算机视觉中的颜色识别是指计算机系统能够自动识别图像或视频中的不同颜色,以便进行分析、分类、跟踪和其他视觉任务。

颜色是物体的一个重要属性,它提供了有关对象的重要信息。

颜色识别在各种应用中都有重要作用,包括工业自动化、机器人技术、医学影像处理、安全监控、自动驾驶汽车、农业和许多其他领域。

硬件环境

操作环境及软硬件配置如下:

  • OriginBot 机器人
  • PC:Ubuntu (≥20.04) + ROS2 (≥Foxy)

代码

    #!/usr/bin/env python3# -*- coding: utf-8 -*-import rclpyimport cv2import cv_bridgeimport numpy as npfrom rclpy.node import Nodefrom sensor_msgs.msg import Imageclass ColorDetection(Node):def __init__(self):super().__init__('color_detection')self.bridge = cv_bridge.CvBridge()self.image_sub = self.create_subscription(Image, '/image_raw', self.image_callback, 10)self.pub = self.create_publisher(Image, '/camera/process_image', 10)self.load_hsv_values()self.area_max = 5def load_hsv_values(self):try:with open("/userdata/dev_ws/color_block_HSV.txt", "r") as file:content = file.read()import rematch = re.search(r'(\d+,\d+,\d+) (\d+,\d+,\d+)', content)if match:lower_hsv, upper_hsv = match.group(1).split(','), match.group(2).split(',')self.hsv_lower = np.array([int(val) for val in lower_hsv], dtype=np.uint8)self.hsv_upper = np.array([int(val) for val in upper_hsv], dtype=np.uint8)else:self.get_logger().error("Invalid format in HSV values file. Using default values.")self.hsv_lower = np.array([2, 40, 40], dtype=np.uint8)self.hsv_upper = np.array([22, 168, 190], dtype=np.uint8)except FileNotFoundError:self.get_logger().error("HSV values file not found. Using default values.")self.hsv_lower = np.array([2, 40, 40], dtype=np.uint8)self.hsv_upper = np.array([22, 168, 190], dtype=np.uint8)def image_callback(self, msg):image = self.bridge.imgmsg_to_cv2(msg, 'bgr8')hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)mask = cv2.inRange(hsv_img, self.hsv_lower, self.hsv_upper)kernel = np.ones((5, 5), np.uint8) mask = cv2.erode(mask, kernel) mask = cv2.dilate(mask, kernel) contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contours = self.take_biggest_contours(contours) contours = self.agglomerative_cluster(contours) for cnt in contours: x, y, w, h = cv2.boundingRect(cnt) if w < 20 and h < 20: continue cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2) area = w * h if area > self.area_max: self.area_max = area cv2.imwrite("test.jpg", image) self.get_logger().info("Image saved.") self.pub.publish(self.bridge.cv2_to_imgmsg(image, 'bgr8'))def take_biggest_contours(self, contours, max_number=20):sorted_contours = sorted(contours, key=lambda x: cv2.contourArea(x), reverse=True)return sorted_contours[:max_number]def calculate_contour_distance(self, contour1, contour2):x1, y1, w1, h1 = cv2.boundingRect(contour1)c_x1, c_y1 = x1 + w1 / 2, y1 + h1 / 2x2, y2, w2, h2 = cv2.boundingRect(contour2)c_x2, c_y2 = x2 + w2 / 2, y2 + h2 / 2return max(abs(c_x1 - c_x2) - (w1 + w2) / 2, abs(c_y1 - c_y2) - (h1 + h2) / 2)def agglomerative_cluster(self, contours, threshold_distance=100.0):current_contours = contourswhile len(current_contours) > 1:min_distance = Nonemin_coordinate = Nonefor x in range(len(current_contours) - 1):for y in range(x + 1, len(current_contours)):distance = self.calculate_contour_distance(current_contours[x], current_contours[y])if min_distance is None or distance < min_distance:min_distance = distancemin_coordinate = (x, y)if min_distance is not None and min_distance < threshold_distance:index1, index2 = min_coordinatecurrent_contours[index1] = np.concatenate([current_contours[index1], current_contours[index2]])del current_contours[index2]else:breakreturn current_contoursdef main(args=None):rclpy.init(args=args)color_detection = ColorDetection()rclpy.spin(color_detection)color_detection.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

简要说明

本节内容为上一篇文章HSV值获取的后续,通过之前采集的HSV值便可以直接进行颜色识别了。

"""
从颜色提取中读到HSV颜色阈值
"""
def load_hsv_values(self):try:with open("/userdata/dev_ws/color_block_HSV.txt", "r") as file:content = file.read()import re                       #使用正则表达式读取文件中的HSV值,并将值转换为int类型match = re.search(r'(\d+,\d+,\d+) (\d+,\d+,\d+)', content)if match:lower_hsv, upper_hsv = match.group(1).split(','), match.group(2).split(',')self.hsv_lower = np.array([int(val) for val in lower_hsv], dtype=np.uint8)self.hsv_upper = np.array([int(val) for val in upper_hsv], dtype=np.uint8)else:self.get_logger().error("Invalid format in HSV values file. Using default values.")self.hsv_lower = np.array([2, 40, 40], dtype=np.uint8)self.hsv_upper = np.array([22, 168, 190], dtype=np.uint8)except FileNotFoundError:self.get_logger().error("HSV values file not found. Using default values.")self.hsv_lower = np.array([2, 40, 40], dtype=np.uint8)self.hsv_upper = np.array([22, 168, 190], dtype=np.uint8)

聚类是滤波很重要的一种方式,其作用类似于机器学习中交并比、NMS的作用,确保一个物体只有一个boundingBox进行框定。

"""
将接近的boundingBox聚类到一起
"""
def agglomerative_cluster(self, contours, threshold_distance=100.0):current_contours = contourswhile len(current_contours) > 1:min_distance = Nonemin_coordinate = Nonefor x in range(len(current_contours) - 1):for y in range(x + 1, len(current_contours)):distance = self.calculate_contour_distance(current_contours[x], current_contours[y])if min_distance is None or distance < min_distance:min_distance = distancemin_coordinate = (x, y)# min_distance(最短距离)不为零,并且小于阈值就进行拼接,并将更小的boundingBox删除 if min_distance is not None and min_distance < threshold_distance:index1, index2 = min_coordinatecurrent_contours[index1] = np.concatenate([current_contours[index1], current_contours[index2]])del current_contours[index2]else:breakreturn current_contours

什么情况下会使用这种方式进行颜色识别?如何确保效果稳定?

使用opencv进行颜色识别一般使用在周围环境并不复杂,且颜色相对来说单调的环境,且需要目标颜色在环境中较为明显。同时使用opencv HSV色域进行颜色识别会遇到光线影响导致颜色色彩变化大的问题,所以需要预留一定的空间给HSV阈值。

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

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

相关文章

分布式文件系统

引言&#xff1a; GFS是一个可扩展的分布式文件系统&#xff0c;用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上&#xff0c;并提供容错功能。它可以给大量的用户提供总体性能较高的服务。 一、 GlusterFS 概述 1.1 GlusterFS简介 GlusterFS 是…

跳动的♥心

代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style…

git实现代码版本控制

一、在github新建一个仓库 二、在本地执行以下代码 git init git add . git commit -m "first commit" git branch -M main git remote add origin gitgithub.com:thekingofjumpshoot/blog.git git push -u origin main 代码解析 然后就上传到github上了 三、第二…

Java 8 中Stream流的基本概念和用法介绍

1. 理解Java 8中Stream流的概念 Java 8中引入的Stream流是对集合对象进行各种操作的高级抽象&#xff0c;可以让开发者更加便捷、高效地处理数据。在本章节中&#xff0c;我们将深入探讨Java 8中Stream流的基本概念&#xff0c;包括Stream流的定义、与集合的关系以及使用Strea…

qt实现实时抓取串口数据,并对数据做解密处理

效果&#xff1a; 1.实时抓取串口数据&#xff0c;并对串口数据做解密&#xff0c;解密后显示在QTextEdit上。 2.对显示的内容做特殊关键字标记处理&#xff0c;比如对出现的Error关键字标红 高亮另一个版本 3.对显示的明文进行查询&#xff0c;类似编辑文件中的CtrlF 4.对串口…

Mac环境简化RSA密钥生成命令

文章目录 正常RSA密钥对生成操作命令 openssl genrsa -out rsa_private_key.pem 2048 openssl rsa -pubout -in rsa_private_key.pem -out rsa_public_key.pem通过添加环境变量来简化RSA密钥对生成操作 设置环境变量.zshrc或.bash_profile # 使用zsh终端 vim ~/.zshrc将下面sh…

如何通过代码混淆绕过苹果机审,解决APP被拒问题

目录 iOS代码混淆 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 混淆前后对比 iOS代码混淆 …

南京航空航天大学-考研科目-513测试技术综合 高分整理内容资料-01-单片机原理及应用分层教程-单片机有关常识部分

系列文章目录 高分整理内容资料-01-单片机原理及应用分层教程-单片机有关常识部分 文章目录 系列文章目录前言总结 前言 单片机的基础内容繁杂&#xff0c;有很多同学基础不是很好&#xff0c;对一些细节也没有很好的把握。非常推荐大家去学习一下b站上的哈工大 单片机原理及…

开通抖音小店后下一步要干嘛?这些准备比选品更重要!新手必看!

哈喽~我是电商月月 很多入驻完抖音小店的新手朋友总以为&#xff0c;入驻完抖音小店后&#xff0c;下一步就是去选品 其实并不是&#xff01;选品确实很重要&#xff0c;但前期这几个细节没做好&#xff0c;是会直接影响店铺的整体发展的 废话不多说&#xff0c;直接分享给你…

2024年6月PMP报名已开始!项目经理抓紧啦!

根据《2024年6月1日PMI认证考试报名通知》可知&#xff0c;2024年6月PMP考试安排在6月1日举行&#xff0c;那报名入口什么时候开通呢&#xff1f;2024年6月PMP考试分批报名&#xff0c;从4月10日10:00开启报名&#xff0c;4月18日16:00截止报名。 第一批报名城市&#xff1a;2…

Linux入门攻坚——18、SELinux、Bash脚本编程续

SELinux——Secure Enhanced Linux&#xff08;安全加强的Linux&#xff09;&#xff0c;工作于Linux内核中。 SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源&#xff08;最小权限原则&#xff09;。采用委任式存取控制&#xff0c;是在进行程序、文件等细节权…

Dockfile相关

一、Dockerfile能干什么? 能在里面自定义应用的各种环境配置,来构建镜像;它是一种实现途径。 1.1Dockerfile文件组成 1.基础镜像信息 FROM 2.维护者信息 LABEL 3.镜像操作指令 ENV ADD COPY RUN 4.启动时执行指令 CMD ENTRYPOINT 1.2Dockerfile多阶段构建 一个镜像的构…

python批量修改替换cad图纸文本,土木狗可以有

civilpy&#xff1a;python进行AutoCAD绘图的两个库&#xff0c;土木狗可以有3 赞同 0 评论文章​编辑 civilpy&#xff1a;python进行AutoCAD绘图批量打印&#xff0c;土木狗可以有2 赞同 2 评论文章​编辑 # 导入所需库 from pyautocad import Autocad, APoint import ma…

LeetCode 94 二叉树的中序遍历

题目描述 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入…

hive管理之ctl方式

hive管理之ctl方式 hivehive --service clictl命令行的命令 #清屏 Ctrl L #或者 &#xff01; clear #查看数据仓库中的表 show tabls; #查看数据仓库中的内置函数 show functions;#查看表的结构 desc表名 #查看hdfs上的文件 dfs -ls 目录 #执行操作系统的命令 &#xff01;命令…

WinAppDriver 自动化测试winform程序

WinAppDriver 自动化测试winform程序 前言 WinAppDriver是Windows系统上的一个应用程序驱动工具&#xff0c;开源免费。与Selenium工具类似&#xff0c;都是用来实现产品UI自动化测试的一个工具。 WinAppDriver运行时对系统是有要求的&#xff0c;只能运行在Windows10或Wind…

2024/4/6—力扣—简化路径

代码实现&#xff1a; // 分割/得到名字 char **split(const char *s, int *returnSize) {int n strlen(s);char **ans (char **)malloc(sizeof(char *) * n);int l 0, r 0, len 0;while (r < n) {while (r < n && s[r] /) {r;}l r;while (r < n &…

Python | 海表面温度(SST) | 长期趋势和异常分析

趋势和异常分析&#xff08;Trend and anomaly)在大气和海洋学研究中被广泛用于探测长期变化。 趋势分析&#xff08;Trend Analysis&#xff09;&#xff1a; 趋势分析是一种用于检测数据随时间的变化趋势的方法。在海洋学和大气学中&#xff0c;常见的趋势分析包括海表面温…

WeTrade众汇账户类型有哪几种?FX110网

WeTrade众汇是一个在线交易平台&#xff0c;允许用户买卖各种金融工具&#xff0c;包括交易外汇、金属、能源、指数、股票和加密货币。 WeTrade众汇不仅提供多种交易市场&#xff0c;还提供多种有竞争力的工具和服务。那么&#xff0c;WeTrade众汇账户类型有哪几种&#xff1f;…

CF938Div3(A-F)

A: 买n个酸奶&#xff0c;一次一瓶a元,一次买两瓶可以优惠价b元,也可以a元,问恰好买n瓶需要多少钱. void solve() {int n, a, b;cin >> n >> a >> b;int ans min(a * n, n / 2 * b n % 2 * a);cout << ans << endl; } B: 给你一个数组,问能…