K210 调节颜色阈值识别红绿黄三色
官方在机器视觉的API中提供了寻找绿色色块的例程
https://wiki.sipeed.com/soft/maixpy/zh/api_reference/machine_vision/image/image.html#例程
import sensor
import image
import lcd
import time
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
green_threshold = (0, 80, -70, -10, -0, 30) # 颜色阈值元组
while True:
img=sensor.snapshot() # 捕获一张图片,返回一个图片对象
# 调用寻找色块方法,传入颜色阈值列表,返回满足要求的色块列表
blobs = img.find_blobs([green_threshold])
if blobs: # 当色块列表不为空时对色块列表进行遍历
for b in blobs:
# start 1
tmp=img.draw_rectangle(b[0:4]) # 传入xy和宽度、高度将色块用矩形框选
tmp=img.draw_cross(b[5], b[6]) # 传入中心处的xy坐标在中心处画一个十字
# end 1
c=img.get_pixel(b[5], b[6]) # 返回中心处的灰度像素值
lcd.display(img) # lcd 显示照片
同样在官方 API 中提到色块列表中的每一个色块成员可以用索引的方式获取相应数值:
不仅可以用索引号来获取相应数值,还调用方法,start 1 到 end 1 的代码也可以被替换为:
tmp = img.draw_rectangle(b.x(), b,y(), b.w(), b.h())
tmp = img.draw_cross(b.cx(), b.cy())
这样转换后代码可读性可以更高
读懂例程后不难发现整个代码最核心的地方就是 green_threshold 这个元组的值的确定,也就是颜色阈值的确定,颜色阈值的确定可以借助 Maixpy IDE 中的 阈值编辑器
右边未被筛选掉的色块是白色,我们要做的就是只让需要被识别的颜色呈现白色,所以选取的图片最好包含多种颜色,以精确调整阈值防止误识别
比方说我要识别红色可以将阈值调整成如下模样:
将下面的 LAB 阈值元组复制粘贴赋值给 red_threshold 变量,同理生成 yellow_threshold 和 green_threshold 的颜色阈值
下面是自己根据例程和 API 修改延伸的一个识别红绿黄三色的程序:
import sensor
import image
import lcd
import time
'''
依次寻找所有红色色块、绿色色块和黄色色块,将所有色块进行框选并在中心标记十字
将同一种颜色色块的像素数量进行求和,将像素数量最多的颜色的名称存入 result 数组
result 数组中连续 30 次为同一个颜色则打印该颜色作为最终识别结果
'''
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 拍摄彩色图片
sensor.set_framesize(sensor.QVGA) # 设置图片大小为 320x240
sensor.set_auto_exposure(1) # 开启自动曝光
sensor.set_auto_gain(1) # 开启自动增益
sensor.set_auto_whitebal(1) # 开启白平衡
sensor.set_saturation(2) # 拉满饱和度
sensor.run(1)
# 设置三个颜色的阈值
green_threshold = (31, 64, -18, 5, -20, 5)
yellow_threshold = (38, 62, -24, 1, 6, 35)
red_threshold = (32, 66, 9, 54, -9, 37)
results = []
isResultAccurate = False
while True:
img=sensor.snapshot() # 捕获一张照片
# 寻找三种颜色的所有色块
red_blobs = img.find_blobs([red_threshold])
yellow_blobs = img.find_blobs([yellow_threshold])
green_blobs = img.find_blobs([green_threshold])
# 用于计算单个颜色的像素和
red_blobs_pixels_sum = 0
green_blobs_pixels_sum = 0
yellow_blobs_pixels_sum = 0
if red_blobs:
for red_blob in red_blobs:
img.draw_rectangle(red_blob[0:4]) # 画出色块矩形
img.draw_cross(red_blob[5], red_blob[6]) # 在中心坐标上画十字
red_blobs_pixels_sum += red_blob.pixels() # 计算红色色块像素和
if green_blobs:
for green_blob in green_blobs:
img.draw_rectangle(green_blob[0:4])
img.draw_cross(green_blob[5], green_blob[6])
green_blobs_pixels_sum += green_blob.pixels()
if yellow_blobs:
for yellow_blob in yellow_blobs:
img.draw_rectangle(yellow_blob[0:4])
img.draw_cross(yellow_blob[5], yellow_blob[6])
yellow_blobs_pixels_sum += yellow_blob.pixels()
# 创建字典并按照像素和从多到少进行排序
color_blobs = {"red":red_blobs_pixels_sum, "green":green_blobs_pixels_sum, "yellow":yellow_blobs_pixels_sum}
color_blobs_ordered = sorted(color_blobs.items(),key=lambda x:x[1],reverse=True)
# 存入像素和最多的颜色名称
result = color_blobs_ordered[0][0]
results.append(result)
# 连续 30 张图片识别结果都为该颜色则打印该颜色
if len(results) >= 30:
if len(set(results)) == 1:
isResultAccurate = True
results.pop(0)
if isResultAccurate:
print(result)
lcd.display(img) # LCD 显示图片
最后效果:
K210 调节颜色阈值识别红绿黄三色的更多相关文章
- Hierarchical clustering:利用层次聚类算法来把100张图片自动分成红绿蓝三种色调—Jaosn niu
#!/usr/bin/python # coding:utf-8 from PIL import Image, ImageDraw from HierarchicalClustering import ...
- FPGA驱动LCD显示红绿蓝彩条
实验目的:先简单熟悉LCD灯的驱动和时序图的代码实现.设计功能是让LCD显示红绿蓝三种颜色,即三个彩带.本次实验比较容易实现,主要是对LCD驱动时序图的理解和时序参数的配置. 实验条件:1.LCD原理 ...
- 循环灯控制器,该控制器控制红、绿、黄三个发光管循环发亮(VHDL语言)
设计一个循环灯控制器,该控制器控制红.绿.黄三个发光管循环发亮.要求红发光管亮2秒,绿发光管亮3秒,黄发光管亮1秒.(假设外部提供频率为1MHz的方波信号) library ieee; use iee ...
- MACD:黄白线、红绿柱与0轴关系
一.MACD的基本问题: (1)参数:统一用12,26,9 (2)MACD 位正.位不正原则 以下四种情况是黄白线.红绿柱与0轴关系的完全分类,行情出不了这四种情况, 即便黄白线在0轴单边反复缠绕 ...
- vue 状态类展示使用红绿圆点
vue 状态类展示使用红绿圆点通常对于一些在线.离线类的展示使用图标展示比使用文字描述会更加清晰直观.项目中使用的代码如下: HTML <el-table-column prop="s ...
- [LeetCode] Similar RGB Color 相似的红绿蓝颜色
In the following, every capital letter represents some hexadecimal digit from 0 to f. The red-green- ...
- [LeetCode] 800. Similar RGB Color 相似的红绿蓝颜色
In the following, every capital letter represents some hexadecimal digit from 0 to f. The red-green- ...
- Amazon才推众包物流,“京东众包”已红绿上阵,“达达”还手握10万配送大军
据外媒消息,Amazon正在开发一款App,想让大家都来为他家送包裹. Amazon的设想是,在市区招募实体零售商,租用空间或者按包裹向其支付费用.这项服务在内部代号为“On My Way”,目前还在 ...
- C#红绿状态灯
1.在Label里 画圆,存在窗体刷新会丢失画. public void SetShowConnectStatus(Label lbl, bool isOk) { lbl.Text = "& ...
- a标签鼠标经过,字颜色和下划线的颜色都变红
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
随机推荐
- 2020-10-06:java中垃圾回收器让工作线程停顿下来是怎么做的?
福大大答案2020-10-06: 简单回答:安全点,主动式中断. 中级回答:用户线程暂停,GC 线程要开始工作,但是要确保用户线程暂停的这行字节码指令是不会导致引用关系的变化.所以 JVM 会在字节码 ...
- 2020-12-03:mysql中,Heap 表是什么?
福哥答案2020-12-04:[答案来自此链接:](http://bbs.xiangxueketang.cn/question/605) Heap表,即使用MEMORY存储引擎的表,这种表的数据存储在 ...
- 2022-03-14:一开始屏幕上什么也没有,粘贴板里什么也没有, 你只能在键盘上做如下4种操作中的1种: 输入:在屏幕上已经显示内容的后面加一个A, 全选:把屏幕上已经显示的全部内容选中, 复制:被
2022-03-14:一开始屏幕上什么也没有,粘贴板里什么也没有, 你只能在键盘上做如下4种操作中的1种: 输入:在屏幕上已经显示内容的后面加一个A, 全选:把屏幕上已经显示的全部内容选中, 复制:被 ...
- 2022-02-26:k8s安装swagger,yaml如何写?
2022-02-26:k8s安装swagger,yaml如何写? 答案2022-02-26: yaml如下: apiVersion: apps/v1 kind: Deployment metadata ...
- 2021-08-25:给定数组father大小为N,表示一共有N个节点,father[i] = j 表示点i的父亲是点j, father表示的树一定是一棵树而不是森林,queries是二维数组,大小为
2021-08-25:给定数组father大小为N,表示一共有N个节点,father[i] = j 表示点i的父亲是点j, father表示的树一定是一棵树而不是森林,queries是二维数组,大小为 ...
- Luogu1772 [ZJOI2006] 物流运输
传送门 简化题意 给你 \(m\) 个码头,码头之间有双向边连接,\(n\) 天,其中一些码头在某些天会不可用,这 \(n\) 天都要有一条从 \(1\) 到 \(m\) 的路,每一次更换道路会需要 ...
- Redis内存兜底策略——内存淘汰及回收机制
Redis内存兜底策略--内存淘汰及回收机制 Redis内存淘汰及回收策略都是Redis内存优化兜底的策略,那它们是如何进行兜底的呢?先来说明一下什么是内存淘汰和内存回收策略: Redis内存淘汰:当 ...
- Python基础 - 注释
单行注释 Python中使用#表示单行注释.一般在#后面添加一个空格,再添加注释内容 1 # 这是单行注释 多行注释 Python中使用三个单引号或三个双引号表示多行注释. 1 ''' 2 这是使 ...
- 你以为搞个流水线每天跑,团队就在使用CI/CD实践了?
在实践中,很多团队对于DevOps 流水线没有很透彻的理解,要不就创建一大堆流水线,要不就一个流水线通吃.实际上,流水线的设计和写代码一样,需要基于"业务场景"进行一定的设计编排, ...
- 【技术积累】Vue.js中的基础概念与语法【一】
写在前面 学习Vue之前最好有前端三驾马车的基础[HTML+CSS+JavaScript] 笔者接了一个从头开发的Vue项目,由于公司急着要,没有时间慢慢像在学校里学了,只能边学边做,现在项目雏形已经 ...