Robocom预选赛使用opencv实现颜色主色调识别(源码python+解析)

2023-05-16

1.前言:

要求:编程实现对图片中具体内容的颜色识别。编程语言:C++或python。判断图片的主色调是红色还是蓝色。 基础数据:组委会提供200张以上的图片作为识别训练集,比赛的200 张图片另外提供。 比赛要求:编写代码,从200张图片中随机读取20张图片,在终端中以 文字形式输出以上20张图片的主色调是红色还是蓝色。

 

2.源代码

import numpy as np
import cv2 as cv
import math
import random
from PIL import Image, ImageDraw, ImageFont

colors = {'黑色': [0, 180, 0, 255, 0, 46],
          '灰色': [0, 180, 0, 43, 46, 220],
          '白色': [0, 180, 0, 30, 221, 255],
          '红色': [0, 10, 35, 255, 46, 255],
          '橙色': [11, 25, 43, 255, 46, 255],
          '黄色': [26, 34, 43, 255, 46, 255],
          '绿色': [35, 77, 43, 255, 46, 255],
          '青色': [78, 99, 43, 255, 46, 255],
          '蓝色': [100, 124, 43, 255, 46, 255],
          '紫色': [125, 155, 43, 255, 46, 255]
          }

color = ['黑色', '灰色', '白色', '红色', '橙色', '黄色', '绿色', '青色', '蓝色', '紫色']


def cv2ImgAddText(img, text, left, top, textColor=(0, 0, 0), textSize=0):

    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(img)

    return cv.cvtColor(np.asarray(img), cv.COLOR_RGB2BGR)

# RGB颜色空间转HSV颜色空间
def simple_rgb2hsv(r, g, b):
    r, g, b = r / 255.0, g / 255.0, b / 255.0
    mx = max(r, g, b)
    mn = min(r, g, b)
    df = mx - mn
    if mx == mn:
        h = 0
    elif mx == r:
        h = (60/360) * (((g - b) / df) % 6)
    elif mx == g:
        h = (60/360) * ((b - r) / df + 2)
    elif mx == b:
        h = (60/360) * ((r - g) / df+4)
    if mx == 0:
        s = 0
    else:
        s = df / mx
    v = mx
    h, s, v = math.ceil(h*180), math.ceil(s*255), math.ceil(v*255)
    print(f'h:{h}, s:{s}, v:{v}')
    i = 0
    for value in colors.values():
        if ((h >= 156) & (h <= 180)) & ((s >= 43) & (s <= 255)) & ((v >= 46) & (v <= 255)):
            return "红色"
        elif ((h >= value[0]) & (h <= value[1])) & ((s >= value[2]) & (s <= value[3])) & ((v >= value[4]) & (v <= value[5])):
            return color[i]
        i += 1


# 构建图像数据
# K-means 只能处理向量形状的数据,不能处理矩阵型数据,
# 这里 reshape(-1, 3) 代表图片的所有像素点,而每个像素点有三个特征(即三个通道)
def k_means(image):
    data = image.reshape((-1, 3))
    data = np.float32(data)

# K-means 算法停止条件
# 一个元组,传入 cv.kmeans(),( type, max_iter, epsilon ) type 见下面链接,max_iter 是最大迭代次数,epsilon 要达到的精度
# https://docs.opencv.org/master/d1/d5c/tutorial_py_kmeans_opencv.html
    criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)
    num_clusters = 2  # 聚类的数量
    ret, label, center = cv.kmeans(data, num_clusters, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)
    # 求取所聚类的最大概率的值
    clusters = np.zeros([num_clusters], dtype=np.int32)
    for i in range(len(label)):
        clusters[label[i][0]] += 1  # 计算每个类别共有多少个
    clusters = np.float32(clusters) / float(h * w)  # 计算概率
    print(clusters)
    max_data = max(clusters)
    print(max_data)
    max_num = clusters.tolist().index(max_data)
    print(max_num)

    # center = np.int32(center)  # 因为像素值是 0-255 故对其聚类中心进行强制类型转换
    center = np.uint8(center)  # 因为像素值是 0-255 故对其聚类中心进行强制类型转换
    print('this is center', center)
    # sorted(clusters)  # 这里对主色按比例从大到小排序 [::-1] 代表首尾反转 如[1,2,3] -> [3, 2, 1]
    b = center[max_num][0]  # 这一类对应的中心,即 RGB 三个通道的值
    g = center[max_num][1]
    r = center[max_num][2]
    print(f'r:{r}, g:{g}, b:{b}')
    main_color = simple_rgb2hsv(r, g, b)
    print(main_color + '\n')
    return main_color

if __name__ == '__main__':
    for i in range(20):
        num = random.randint(1, 200)
        if num < 10:
            num_data = '00' + str(num)
        elif num < 100 and num >= 10:
            num_data = '0' + str(num)
        else:
            num_data = str(num)
        print(f'第{num_data}张图')
        # num_data = '190'
        image = cv.imdecode(np.fromfile(f'mydata/平安城市测试集/颜色识别任务1/{num_data}.jpg', dtype=np.uint8), -1)
        # image = cv.resize(image,None,fx=1,fy=1,interpolation=cv.INTER_LINEAR)
        image = cv.resize(image,(600,600))
        h, w, ch = image.shape # 读取图像的高、宽、通道数
        print(f'图像的高、宽、通道数:{image.shape}')
        image = cv2ImgAddText(image, k_means(image), 0, 0, (0, 255, 0), 50)
        cv.imshow(f'{i}', image)
        cv.waitKey(0)
        cv.destroyAllWindows()

3.总结

以上就是我所运用的代码,感谢大家观看,希望有帮助到大家。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Robocom预选赛使用opencv实现颜色主色调识别(源码python+解析) 的相关文章

  • visual studio 2022 调试时如何1、打开监视窗口;2、监视窗口无法输入问题

    1 如何打开监视窗口 xff1a 注意要先点击调试 xff0c 不然没有这个窗口 2 如果窗口显灰色 xff0c 说明当前调试状态没有中断 xff0c 而只有中断的时候才可以输入或修改 3 点击调试里的 全部中断 后就可以输入了 xff01
  • 单片机学习——定时器/计数器

    单片机必学系列 单片机学习 中断系统 单片机学习 存储器详解 xff08 程序存储器 片内RAM 拓展RAM EEPROM xff09 单片机学习 定时器 计数器 单片机学习 A D转换 更新ing 单片机学习 定时器 计数器 单片机必学系
  • C++的动态多态性理解

    多态 xff1a 指允许不同类的对象对同一消息做出响应 即同一消息可以根据发送对象的不同而采用多种不同的行为方式 xff08 发送消息就是函数调用 xff09 像我们之前学的函数重载和符号重载都是多态现象 例 xff1a 使用运算符 43
  • Hadoop伪分布集群配置(我用的是VMwareWorkstation)

    1 虚拟机环境准备 xff1a 1 0 xff09 首先准备好一台已经安装好了的虚拟机 我这里用的是Centos 2 0 xff09 安装 vim 编辑器 使用 yum y install vim 也可以直接用vi 注意 xff1a 安装好
  • fork函数的用法

    1 头文件 include lt sys types h gt inlcude lt unistd h gt 2 函数原型 pid t fork void 函数参数 xff1a void 3 fork函数功能 fork xff08 xff0
  • gitee配置流水线实现自动打包vue

    1 任务编排 xff1a 第1步 xff1a 创建一个构建任务 xff0c 选择nodejs xff1b 第2步 xff1a 编写构建命令 设置NPM源 xff0c 提升安装速度 npm config set registry https
  • Linux操作系统:Firewalld防火墙

    Linux操作系统 xff1a Firewalld 防火墙 课堂引入 xff1a Linux防火墙是通过netfilter来处理的 xff0c 它是内核级别的框架 iptables被作为netfilter的用户态抽象层 xff0c ipta
  • 全景图拼接

    目录 一 图像拼接基本流程 二 RANSAC 随机一致性采样 2 1 RANSAC基本思想 xff1a 数据中包含正确的点和噪声点 xff0c 合理的模型应该能够在描述正确数据点的同时摒弃噪声点 2 2 RANSAC基本流程 xff1a 2
  • 11. JS操作节点续(2) + DOM 重点核心

    关于dom操作 xff0c 我们主要针对于元素的操作 主要有创建 增 删 改 查 属性操作 事件操作 DOM xff1a 我们获取过来的DOM元素是一个对象 xff08 object xff09 xff0c 所以称为 文档对象模型 创建 d
  • Docker-使用篇

    文章目录 一 Docker镜像和容器 镜像命令镜像下载 xff08 pull xff09 查看镜像 xff08 images xff09 镜像搜索 xff08 search xff09 删除镜像 xff08 rmi xff09 容器命令新建
  • Rviz上发布的点位信息机器人不执行(网络配置原因)已解决

    在调试机器人时发现Rviz上发布的点位信息机器人没有执行 xff0c 经检查是由于网络配置原因 xff0c 本文记录解决方法 使用ssh将笔记本与实物机器人连接 xff0c 机器人中控使用的工控机 xff0c 机器人作为显示器和键盘输入 p
  • gazebo小车自主路径规划导航仿真

    gazebo小车自主路径规划仿真 在之前的文章中完成了对地图的构建 xff0c 接下来使用 Ros navgition完成机器人自主导航 首先是Ros navigation的下载安装 ros功能包 xff1a Navigation ros
  • 关于结构体对齐

    首先我们先了解一下各数据类型所占的字节数 x64系统 xff08 64位 xff09 x86系统 xff08 32位 xff09 在这里有一个很有意思的点 xff0c 我使用VS在x86与x64系统下运行出来的long类型所占据的空间都是4
  • 安装docker报出的错误及解决方案

    1 错误一 xff1a 解决方案 xff1a yum erase podman buildan yum install y docker ce allowerasing 重启服务 systemtl restart docker yum源的安
  • make、makefile的使用解释(Linux项目自动化构建工具)

    本文所使用系统为Linux centos 7 makefile是一个文件 里面包含了 xff1a 1 文件与文件的依赖关系 2 文件与文件的依赖方法 为什么需要包含文件与文件的依赖方法和依赖方法呢 xff1f 一个工程中的源文件不计数 xf
  • elementUI中neditor第一次加载无法正常赋值的解决方法

    1 lt neditor v if 61 34 neditorLoad 34 v model 61 34 formFields content 34 class 61 34 wd editor 34 gt 加上v if 61 34 nedi
  • Gazebo仿真中光源的设置

    目录 写在前面官方文档链接point类型directional类型spot类型 写在前面 最近研究在Gazebo中仿真px4 xff0c 使用Apriltag ros包对Apriltag二维码检测的时候发现光源对检测影响非常大 xff0c
  • 使用Java操作Hbase

    目录 修改hosts文件 导入jar包 配置hbase信息 xff0c 连接hbase数据库 创建表 删除表 获取namespace 获取tables 添加数据 查询表中的数据 查询表中所有数据 关闭流 修改hosts文件 位置 xff1a
  • CAN协议国际标准化协议部分总结(一)

    前言 xff1a 本文主要是对CAN协议中ISO11898做一个简短的总结 ISO11898 ISO11519 ISO15765 CAN协议在OSI模型中包含三层 xff0c 物理层 数据链路层和传输层 各层中CAN定义内容可参考下图 其协
  • STM32 串口 DMA 数据读取(详细代码)

    最近重新开始学32 xff0c 搞到串口 DMA 的时候 xff0c 数据读取卡了很长一段时间 xff0c 最终 xff0c 功夫不负有心人终于搞出来了 在此以记录一下 xff0c 方便以后查询使用 在调试的过程中也遇到了很多bug xff

随机推荐

  • 在阿里云购买Linux服务器,配置宝塔环境,全图文,最最详细图解,保姆级教学

    在阿里云购买Linux服务器 xff08 CentOs 7 xff09 xff0c 配置宝塔环境 一 在阿里云购买CentOs服务器 Linux系统 CentOS是免费的 开源的 可以重新分发的开源操作系统 xff0c CentOS xff
  • (Linux)FreeRTOS(任务)

    任务调度器 调度器就是使用相关的调度算法来决定当前需要执行的任务 xff0c 调度器总是在所有处于就绪列表的任务中 xff0c 选择具有最高优先级的任务来执行 抢占式调度 xff1a 主要是针对优先级不同的任务 xff0c 每个任务都有一个
  • 制作一个串口助手 | python + pyqt5

    目录 一 背景 1 1 开发流程图 二 前提 2 1 关于环境 2 2 关于源码 三 步骤 3 1 使用pyqt创建一个 ui界面并生成 py文件 3 2 创建两个 py文件 xff0c 一个用来继承ui界面生成的 py类 xff0c 一个
  • FreeRTOS任务调度与任务切换 | FreeRTOS八

    目录 说明 xff1a 一 任务调度器 1 1 开启任务调度器函数 1 2 任务调度器实现步骤 1 3 xPortStartScheduler 函数 二 启动一个任务 2 1 prvStartFirstTask 函数 2 2 vPortSV
  • 单片机原理简介

    提出问题 xff1a 什么是单片机 xff1f 类似于一台性能相对较弱的微型电脑 xff0c 具有完整的计算机结构和片内外设 xff08 例如串口 xff0c I2C xff0c ADC等硬件 xff09 xff0c 将他们集成封装在一颗芯
  • composer安装第三方库

    用法 xff1a 在thinkphp根目录下执行 composer require wechatpay wechatpay 1 4
  • STM32F407ZGT6控制ESP8266与OV2640下的百度智能图片识别

    前言 xff1a STM32F407ZGT6控制OV2640下采集到JPG图片格式的二进制数据 xff0c 然后对二进制数据进行BASE64编码 xff0c 接着通过串口将数据传输给ESP8266并上传至训练好的EASYDL的AI算法识别平
  • 力扣数组算法(c++)(代码随想录数组部分)

    文章一部分内容和图片引用代码随想录和力扣官方题解 数组 C 43 43 考察数组的题目一般在思维上都不难 xff0c 主要是考察对代码的掌控能力 数组是存放在连续内存空间上的相同类型数据的集合 数组可以方便的通过下标索引的方式获取到下标下对
  • cv_bridge用于ROS图像和OpenCV图像的转换

    一 背景 ROS对于传感器数据有自己的格式和规范 而在OpenCV中 xff0c 图像是以Mat矩阵的形式存储的 xff0c 这与ROS定义的图像消息的格式有一定的区别 xff0c 所以我们需要利用cv bridge将这两种不相同的格式联系
  • ROS通信机制——python实现

    一 普通话题通信 1 创建发布者 注意 xff1a 不要在开头添加注释 xff0c 下面代码第一行是指定编译器 xff0c 第二行是防止因为代码中的中文注释而出现乱码 usr bin env python coding utf 8 导包 i
  • 树莓派4B安装Ubuntu20.04与ROS

    树莓派4B搭建Ubuntu20 04与ROS 文章目录 树莓派4B搭建Ubuntu20 04与ROS 前言一 安装Ubuntu20 041 下载Ubuntu20 04LTS server2 将镜像文件用Win32DiskImager烧录进S
  • Jeston 与 PX4(一)

    Jeston与ROS 大二下半学期开始接触四旋翼无人机 xff0c 主要在实验室学习飞控 xff0c 针对bibi飞控的二次开发 xff0c 与实验室其余成员参加了大大小小的无人机比赛 xff0c 包括令人崩溃的电赛 xff0c 虽然没有取
  • Jeston与Px4(三)

    Gazebo和mavros 文章目录 Gazebo和mavros前言一 什么是 MAVROS xff1f 二 仿真工具Gazebo1 创建工作空间并初始化2 添加依赖 xff0c 添加密钥3 安装gazebo9 14 ros与gazebo插
  • catkin_make编译的几个错误

    1 权限问题 报错 xff1a Makefile 138 recipe for target all failed Makefile 138 recipe for target all failed make all Error 2 Inv
  • ROS2和docker的安装和一些常用命令行

    学习目标 xff1a 学习ROS2的一些常用命令行学习ros和docker安装 xff0c 和部分命令的使用安装ros和docker的一些bug 学习内容 xff1a 例如 xff1a ROS2的一些常用命令行 创建功能包和工作空间 mkd
  • ubuntu20 安装px4、mavros、QGroundControl

    一 安装PX4 jjm2是我的主文件夹名 xff0c 可以根据自己的主文件夹名修改 下载PX4 git clone https github com PX4 PX4 Autopilot git recursive 由于网速原因 xff0c
  • 宝塔配置反向代理解决跨域问题

  • Python读取各种格式的txt文档(ANSI、Unicode、Unicode big endian、UTF-8等)

    https blog csdn net Ltinginger article details 83105266
  • 安装Ubuntu双系统

    制作U盘启动盘 1 电脑插入U盘 xff0c 格式化U盘 2 下载解压好安装包 链接 xff1a https pan baidu com s 1my5JrSz QRPwRxIOdU4JJQ 提取码 xff1a 1234 解压完成打开文件夹
  • Robocom预选赛使用opencv实现颜色主色调识别(源码python+解析)

    1 前言 xff1a 要求 xff1a 编程实现对图片中具体内容的颜色识别 编程语言 xff1a C 43 43 或python 判断图片的主色调是红色还是蓝色 基础数据 xff1a 组委会提供200张以上的图片作为识别训练集 xff0c