opencv-python实战项目一:获取鼠标框选区域的颜色

news2024/9/19 10:39:14

文章目录

  • 一:简介
  • 二:框选区域选择颜色方案
  • 三、算法实现步骤
    • 3.1 按鼠标事件截取图像
    • 3.2将图像模糊后转化为hsv并求均值
    • 3.3 判断hsv处于何种颜色
  • 四:整体代码实现
  • 五,效果:


一:简介

在计算机视觉领域,颜色检测是一项非常实用的技术。通过颜色检测,我们可以轻松识别图像中的特定颜色区域,从而实现目标追踪、物体识别等功能。本文将带你了解如何使用OpenCV库进行颜色检测。

二:框选区域选择颜色方案

在图像处理过程中,首先通过读取鼠标事件从图像中截取用户感兴趣的特定区域,然后对该区域进行模糊处理以排除噪声和边缘干扰。接下来,将处理后的模糊区域转换到HSV颜色空间,并计算其HSV均值。最后,将计算得到的HSV均值与预设的颜色判断表进行比较,从而确定该区域所属的具体颜色类别。在这里插入图片描述

三、算法实现步骤

3.1 按鼠标事件截取图像

代码如下(示例):

# 导入OpenCV库
import cv2
# 鼠标回调函数,用于处理鼠标事件
def mouse_callback(event, x, y, flags, param):
    global start_point, end_point, drawing
    # 当鼠标左键按下时,开始绘制矩形
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True  # 标记开始绘制
        start_point = (x, y)  # 记录起始点
    # 当鼠标移动时,更新矩形终点
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing:  # 如果正在绘制,则更新终点
            end_point = (x, y)
    # 当鼠标左键释放时,结束绘制矩形
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False  # 标记结束绘制
        end_point = (x, y)  # 记录终点
        # 在原图上绘制矩形
        cv2.rectangle(img, start_point, end_point, (0, 255, 0), 2)
    # 当鼠标右键按下时,显示截取的图像区域
    elif event == cv2.EVENT_RBUTTONDOWN:
        # 获取矩形的起始和结束坐标
        x1, y1 = start_point
        x2, y2 = end_point
        # 确保坐标顺序正确
        x1, x2 = min(x1, x2), max(x1, x2)
        y1, y2 = min(y1, y2), max(y1, y2)
        # 从原图中截取选定区域
        crop_img = img[y1:y2, x1:x2]
        # 显示截取的图像
        cv2.imshow('Cropped Image', crop_img)
# 初始化全局变量,用于存储矩形起始点、终点和绘制状态
start_point = (0, 0)
end_point = (0, 0)
drawing = False
# 读取图像文件,路径需要根据实际情况修改
img = cv2.imread(r'F:\traditional_vison\11.jpg')
# 创建一个窗口用于显示图像
cv2.namedWindow('Image')
# 设置鼠标回调函数,将鼠标事件与回调函数绑定
cv2.setMouseCallback('Image', mouse_callback)
# 主循环,显示图像并等待用户操作
while True:
    # 显示图像
    cv2.imshow('Image', img)
    # 按下'q'键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

3.2将图像模糊后转化为hsv并求均值

代码如下(示例):

roi_blur = cv2.blur(roi,(11,11))
hsv = cv2.cvtColor(roi_blur, cv2.COLOR_BGR2HSV)
h = np.mean(hsv[:, :, 0])
s = np.mean(hsv[:, :, 1])
v = np.mean(hsv[:, :, 2])

3.3 判断hsv处于何种颜色

代码如下(示例):

def classify_color(new_hsv, color_ranges):
    # 遍历颜色范围
    for color_name, hsv_range in color_ranges.items():
        # 检查新HSV值是否在当前颜色范围内
        if hsv_range[0][0] <= new_hsv[0] <= hsv_range[1][0] and \
           hsv_range[0][1] <= new_hsv[1] <= hsv_range[1][1] and \
           hsv_range[0][2] <= new_hsv[2] <= hsv_range[1][2]:
            return color_name
    return "未知颜色"
    #hsv颜色范围为
# minRed1 = np.array([0, 43, 46])
# maxRed1 = np.array([10, 255, 255])
# minRed2 = np.array([156, 43, 46])
# maxRed2 = np.array([180, 255, 255])
# # 橙
# minOrange = np.array([11, 43, 46])
# maxOrange = np.array([25, 255, 255])
# # 黄
# minYellow = np.array([26, 43, 46])
# maxYellow = np.array([34, 255, 255])
# # 绿
# minGreen = np.array([35, 43, 46])
# maxGreen = np.array([77, 255, 255])
# # 青
# minCyan = np.array([78, 43, 46])
# maxCyan = np.array([99, 255, 255])
# # 蓝
# minBlue = np.array([100, 43, 46])
# maxBlue = np.array([124, 255, 255])
# # 紫
# minPurple = np.array([125, 43, 46])
# maxPurple = np.array([155, 255, 255])
# # 黑
# minBlack = np.array([0, 0, 0])
# maxBlack = np.array([180, 255, 46])
# # 灰
# minGray = np.array([0, 0, 46])
# maxGray = np.array([180, 43, 220])
# # 白
# minWhite = np.array([0, 0, 221])
# maxWhite = np.array([180, 30, 255])

四:整体代码实现




# 导入OpenCV库,用于图像处理
import cv2
# 导入NumPy库,用于数值计算
import numpy as np

# 定义一个函数,用于根据HSV值判断颜色
def classify_color(new_hsv, color_ranges):
    # 遍历预设的颜色范围字典
    for color_name, hsv_range in color_ranges.items():
        # 检查输入的HSV值是否在当前颜色范围之内
        if hsv_range[0][0] <= new_hsv[0] <= hsv_range[1][0] and \
           hsv_range[0][1] <= new_hsv[1] <= hsv_range[1][1] and \
           hsv_range[0][2] <= new_hsv[2] <= hsv_range[1][2]:
            # 如果在范围内,返回对应的颜色名称
            return color_name
    # 如果不在任何预设范围内,返回未知颜色
    return "未知颜色"

# 预设的颜色范围字典,键为颜色名称,值为HSV范围
color_ranges = {
    "yellow": [[11, 43, 46], [34, 255, 255]],
    "blue": [[100, 43, 46], [124, 255, 255]],
    "green": [[35, 43, 46], [99, 255, 255]]
}
# 定义鼠标回调函数,用于处理鼠标事件
def on_mouse(event, x, y, flags, param):
    global ix, iy
    # 当鼠标左键按下时,记录当前位置
    if event == cv2.EVENT_LBUTTONDOWN:
        ix, iy = x, y
    # 当鼠标左键释放时,处理截取的图像区域
    elif event == cv2.EVENT_LBUTTONUP:
        # 根据记录的起始点和当前点截取图像区域
        roi = image[iy:y, ix:x]
        # 对截取区域进行模糊处理以减少噪声
        roi_blur = cv2.blur(roi, (11, 11))
        # 将BGR图像转换为HSV格式
        hsv = cv2.cvtColor(roi_blur, cv2.COLOR_BGR2HSV)
        # 计算HSV通道的平均值
        h = np.mean(hsv[:, :, 0])
        s = np.mean(hsv[:, :, 1])
        v = np.mean(hsv[:, :, 2])
        # 使用classify_color函数判断颜色
        color_name = classify_color([h, s, v], color_ranges)
        # 设置字体和文字参数
        font = cv2.FONT_HERSHEY_SIMPLEX
        font_scale = 1
        color = (0, 0, 0)  # 文字颜色为黑色
        thickness = 2
        position = (10, 50)
        # 在图像上绘制颜色名称
        cv2.putText(roi_blur, color_name, position, font, font_scale, color, thickness, cv2.LINE_AA)
        # 打印颜色名称和HSV值
        print(f"截图区域属于 {color_name}")
        print(h, s, v)
        # 显示处理后的图像区域
        cv2.imshow('roi', roi_blur)
# 读取图像文件
image = cv2.imread(r'F:\im\12.jpg')
# 初始化鼠标事件记录的起始点
ix, iy = -1, -1

# 创建窗口显示图像
cv2.namedWindow('image')
# 设置鼠标回调函数
cv2.setMouseCallback('image', on_mouse)

# 主循环,显示图像并等待用户操作
while True:
    # 显示图像
    cv2.imshow('image', image)
    # 检测按键操作,'q'键退出
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

五,效果:

原图:在这里插入图片描述
效果图:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

19-ESP32-C3加大固件储存区

1默认编译情况。 2、改flash4M。ESP-IDF Partition Table Editor修改。 3、设置输入Partition Table 改自定义.CSV。保存。 4、查看命令输入Partition Table Editor打开-分区表编辑器UI。按图片增加。 nvs,data,nvs,0x9000,0x6000,, phy_init,data,phy,0xF000,0x1000,, factory…

计算机毕业设计Hadoop+Hive居民用电量分析 居民用电量可视化 电量爬虫 机器学习 深度学习 大数据毕业设计 Spark

《Hadoop居民用电量分析》开题报告 一、研究背景与意义 能源问题在全球范围内一直是热点议题&#xff0c;尤其是随着居民生活水平的提高和城市化进程的加快&#xff0c;居民用电量急剧增长&#xff0c;对电力系统的稳定运行和能源管理提出了更高要求。如何科学合理地管理和分…

Hive3:识别内部表、外部表及相互转换

一、识别方法 查看内部表信息 desc formatted stu;查看外部表信息 desc formatted test_ext1;通过Table Type对应的值&#xff0c;我们可以区分外部表和内部表。 二、相互转换 内部表转外部表 alter table stu set tblproperties(EXTERNALTRUE);外部表转内部表 alter ta…

PCIe学习笔记(21)

读请求的数据返回&#xff08;Data Return for Read Requests&#xff09; •针对内存读取请求的单个完成可能提供少于请求的全部数据量&#xff0c;只要对于给定请求的所有完成在组合起来时返回了读取请求中请求的数据量。 ◦不同请求的完成不能合并。 ◦I/O和Configuratio…

Qt QCustomPlot 图形库详解

文章目录 原文1. 下载qcustomplot.h与qcustomplot.cpp后,将代码文件拷贝到本地工程,并添加到工程项目2. 看到文件后就是添加成功了3. 在界面中拖拽一个Widget控件,选中并右键选中“提升为”,将原来的Widget控件已成为一个带坐标的 CustomPlot 控件4. 添加printsupport原文 …

【Ai学习】一个技巧,解决99%Comfyui报错!

前言 comfyui以极高灵活度及节点化工作流&#xff0c;深受AI绘画者追捧&#xff0c;每当新的模型开源&#xff0c;comfyui都是最先进行适配。 comfyui高度兼容性及灵活性带来丰富强大的扩展&#xff08;插件&#xff09;生态&#xff0c;同时也带来一系列插件安装的问题&…

Python程序结构

模块 Module 定义&#xff1a;包含一系列数据、函数、类的文件&#xff0c;通常以.py结尾。 作用&#xff1a;让一些相关的数据&#xff0c;函数&#xff0c;类有逻辑的组织在一起&#xff0c;使逻辑结构更加清晰。 有利于多人合作开发。 导入 import 语法&#xff1a; im…

【目标检测实验系列】YOLOv5/YOLOv8改进:CARAFE轻量级上采样算子,聚合上下文信息,助力模型涨点(文内附源码)

1. 文章主要内容 本篇博客主要涉及轻量级上采样算子CARAFE&#xff0c;将YOLOv5/YOLOv8模型中最近邻上采样算子改为CARAFE算子&#xff0c;使模型聚合上下文信息&#xff0c;助力模型涨点。 2. 简要概括 论文地址&#xff1a;CARAFE论文地址 论文Github代码&#xff1a…

Go语言 Defer(延迟)

本文主要内容为Go语言中defer(延迟)介绍及应用文件读取使用defer的示例。 目录 定义 应用场景 代码示例 改为匿名函数 总结 定义 延迟&#xff1a;关键字&#xff0c;可以用于修饰语句、函数&#xff0c; 确保这条语句可以在当前栈退出的时候执行。 应用场景 1.一般用于…

【leetcode】特殊数组I【(炒鸡)简单】

好像这题没啥子好说的欸&#xff0c;那就祝点进来的友友今天有好事发生叭~ AC代码见下&#xff1a; class Solution { public:bool isArraySpecial(vector<int>& nums) {for(int i1; i<nums.size(); i)if(nums[i]%2 nums[i-1]%2) return false;return true;} }…

如何妙用哈希表来优化遍历查找过程?刷题感悟总结,c++实现

先上题目 题目链接&#xff1a;题目链接 这题我最先想到的就是前缀和a&#xff0c;构造好了以后就遍历每一个[l,r]数组&#xff08;满足题目要求的连续区间数组&#xff09;&#xff0c;奈何倒数第二个样例时间超限 先给出原思路代码 class Solution { public:int subarray…

网络如何发送一个数据包

网络如何发送一个数据包 网络消息发送就是点一点屏幕。 骚瑞&#xff0c;这一点都不好笑。&#xff08;小品就是我的本质惹&#xff09; 之前我就是会被这个问题搞的不安宁。是怎么知道对方的IP地址的呢&#xff1f;怎么知道对方的MAC呢&#xff1f;世界上计算机有那么多&…

top250的电影

本次的电影排行来源于豆瓣。材料仅用于自身学习和记录自己学习过程 使用python中的requests、BeautifulSoup、xlwt&#xff0c;三者需要提前下载好。。 预处理&#xff1a; url&#xff1a;反应网页变化 其中start后面的数字变化每次加25&#xff0c;对应一页&#xff0c;故…

用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)

exceljs在Jquery&#xff08;HTML&#xff09;和vue项目中实现导出功能 前言Jquery&#xff08;HTML&#xff09;中实现导出第一步&#xff0c;先在项目本地中导入exceljs和file-saver包第二步&#xff0c;封装导出Excel方法&#xff08;可直接复制粘贴使用&#xff09;第三步&…

JJ音乐,听歌自由!

林俊杰&#xff0c;这位才华横溢的音乐才子&#xff0c;用他的音符编织了一个又一个令人陶醉的梦幻世界。作为他的音乐爱好者&#xff0c;每一次倾听都是一次心灵的旅程。 他的歌声仿佛有一种魔力&#xff0c;能够穿透灵魂。从《江南》的诗意浪漫&#xff0c;到《不为谁而作的歌…

探索树莓派Pico 2:新一代RP2350芯片引领的微型开发革命

Raspberry Pi Pico 2 是由树莓派基金会推出的微处理器开发板&#xff0c;作为Pico系列的最新成员&#xff0c;它在原有的基础上进行了多项改进和扩展。这款开发板搭载了全新的RP2350芯片&#xff0c;具有更强大的处理能力和更多的功能特性。 1. Raspberry Pi Pico 2的特性和规格…

使用CUbeMX配置STM32F103C8T6 CRC校验

一、CubeMX配置 1.配置RCC 2.配置SYS 3.启用CRC校验 二、Keil添加程序 1.main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body*******…

LVGL——(4)标签控件

文章目录 一、介绍二、用法1、创建2、显示文本2.1 直接设置要显示的文本2.2 格式化给定要显示的文本2.3 在 label 中进行换行 3、改变字体大小4、长模式5、文本选择6、文本对齐方式7、非常长的文本8、显示内置图标字体9、事件处理 三、拓展1、修改文本颜色1.1 Palette&#xff…

研0 冲刺算法竞赛 day30 P1102 A-B 数对

P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; ①map&#xff0c;键值对计数&#xff0c;将A-B->A-C ②先排序&#xff0c;找对应差值为C的第一个和最后一个计数 代码&#xff1a; #include<iostream> #include <map> #i…

Typora绿色版

1、下载安装 Typora 官网地址&#xff1a;https://typora.io/ 中文站地址&#xff1a;Typora 2、击活 Typora 鼠标右击文件所在位置查询 resources\page-dist\static\js\LicenseIndex.180dd4c7.4da8909c.chunk.chunk.js e.hasActivated"true"e.hasActivated, 替…