Python如何在不干扰GPIO设置的情况下处理OpenCVtriggered循环?

2024-09-29 21:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我把我所有的编程知识放在一起,开始编写一个python代码,该代码与opencv一起使用,应该在我的旧任天堂ds上执行一个操作

我想做的是,首先获得更多关于Raspberry Pi项目的知识,然后构建一个搜索神奇宝贝的设备

听起来可能很傻,但有点背景: “闪亮的神奇宝贝”和普通的一样,只是颜色不同。除此之外别无他途,你可以寻找一个,有些人有耐心去做。我不想,但我还是想自己打猎。 在我试图报道的游戏中,一个人出现的几率是1/8192,所以他们非常罕见。 有一些视频尝试并成功地做到了这一点,但没有关于如何自动完成的指南。opencv上也有一些视频帮助我实现了这一点

幸运的是,你可以开始游戏,遇到神奇宝贝,只需按下A按钮就可以看到它的颜色。如果它不是你想要的颜色,程序应该执行“软重置”,基本上用特定的按钮组合(开始、选择、L和R)重新启动游戏,并继续检查循环。如果颜色不是普通怪物的颜色,它应该停止并等待人工输入,这意味着它是闪亮的

按钮是通过硬焊接电线发出3.3V信号来按下的,因此旧的ds单元不得不受到影响

我注意到,如果您不同时按下所有按钮,则另一个按钮不会干扰游戏本身。 所以我确保电源被传送到启动和选择,R被录音。通过伺服电机触发复位按下L。 为了注意颜色,我使用了OpenCV

现在,我的代码可能会一团糟:

import RPi.GPIO as GPIO
import time
import cv2
import numpy as np

cap = cv2.VideoCapture(0) #Start Camera
GPIO.setmode(GPIO.BOARD)
GPIO.setup(13, GPIO.OUT)
servo1 = GPIO.PWM(13, 50)
GPIO.setup(11, GPIO.OUT)

while True:
    _, frame = cap.read()
    hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # Press A again and again
    GPIO.output(11, 1)
    time.sleep(0.5)
    GPIO.output(11, 0)

    # Define my Pokemon
    low_green = np.array([31, 31, 72])
    high_green = np.array([65, 253, 168])
    green_mask = cv2.inRange(hsv_frame, low_green, high_green)

    #Define Giratina (the one I'm hunting for)
    low_red = np.array([166, 72, 127])
    high_red = np.array([178, 180, 245])
    red_mask = cv2.inRange(hsv_frame, low_red, high_red)

    cv2.imshow("Frame", frame)
    cv2.imshow("Cherry", green_mask)
    cv2.imshow("Giratina", red_mask)
    #Show masks and camera

    if cv2.countNonZero(green_mask) > 20000 and cv2.countNonZero(green_mask) < 30000 and cv2.countNonZero(red_mask) > 1500 and cv2.countNonZero(red_mask) < 5000 :
        #If my mon is present and Giratina is normal
        # Just this one servo is enough to press the button to softreset
        servo1.start(0)
        servo1.ChangeDutyCycle(8.9)
        time.sleep(0.5)
        servo1.ChangeDutyCycle(2)
        time.sleep(0.5)
        servo1.ChangeDutyCycle(0)
        servo1.stop()
        print("No Shiny! Soft Resetting")

    key = cv2.waitKey(1)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()
servo1.stop()
GPIO.cleanup()
print("End of the hunt!")

颜色识别的数字无关紧要,因为一旦我将设备放在一个盒子中以获得一致的照明效果,我就会手动添加它们

什么有效

A按钮是按计划按下的,这里没问题。 if语句似乎也会触发并启动伺服

那有什么问题

伺服似乎触发,但只有一次。 它具有相同的照明和条件,但在执行重置后,它不会再次触发。这可能是一个非常大胆的错误,但我不能单独指出。 此外,有时按下按钮伺服似乎只是重新启动我的Pi,但并不总是。 我认为这可能与按钮“A”和伺服同时被控制有关,这对Pi来说太多了,但这不应该是if语句不可能的吗? 其他按钮(开始,选择不是录音的按钮)由完全不同的电源供电,因此希望它们不会干扰按钮“a”和伺服

提前谢谢,我希望我已经描述了我的问题有点能力。祝你过得愉快


Tags: andimport游戏gpiotime颜色npmask

热门问题