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学习:颜色识别相关推荐

  1. android opencv颜色识别,OpenCV学习——颜色识别的简单应用(一)

    第1步:获取到桌球台的图像信息 需要获取桌面固定区域的实时图像(这里为了方便,直接截取了一张图片) 第2步:识别出球杆和白球 创建滑条from cv2 import cv2 import numpy ...

  2. Halcon 学习笔记八:颜色识别

    Halcon 学习笔记八:颜色识别 一.图像处理需要的知识 二.图像处理的预处理和分割过程 二.颜色识别的方法 三.例子一 四.例子二 五.例子三 一.图像处理需要的知识 1.图像处理基础(rgb(h ...

  3. Opencv之颜色识别

    用Opencv之颜色识别 1.以下是我的基本流程: 读入图像 图像转成HSV 高斯滤波 筛选需要识别的颜色 腐蚀操作 找出轮廓 画出轮廓 接下来是我的总代码: import cv2 import nu ...

  4. RT-Thread学习笔记|TCS34725 RGB 颜色识别传感器详解

    rt-thread是什么? RT-Thread 是一个集实时操作系统(RTOS)内核.中间件组件和开发者社区于一体的技术平台,组件完整丰富.高度可伸缩.简易开发.超低功耗.高安全性的物联网操作系统.R ...

  5. OpenCV形状颜色识别Java,Android

    纯java代码实现安卓的CV识别图形形状颜色 半年前开的帖,一直在忙 回来更新下. cv环境已经没有了,图就用以前的吧,代码我贴出来,凭记忆解释一下,算法实现的,我会说明逻辑 首先,环境是OpenCV ...

  6. opencv做颜色识别(python)

    使用Raspberry摄像头抓图然后进行颜色识别. #!/usr/bin/python # -*- coding: UTF-8 -*- import sys import time from pica ...

  7. 蓝桥杯Web组备赛笔记6

    目录 一.ElementUI 1.安装 2.简单使用 3.例子 4.其他内容的学习 二.echarts 1.简介 2.考点 3.安装 4.配置项:使用echarts的三步走 5.13届蓝桥真题(3)布 ...

  8. 基于Opencv的颜色识别

    彩色模型   数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型.而HSV模型更符合人描 ...

  9. 蓝桥杯Web组备赛笔记5

    目录 一.vue 1.考察 2.引入式简单例子 二.生命周期 1.文档图示 2.常考模块介绍 三.组件传参方式 1.创建使用组件 2.父子传参 四.axios 1.简介 2.13届蓝桥真题(7)布局切 ...

最新文章

  1. Windows XP Professional系统修复的操作方法
  2. MAVEN [ERROR] 不再支持源选项 5。请使用 7 或更高版本。
  3. java中scanner与hashmap_Java中HashMap的使用练习
  4. 软件测试工作的不足与改善,软件测试工作中对问题的发现和改进
  5. Mockplus摹客:原型设计工具
  6. int为什么是-32768到32767
  7. MySQL5.5安装及其配置
  8. Android产品研发(二十一)--Android中的UI优化
  9. 安卓4.4和6.0系统wifi开关设置
  10. Excel VBA 字典/数组 示例
  11. Hook DirectX 在War3 魔兽争霸界面写屏
  12. 信息熵:什么是信息熵?
  13. Ubuntu双系统安装的个人心得
  14. 预约订座APP系统(基于uni-app框架)毕业设计毕业论文开题报告参考(3)系统后台管理功能
  15. 医疗行业专业术语知识
  16. 阿里巴巴业务全解析:凭什么挣那么多?
  17. 错误UserWarning: semaphore_tracker: There appear to be 4 leaked semaphores to clean up at shutdown
  18. Uboot DM_USB与DM_ETH模型
  19. 如何正确使用Commvault的重复数据删除功能
  20. 关于uniapp上传文件的一些api文档

热门文章

  1. C#中Invoke,BeginInvoke的作用
  2. intptr_t详解
  3. 前端面试相关题(简易)
  4. ACM-ICPC 2018 焦作赛区网络预赛A. Magic Mirror(签到题)
  5. Date类的getDay()和getDate()方法
  6. 测风塔选址与代表性问题
  7. 【Android】世界各国语言代码
  8. java中时区的时令问题
  9. 稀疏表征:稀疏字典构建
  10. 纳米数据世界杯足球数据api接口,体育数据api接口,实时比分接口示例演示,数据推送