首页 > 解决方案 > 基于 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()

标签: pythonnumpyopencvarduino

解决方案


以下是一些一般性的观察...

  • 在代码中添加注释

  • 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。


推荐阅读