python - 基于 OpenCV 和 Python 中的颜色识别在 Arduino 中打开和关闭 LED
问题描述
我需要通过 Python 和 OpenCV 用 Arduino 打开和关闭 LED。如果我加载红色图像,则必须打开红色 LED,以此类推其他三种颜色。我已经有一个检测红色并删除图像其余部分的代码,以及一个每毫秒关闭和打开 LED 的“while”结构。但是,我不知道如何保存 TRUE 状态,以免获得红色,然后编程“if”条件来控制 LED。提前致谢。
import pyfirmata2
import cv2 as cv #libreria de opencv
import numpy as np #libreria de numpy
original = cv.imread('C:/Users/admin/Documents/Personales/circles.png')
DELAY = 1
PORT = pyfirmata2.Arduino.AUTODETECT
board = pyfirmata2.Arduino(PORT)
rb1 = np.array([0,100,20],np.uint8)
ra1 = np.array([8,255,255],np.uint8)
rb2 = np.array([175,100,20],np.uint8)
ra2 = np.array([179,255,255],np.uint8)
imgHSV = cv.cvtColor(original,cv.COLOR_BGR2HSV)
mr1 = cv.inRange(imgHSV,rb1,ra1)
mr2 = cv.inRange(imgHSV,rb2,ra2)
mascaraRoja = cv.add(mr1,mr2)
mascaraFinal = cv.bitwise_and(original, original, mask = mascaraRoja)
cv.imshow('Original',original)
cv.imshow('Filtrada',mascaraFinal)
while True:
board.digital[13].write(1)
board.pass_time(DELAY)
board.digital[13].write(0)
board.pass_time(DELAY)
cv.waitKey()
解决方案
以下是一些一般性的观察...
在代码中添加注释
将
waitKey()
移到 之后imshow()
,否则它永远不会运行(因为它后面有一个无限循环),这意味着图像不会在你的屏幕上绘制去掉最后的循环——你只需要打开或关闭 LED 一次
用于
cv.countNonZero()
计算蒙版中的像素数并将其保存在变量中,例如nRed = cv.countNonZero(...mask...)
在末尾添加一条
if
语句,检查 LED 是否必须打开或关闭
像这样:
if nRed > 0:
board.digital[13].write(1)
else:
board.digital[13].write(0)
最后,这个有点深奥。色调是一个从 0..179 开始的角度,而红色恰好跨越了值 175、176、177、178、179、0、1、2 ... 8 的范围。这意味着您需要测试两次并结合面具。取而代之的是,您可以反转图像并寻找青色,然后它是连续的并以 90 为中心:
mask = cv.inRange(~imgHSV, ...)
下限 83 和上限 97。
推荐阅读
- python - 根据它们在另一个数据帧中的频率将值附加到一个数据帧
- angular - Angular 7 Http 客户端和 Asp Core - Cors 错误
- ios - 在 iOS 上无法捕捉从“倒置”到横向的方向变化
- r - 在另一个变量的基础上用其他变量创建新变量
- java - 如何将可以是简单字符串或对象的 JSON 元素解析为类对象
- c# - 如何使用 Linq C# 对可变数量的列进行排序?
- javascript - 在“使用严格”之外声明没有 var 的变量
- blazor-server-side - 服务器端 Blazor blazor.server.js 而不是 blazor.webassembly.js
- jquery - 在 table.ajax.reload() 之后未调用数据表 initComplete;
- javascript - 谷歌浏览器不为我的网站提供翻译