def objectsRecognition(image, draw=False): config, order, mtx, dist, T, distRatio, thresholdValue, objectHeight = configRead( 'config.json') # Odczytanie parametrów z pliku konfiguracyjnego cnts, points = contoursDetection( image, draw) # Wykrywanie konturów na obrazie przekazanym jako argument shapes_info = np.empty(shape=( 0, 4 )) # Inicjalizacja tablicy przechowywującej dane o znalezionych obiektach # Pętla dla każdego wykrytego obiektu for point, cnt in zip(points, cnts): color = colorRecognition(image, cnt) # Wykrycie koloru danego konturu # Zapis informacji do talblicy [[X, Y, theta], kolor, pole powierzchnii] shapes_info = np.append(shapes_info, [[[point[0], point[1]], point[2], color, cv.contourArea(cnt) * (distRatio**2)]], axis=0) # Funkcje rysujące do przedstawienia informacji o obiektach if draw: return shapes_info, image else: return shapes_info
def contoursDetection(image, drawContours=False): config, order, mtx, dist, T, distRatio, thresholdValue, objectHeight = configRead( 'config.json') # Odczytanie parametrów z pliku konfiguracyjnego # Preprocessing obrazu hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV) # Zmiana przestrzenii barw obrazu h, s, v = cv.split(hsv) # Rozdzielenie kanałów obrazu na osobne zmienne blurred = cv.GaussianBlur(v, (5, 5), 0) # Rozmycie obrazu thresh = cv.threshold(blurred, thresholdValue, 255, cv.THRESH_BINARY)[ 1] # Binaryzacja obrazu przy użyciu zmiennej z pliku kalibracyjnego cv.imshow('thresh', thresh) # Wykrywanie konturów na obrazie cnts = cv.findContours(thresh.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) # Inicjalizacja tablicy dla punktów centralnych center_points = np.empty(shape=(0, 3), dtype=int) for c in cnts: m = cv.moments(c) # Obliczenie momentów geometrycznych if m["m00"] != 0: x = m["m10"] / m["m00"] # Obliczenie współrzędnej X y = m["m01"] / m["m00"] # Obliczenie współrzędnej Y u20 = m['m20'] / m['m00'] - x * x u02 = m['m02'] / m['m00'] - y * y u11 = m['m11'] / m['m00'] - x * y if (u20 - u02) != 0: theta = 0.5 * math.atan2(2 * u11, (u20 - u02)) else: theta = 0 else: x = 0 y = 0 center_points = np.append( center_points, [[x, y, theta]], axis=0) # Dodanie nowych współrzędnych do tablicy if drawContours: cv.drawContours(image, [c], -1, (0, 0, 255), 2) # Rysowanie konturów na obrazie return cnts, center_points, image else: return cnts, center_points
import cvision as cvis from picamera.array import PiRGBArray from picamera import PiCamera from time import sleep from matplotlib import pyplot as plt import numpy as np import json def nothing(x): pass # Pobranie danych o kamerze, macierzy homografii oraz kolejności podawania elementów # z pliku konfiguracyjnego, ustawienie wskaźnika element na pierwszą wartość config, order, mtx, dist, T, distRatio, thresholdValue, objectHeight = cvis.configRead( 'config.json') # Początkowe ustawienia kamery camera = PiCamera() camera.resolution = (640, 480) camera.framerate = 30 rawCapture = PiRGBArray(camera, size=(640, 480)) # Zatrzymanie programu aby kamera mogła się uruchomić sleep(0.1) scale = 40 # Zmiejszenie obrazu do 40% oryginalnego width = int(camera.resolution[0] * scale / 100) height = int(camera.resolution[1] * scale / 100) dim = (width, 3 * height) # Nowe wymiary obrazu fig = plt.figure() # Inicjalizacja wykresu