Всем привет! Начну с небольшой предыстории. Я живу с двумя кошками, серый канадский сфинкс и бело-рыжая дворняга. У сфинкса есть некоторые проблемы со здоровьем, и ей необходимо соблюдать диету. Соответственно кормить её нужно определённой едой в определённое время. Кошке это не объяснить, она ворует еду у рыжей, по этому было принято решение придумать умную крышку к миске рыжей кошки для предотвращения кражи еды. Так как сам я не программист, я решил воспользоваться не безызвестным chatGPT, и под его руководством я начал пытаться сделать подобную миску. Привело это к созданию двух кодов. Прогуглив все ошибки я их исправил, но беда в том что он всё равно не работает =D
Помогите пожалуйста понять в чём проблема.
Вкратце что у меня есть и как я вижу исход:
Неттоп с web камерой и Bluetooth
Камера смотрит на миски рыжей кошки ровно сверху
Arduino nano 3.0
Hc-05
Sg90
Камера постоянно смотрит на миски рыжей кошки, в момент когда в кадре появляется серый сфинкс, скрипт посылает по bluetooth сигнал на Arduino, который приводит сервопривод в действие. Серый сфинкс из кадра ушёл, миска открылась. Исключение когда рыжая кошка в кадре (сама ест из мисок.), тогда серво в действие не приводим.
Помогите пожалуйста понять в чём проблема.
Вкратце что у меня есть и как я вижу исход:
Неттоп с web камерой и Bluetooth
Камера смотрит на миски рыжей кошки ровно сверху
Arduino nano 3.0
Hc-05
Sg90
Камера постоянно смотрит на миски рыжей кошки, в момент когда в кадре появляется серый сфинкс, скрипт посылает по bluetooth сигнал на Arduino, который приводит сервопривод в действие. Серый сфинкс из кадра ушёл, миска открылась. Исключение когда рыжая кошка в кадре (сама ест из мисок.), тогда серво в действие не приводим.
Arduino:
<Servo.h>
Servo myservo; // create servo object
void setup() {
myservo.attach(9); // attaches the servo on pin 9
Serial.begin(9600); // start serial communication at 9600bps
}
void loop() {
if (Serial.available()){
char command = Serial.read();
if(command == '1'){
myservo.write(90); // if '1' is received rotate the servo by 90 degree
} else {
myservo.write(0); // otherwise set the servo back to 0 degree
}
}
}
Python:
import cv2
import numpy as np
import serial
import time
# Define range of gray color in HSV
lower_gray = np.array([56, 56, 56])
upper_gray = np.array([156, 156, 156])
# Initialize serial port for Bluetooth communication
bluetoothSerial = serial.Serial("COM6", 9600)
time.sleep(2) # wait for the serial connection to initialize
# Open the webcam
cap = cv2.VideoCapture(0)
# This will keep the program running indefinitely
while True:
# Capture frame-by-frame
_, frame = cap.read()
# Convert the frame to HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Threshold the HSV image to get only gray colors
mask = cv2.inRange(hsv, lower_gray, upper_gray)
# Bitwise-AND mask and original image
res = cv2.bitwise_and(frame, frame, mask=mask)
# Detect the contours on the binary image
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# If there are any contours
if contours:
# find the largest contour
largest = max(contours, key=cv2.contourArea)
# get the area of the largest contour
area = cv2.contourArea(largest)
# if the area is above some threshold (you'll have to determine this yourself based on your camera and the size of the cat), then consider it as a cat
if area > 5000:
# Send '1' to rotate the servo to 90 degrees
bluetoothSerial.write(b'1')
else:
# Send '0' to rotate the servo to 0 degrees
bluetoothSerial.write(b'0')
# Short delay to give time for other processes
time.sleep(0.01)