MessDetector/dishsnitch.py

141 lines
4.5 KiB
Python
Raw Permalink Normal View History

2023-11-07 11:38:19 +00:00
import copy
import os
import time
import cv2
import numpy as np
#from playsound import playsound
#import pygame as pg
## Define our config values
# What is our min dish count to alarm on?
min_dishes = 1
# Define areas we want to ignore
# First value is the x range, second is the y range
ignore_list = ["339-345,257-260"]
# Set our timestamp
time_stamp = time.strftime("%Y%m%d%H%M%S")
# Set our circle detection variables
circle_sensitivity = 40 # Larger numbers increase false positives
#circle_sensitivity = 60 # Larger numbers increase false positives
min_rad = 30 # Tweak this if you're detecting circles that are too small
max_rad = 75 # Tweak if you're detecting circles that are too big (Ie: round sinks)
# Cropping the image allows us to only process areas of the image
# that should have images. Set our crop values
crop_left = 100
crop_right = 2000
crop_top = 0
crop_bottom = 2000
def should_ignore(ignore_list, x, y):
# Loop through our ignore_list and check for this x/y
ignore = False
for range in ignore_list:
x_range = range.split(',')[0]
y_range = range.split(',')[1]
x_min = int(x_range.split('-')[0])
x_max = int(x_range.split('-')[1])
y_min = int(y_range.split('-')[0])
y_max = int(y_range.split('-')[1])
if (x >= x_min and x <= x_max and y >= y_min and y <= y_max):
ignore = True
return ignore
def play_music(music_file, volume=0.8):
'''
stream music with mixer.music module in a blocking manner
this will stream the sound from disk while playing
'''
# set up the mixer
freq = 44100 # audio CD quality
bitsize = -16 # unsigned 16 bit
channels = 2 # 1 is mono, 2 is stereo
buffer = 2048 # number of samples (experiment to get best sound)
pg.mixer.init(freq, bitsize, channels, buffer)
# volume value 0.0 to 1.0
pg.mixer.music.set_volume(volume)
clock = pg.time.Clock()
try:
pg.mixer.music.load(music_file)
#print("Music file {} loaded!".format(music_file))
except pg.error:
print("File {} not found! ({})".format(music_file, pg.get_error()))
return
pg.mixer.music.play()
while pg.mixer.music.get_busy():
# check if playback has finished
clock.tick(30)
def check_if_dishes_exist():
# Note: Larger images require more processing power and have more false positives
image_original = cv2.imread(os.path.join('dirty.jpeg'))
#print("Cropping image to limit processing to just the sink")
image = image_original[crop_left:crop_right, crop_top:crop_bottom]
image = image_original
#print("Copying image")
output = copy.copy(image)
#print("Blurring image")
blurred = cv2.GaussianBlur(image, (9, 9), 2, 2)
cv2.imwrite(os.path.join('blurred.jpg'), blurred)
#print("Converting to grey")
gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
cv2.imwrite(os.path.join('gray.jpg'), gray)
#print("Detecting circles in blurred and greyed image")
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20,
param1=100,
param2=circle_sensitivity,
minRadius=min_rad,
maxRadius=max_rad)
#print("Checking if we found images")
if circles is not None:
dish_count = 0
print("Dishes Found!")
# convert the (x, y) coordinates and radius of the circles to integers
circles = np.round(circles[0, :]).astype("int")
# loop over the (x, y) coordinates and radius of the circles
for (x, y, r) in circles:
# draw the circle in the output image, then draw a rectangle
# corresponding to the center of the circle
cv2.circle(output, (x, y), r, (0, 255, 0), 4)
cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
# Check our ignore_list
if (should_ignore(ignore_list, x, y)):
print("Circle in ignore_list: Ignoring")
else:
dish_count += 1
print("Dish count:%s" % (str(dish_count)))
cv2.imwrite(os.path.join('detected.jpg'), output)
if dish_count >= min_dishes:
print("Playing dirty dishes sound..")
global_vars.current_sink_status = "dirty"
# optional volume 0 to 1.0
print("test")
else:
print("No Dishes Found!")
if __name__ == "__main__":
check_if_dishes_exist()