前一阵在做机械臂下井字棋的综合设计,在网上直接购买了一套机械臂装置(包括机械臂,摄像头,树莓派,花费1600元),机械臂不是很高级、精度很低。源码里提供识别红绿蓝三种颜色方块的识别和抓取。

经过多次尝试,最终决定井字棋的棋子也采用3cm * 3cm * 3cm的颜色方块。今天就来写一些第一步,而第一步就是解决识别颜色方块的问题。

演示效果图

手移动方块,外轮廓始终贴合方块边缘。

代码

使用笔记本自带摄像头捕获画面,并识别绿色方块。

import cv2
import numpy as npball_color = 'green'color_dist = {'red': {'Lower': np.array([0, 60, 60]), 'Upper': np.array([6, 255, 255])},'blue': {'Lower': np.array([100, 80, 46]), 'Upper': np.array([124, 255, 255])},'green': {'Lower': np.array([35, 43, 35]), 'Upper': np.array([90, 255, 255])},}cap = cv2.VideoCapture(0)
cv2.namedWindow('camera', cv2.WINDOW_AUTOSIZE)while cap.isOpened():ret, frame = cap.read()if ret:if frame is not None:gs_frame = cv2.GaussianBlur(frame, (5, 5), 0)                     # 高斯模糊hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)                 # 转化成HSV图像erode_hsv = cv2.erode(hsv, None, iterations=2)                   # 腐蚀 粗的变细inRange_hsv = cv2.inRange(erode_hsv, color_dist[ball_color]['Lower'], color_dist[ball_color]['Upper'])cnts = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]c = max(cnts, key=cv2.contourArea)rect = cv2.minAreaRect(c)box = cv2.boxPoints(rect)cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 255), 2)cv2.imshow('camera', frame)cv2.waitKey(1)else:print("无画面")else:print("无法读取摄像头!")cap.release()
cv2.waitKey(0)
cv2.destroyAllWindows()

代码解析

1 读取图像
使用python读取摄像头图像可参考:【Python+OpenCV】捕捉笔记本和外接摄像头

2 颜色定义

ball_color = 'green'color_dist = {'red': {'Lower': np.array([0, 60, 60]), 'Upper': np.array([6, 255, 255])},'blue': {'Lower': np.array([100, 80, 46]), 'Upper': np.array([124, 255, 255])},'green': {'Lower': np.array([35, 43, 35]), 'Upper': np.array([90, 255, 255])},}

如果只是想识别绿色,那这一段就显得多余了。但是如果你想识别红色或是蓝色,可以直接将ball_color = 'green'改成ball_color = 'red'或是ball_color = 'blue'。其中color_dist内包含的是颜色在HSV模式下的范围,稍后再讲解。

3 图像处理

gs_frame = cv2.GaussianBlur(frame, (5, 5), 0)                   # 高斯模糊
hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)                 # 转化成HSV图像
erode_hsv = cv2.erode(hsv, None, iterations=2)                  # 腐蚀 粗的变细
inRange_hsv = cv2.inRange(erode_hsv, color_dist[ball_color]['Lower'], color_dist[ball_color]['Upper'])

第一步,高斯模糊
将原图像进行模糊处理,方便颜色的提取
gs_frame = cv2.GaussianBlur(frame, (5, 5), 0),其中
参数一:frame需要高斯模糊的图像
参数二:(5, 5)高斯矩阵的长与宽都是5
参数三:0标准差是0

未经处理的原图像如下(这个摄像头太辣鸡了,原图像看起来就很模糊):

高斯模糊后的图像(仔细看一下,你会发现比上一张更模糊些)

第二步,BGR转换为HSV
刚刚高斯模糊后的图像的颜色模式从BGR转换为HSV(在OpenCV中不使用RGB模式,而是使用BGR模式)。为什么使用HSV模式呢?因为这种模式更加方便单一颜色的提取,具体原理我也不懂。
hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)
参数一:gs_frame原图像
参数二:cv2.COLOR_BGR2HSV颜色转换方式,从BGR to HSV

HSV模式下的图像:

第三步,腐蚀
通俗来说,就是将图像变瘦,用于去除噪声点。
erode_hsv = cv2.erode(hsv, None, iterations=2)
参数一:hsv原图像
参数三:iterations=2腐蚀的宽度

可以看出少了很多干扰(紫色的点点少了很多)。

第四步,去除背景部分
将绿色以外的其他部分去除掉,并将图像转化为二值化图像
inRange_hsv = cv2.inRange(erode_hsv, color_dist[ball_color]['Lower'], color_dist[ball_color]['Upper'])
参数一:erode_hsv原图像
参数二:color_dist[ball_color]['Lower']颜色的下限
参数三:color_dist[ball_color]['Upper']颜色的上限

如图

4 绘制矩形边框

cnts = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
c = max(cnts, key=cv2.contourArea)
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 255), 2)

第一步,找出外边界
cnts = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
使用该函数找出方框外边界,并存储在cnts中。
findContours 参考资料

第二步,找出矩形
在边界中找出面积最大的区域,选定该区域为方块所在区域,并绘制出该区域的最小外接矩形,并记录该矩形的位置坐标。
c = max(cnts, key=cv2.contourArea) 在边界中找出面积最大的区域
rect = cv2.minAreaRect(c) 绘制出该区域的最小外接矩形
box = cv2.boxPoints(rect) 记录该矩形四个点的位置坐标

第三步,绘制矩形
在原图像上将分析出的矩形边界绘制出来
cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 255), 2)
参数一:frame目标图像
参数二:[np.int0(box)]轮廓本身,在Python中是一个list
参数三:-1指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。
参数四:(0, 255, 255)轮廓颜色BGR
参数五:2廓线的宽度
最终结果如图

文章最开始的图像是笔记本内置摄像头拍摄的图像;
为了方便拍摄图像,代码分析过程中的图像是外接usb摄像头,像素太低。

【Python+OpenCV】识别颜色方块并提取轮廓相关推荐

  1. Python+OpenCV 识别银行卡卡号

    Python+OpenCV 识别银行卡卡号 今天尝试一下用python+OpenCV,使用模板匹配的方式做个简单地识别银行卡卡号(大部分参考网上的,自己改了一部分,代码写的有点不太好,但是思路很清晰, ...

  2. Python OpenCV识别行人入口进出人数统计

     程序示例精选 Python OpenCV识别行人入口进出人数统计 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 这篇博客针对<Python OpenCV识别行 ...

  3. Python笔记-安装python虚拟环境及配置opencv及通过opencv识别颜色

    这里以window为例: 安装python虚拟环境: 安装virtuallenv: pip install virtualenv 使用cmd进入指定后目录新建虚拟环境: virtualenv env1 ...

  4. python+opencv通过颜色阙值识别黑色飞机,并且输出中心点

    1.下载opencv-python,使用命令 pip install opencv-python=4.5.2.52 2.黑色阙值范围 lower = np.array([0,0,0]) upper = ...

  5. python图片识别-Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  6. Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  7. php 比对两张图片,Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  8. python opencv 识别角度_OpenCV入门之获取图像的旋转角度

    在我们的日常生活中,所碰到的图像往往都有一定的倾斜.那么,如何用OpenCV来获取图像的旋转角度呢? 我们以下面的图片为例,简单介绍如何用OpenCV来获取图像的旋转角度. 可以看到,该图像存在着许多 ...

  9. Python OpenCV基于颜色通道分离法去除图片中的红色印章

    最近一段时间的工作都是研究如何去除图片中的红色印章,在网上查找了大量的大佬写过的方法,发现大多数是采取颜色通道分离法来做,并且效果还不错.站在前人的肩膀上,我又做了些许调整,谈不上是改进,但是能应对更 ...

最新文章

  1. 项目开发过程中的收获与思考
  2. 谷歌提出“T5” 新NLP模型,突破迁移学习局限,多基准测试达SOTA!
  3. GoldWave合并多段音乐,去除噪音,剪切想要的片段
  4. Java 技术篇-IntelliJ IDEA修改java、jdk版本实例演示
  5. mysql开创_MySQL创始人打造MariaDB 全面兼容MySQL 5.1
  6. js箭头函数和普通函数区别
  7. 在MacOS系统中如何自定义屏幕保护程序?
  8. shell脚本语言和java_shell脚本学习与总结
  9. python基础之列表生成式和生成器
  10. 【软件测试】测试用例详解
  11. 运筹帷幄之中,决胜千里之外——运筹学1-3章
  12. 羊车门问题。有三扇关闭的门,一扇门背后面停着汽车,其余门后面是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另一扇门,露出门后的山羊,然后允许参赛者更换自己的选
  13. PID学习笔记:模拟加热系统的PID控制
  14. 快速应对面试--分门别类--9.回溯和递归
  15. 低代码平台和专业开发人员——完美搭档?
  16. window下python安装包问题小结
  17. OTA制作及升级过程
  18. 牛客网sql练习题解(12-21)
  19. 如何求出两个整数的最大公约数
  20. 数字图像处理——车牌识别(matlab)

热门文章

  1. Linux系统认知——常用命令(全)
  2. 淘宝引流,淘宝直播引流 淘宝直播卖货的技巧,以及方案
  3. 快速了解STP生成树——作用,端口角色,端口状态,选举规则
  4. win10能用计算机考试么,Win10计算器在哪里?三种可以打开Win10计算器的方法图文介绍...
  5. sgolayfilt函数_MATLAB常用函数
  6. 球球音响机器人怎么合成的_DIY低成本、便携、震撼的USB音箱(制作过程、原理图)...
  7. 同学让我帮着做的篮球记分牌的程序
  8. 如何做出好看的Excel可视化图表?
  9. 机器学习数据基础:线代(4)
  10. JSP页面的五种跳转方法