备赛笔记:Opencv学习:颜色识别
OpenCV颜色识别一般要以下步骤:
1 颜色空间转换,将BGR转换为HSV,用色调区分颜色
2 按照阈值滤出所识别的颜色
3 消除噪点,平滑边界
3 提取连续域,提取要识别的颜色
1 HSV
H:色调,用角度度量,范围0°到360°,从红色开始逆时针方向计算。红色为0°,红绿蓝间隔120°,互补色差180°。
S:饱和度,范围0到1,代表光谱色占颜色比例。0时颜色只有灰度,1时颜色为纯光谱色
V:明度,范围0到1,代表颜色明亮程度。0为黑色,1为白色
腐蚀(erosion)和膨胀(dilation)
腐蚀和膨胀作用:
1 消除噪声
2 分割独立图像元素
3 寻找极大值或极小值区域
膨胀:
将图像和任意寻找内涵进行卷积,提取覆盖区域的最大像素值。这一操作会使亮区扩展
腐蚀:
和膨胀正好相反,提取覆盖区域最下像素值1,这一操作让亮区变细,暗区变大
提取连通域:
两种像素邻接关系会构成连通域:4邻接(上下左右),和8邻接(包括对角线)
opencv里寻找连通域函数findContours()
·语法格式:
image,contours,hierarchy = cv2.findContours(image,mode,method)
式中返回值为:
·image: 与函数参数中的原始图像image一致。
·contours: 返回的轮廓。
·hierarchy: 图像的拓扑信息(轮廓层次)。
式中参数为:
·mode: 轮廓检索模式。
·method: 轮廓的近似方法。
参数mode:
cv2.RETR_EXTERNAL 只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓
cv2.RETR_TREE建立一个等级树结构的轮廓
参数method:
cv2.CHAIN_APPROX_NONE存储所有的轮廓点
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
(具体算法实现可以去了解union-find算法)
颜色识别程序实现
import cv2
import numpy as npcap = cv2.VideoCapture(0)
red_min = np.array([0, 128, 46])
red_max = np.array([5, 255, 255])
red2_min = np.array([156, 128, 46])
red2_max = np.array([180, 255, 255])
yellow_min = np.array([15, 128, 46])
yellow_max = np.array([50, 255, 255])while True:ret,frame = cap.read()x,y = frame.shape[0:2]small_frame = cv2.resize(frame, (int(y / 2), int(x / 2)))cv2.imshow('small', small_frame)src = small_frame.copy()res = src.copy()hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)mask_red1 = cv2.inRange(hsv, red_min, red_max)mask_red2 = cv2.inRange(hsv, red2_min, red2_max)mask_yellow = cv2.inRange(hsv, yellow_min, yellow_max)mask = cv2.bitwise_or(mask_red1, mask_red2)mask = cv2.bitwise_or(mask, mask_yellow)res = cv2.bitwise_and(src, src, mask=mask)h, w = res.shape[:2]blured = cv2.blur(res, (5, 5))ret, bright = cv2.threshold(blured, 10, 255, cv2.THRESH_BINARY)gray = cv2.cvtColor(bright, cv2.COLOR_BGR2GRAY)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))opened = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)contours, hierarchy = cv2.findContours(closed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(src, contours, -1, (255, 0, 0), 2)cv2.imsow("result", src)if cv2.waitKey(1) & 0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()
1 red_min = np.array([0, 128, 46])
red_max = np.array([5, 255, 255])
red2_min = np.array([156, 128, 46])
red2_max = np.array([180, 255, 255])
yellow_min = np.array([15, 128, 46])
yellow_max = np.array([50, 255, 255])
我们要识别两种红色和一种黄色。这里列出它们的阈值上下限作为图像二值化的取值范围
2 hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
把图像转化为hsv类型
3 mask_red1 = cv2.inRange(hsv, red_min, red_max)
mask_red2 = cv2.inRange(hsv, red2_min, red2_max)
mask_yellow = cv2.inRange(hsv, yellow_min, yellow_max)
mask = cv2.bitwise_or(mask_red1, mask_red2)
mask = cv2.bitwise_or(mask, mask_yellow)
res = cv2.bitwise_and(src, src, mask=mask)
图像二值化,提取满足阈值范围的像素
cv2.inRange(图像,阈值下限,阈值上限):将阈值范围内像素设为255,阈值之外像素设为0
cv2.bitwise_or(图像1,图像2):图像或运算实现叠加
cv2.bitwise_and(图像1,图像2):图像与运算实现叠加
4 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
opened = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
提取连续开闭区间用于降噪:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
设置卷积核,第一个参数代表卷积核形状,有MORPH_RECT(矩形),MORPH_ELLIPSE(椭圆),MORPH_CROSS(十字形),第二个参数代表卷积核行和列
cv2.morphologyEx(要处理图像,处理方式,卷积核)
opened = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
开运算,先腐蚀后膨胀,可以消除小黑点,平滑边界。
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
闭运算,先膨胀后腐蚀,可以消除小黑洞
5 contours, hierarchy = cv2.findContours(closed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(src, contours, -1, (255, 0, 0), 2)
提取连续域,得到区间
备赛笔记:Opencv学习:颜色识别相关推荐
- android opencv颜色识别,OpenCV学习——颜色识别的简单应用(一)
第1步:获取到桌球台的图像信息 需要获取桌面固定区域的实时图像(这里为了方便,直接截取了一张图片) 第2步:识别出球杆和白球 创建滑条from cv2 import cv2 import numpy ...
- Halcon 学习笔记八:颜色识别
Halcon 学习笔记八:颜色识别 一.图像处理需要的知识 二.图像处理的预处理和分割过程 二.颜色识别的方法 三.例子一 四.例子二 五.例子三 一.图像处理需要的知识 1.图像处理基础(rgb(h ...
- Opencv之颜色识别
用Opencv之颜色识别 1.以下是我的基本流程: 读入图像 图像转成HSV 高斯滤波 筛选需要识别的颜色 腐蚀操作 找出轮廓 画出轮廓 接下来是我的总代码: import cv2 import nu ...
- RT-Thread学习笔记|TCS34725 RGB 颜色识别传感器详解
rt-thread是什么? RT-Thread 是一个集实时操作系统(RTOS)内核.中间件组件和开发者社区于一体的技术平台,组件完整丰富.高度可伸缩.简易开发.超低功耗.高安全性的物联网操作系统.R ...
- OpenCV形状颜色识别Java,Android
纯java代码实现安卓的CV识别图形形状颜色 半年前开的帖,一直在忙 回来更新下. cv环境已经没有了,图就用以前的吧,代码我贴出来,凭记忆解释一下,算法实现的,我会说明逻辑 首先,环境是OpenCV ...
- opencv做颜色识别(python)
使用Raspberry摄像头抓图然后进行颜色识别. #!/usr/bin/python # -*- coding: UTF-8 -*- import sys import time from pica ...
- 蓝桥杯Web组备赛笔记6
目录 一.ElementUI 1.安装 2.简单使用 3.例子 4.其他内容的学习 二.echarts 1.简介 2.考点 3.安装 4.配置项:使用echarts的三步走 5.13届蓝桥真题(3)布 ...
- 基于Opencv的颜色识别
彩色模型 数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型.而HSV模型更符合人描 ...
- 蓝桥杯Web组备赛笔记5
目录 一.vue 1.考察 2.引入式简单例子 二.生命周期 1.文档图示 2.常考模块介绍 三.组件传参方式 1.创建使用组件 2.父子传参 四.axios 1.简介 2.13届蓝桥真题(7)布局切 ...
最新文章
- Windows XP Professional系统修复的操作方法
- MAVEN [ERROR] 不再支持源选项 5。请使用 7 或更高版本。
- java中scanner与hashmap_Java中HashMap的使用练习
- 软件测试工作的不足与改善,软件测试工作中对问题的发现和改进
- Mockplus摹客:原型设计工具
- int为什么是-32768到32767
- MySQL5.5安装及其配置
- Android产品研发(二十一)--Android中的UI优化
- 安卓4.4和6.0系统wifi开关设置
- Excel VBA 字典/数组 示例
- Hook DirectX 在War3 魔兽争霸界面写屏
- 信息熵:什么是信息熵?
- Ubuntu双系统安装的个人心得
- 预约订座APP系统(基于uni-app框架)毕业设计毕业论文开题报告参考(3)系统后台管理功能
- 医疗行业专业术语知识
- 阿里巴巴业务全解析:凭什么挣那么多?
- 错误UserWarning: semaphore_tracker: There appear to be 4 leaked semaphores to clean up at shutdown
- Uboot DM_USB与DM_ETH模型
- 如何正确使用Commvault的重复数据删除功能
- 关于uniapp上传文件的一些api文档