by hdbreaker
Hace tiempo estoy trabajando en un proyecto de robotica trabajando con Raspberry PI, el objetivo final? Construir un Rover Teledirigido y Autonomo, como
es esto?
por medio de la programación de distintos modulos que le permitan trabajar de forma Autonoma o Teledirigida. El lenguaje elegido fue Python por el excelente soporte y cantidad de librerÃas que van de la mano junto con RPI.
En esta entrada, tratare sobre el desarrollo de un Sistema de seguimiento de Objetos, con el cual al final de cuentas manejo, la aceleración y los movimientos laterales del Robot al seguir una pelota de tenis.
Para esto utilizo unas librerÃas especiales multiplataforma que vienen de la mano de: http://opencv.org/
es esto?
por medio de la programación de distintos modulos que le permitan trabajar de forma Autonoma o Teledirigida. El lenguaje elegido fue Python por el excelente soporte y cantidad de librerÃas que van de la mano junto con RPI.
En esta entrada, tratare sobre el desarrollo de un Sistema de seguimiento de Objetos, con el cual al final de cuentas manejo, la aceleración y los movimientos laterales del Robot al seguir una pelota de tenis.
Para esto utilizo unas librerÃas especiales multiplataforma que vienen de la mano de: http://opencv.org/
Como se instala? (Recuerden que trabajamos sobre un entorno Debian)
sudo apt-get install python-opencv
Como se utiliza?
En nuestro IDE preferido (Pycharm) debemos importar la siguiente librerÃa:
import cv2
Una vez hecho esto podemos ponernos a trabajar
Como funciona?OpenCV trabaja realizando filtros especiales a los FPS realizados por la cámara, por lo que podemos manipular las imágenes tomadas dependiendo lo que queramos rastrear. Podemos filtrar por color y bordes (lo que más nos interesa) entre otros
Lectura Recomendada:
http://alereimondo.no-ip.org/OpenCV/uploads/41/tema3.pdf
Vamos por partes:
Establecemos el puerto de video /dev/video{Number}
self.capture = cv2.VideoCapture(1)Creamos Filtros:
img = cv2.GaussianBlur(orig_img, (5,5), 0)</div> img = cv2.cvtColor(orig_img, cv2.COLOR_BGR2HSV) img = cv2.resize(img, (len(orig_img[0]) / self.scale_down, len(orig_img) / self.scale_down))
Establecemos los colores a buscar por los filtros:
gren_lower = np.array([50, 100, 100]) gren_upper = np.array([70, 255, 255])
Iniciamos los Filtros:
gren_binary = cv2.inRange(img, gren_lower, gren_upper) dilation = np.ones((15, 15), "uint8") gren_binary = cv2.dilate(gren_binary, dilation)Obtenemos Contornos:
contours, hierarchy = cv2.findContours(gren_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) max_area = 0 largest_contour = NoneGeneramos Circulo de Enfoque:
(x,y),radius = cv2.minEnclosingCircle(contour) x = rect[0][0] * self.scale_down y = rect[0][1] * self.scale_down center = (int(x),int(y)) radius = int(radius) cv2.circle(orig_img,center,radius,(0,255,0),2)Codigo Completo:
import cv2, math import numpy as np class ColourTracker: def __init__(self): cv2.namedWindow("ColourTrackerWindow", cv2.CV_WINDOW_AUTOSIZE) self.capture = cv2.VideoCapture(1) self.scale_down = 4 def run(self): while True: f, orig_img = self.capture.read() orig_img = cv2.flip(orig_img, 1) #Creo Filtros img = cv2.GaussianBlur(orig_img, (5,5), 0) img = cv2.cvtColor(orig_img, cv2.COLOR_BGR2HSV) img = cv2.resize(img, (len(orig_img[0]) / self.scale_down, len(orig_img) / self.scale_down)) #Establesco colores a Filtrar gren_lower = np.array([50, 100, 100]) gren_upper = np.array([70, 255, 255]) #Inicio los Filtros gren_binary = cv2.inRange(img, gren_lower, gren_upper) dilation = np.ones((15, 15), "uint8") gren_binary = cv2.dilate(gren_binary, dilation) #Obtengo contornos contours, hierarchy = cv2.findContours(gren_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) max_area = 0 largest_contour = None for idx, contour in enumerate(contours): area = cv2.contourArea(contour) if area > max_area: max_area = area largest_contour = contour if not largest_contour == None: moment = cv2.moments(largest_contour) if moment["m00"] > 1000 / self.scale_down: rect = cv2.minAreaRect(largest_contour) #Genero un ciruclo de enfoque (x,y),radius = cv2.minEnclosingCircle(contour) x = rect[0][0] * self.scale_down y = rect[0][1] * self.scale_down center = (int(x),int(y)) radius = int(radius) cv2.circle(orig_img,center,radius,(0,255,0),2) #Muestro el resultado cv2.imshow("ColourTrackerWindow", orig_img) #En Base a X giro hacia un lado u otro if(x>450): print("giro a la derecha") else: if(x<150): print("giro a la izquierda") else: print("centrado") if cv2.waitKey(20) == 27: cv2.destroyWindow("ColourTrackerWindow") self.capture.release() break if __name__ == "__main__": colour_tracker = ColourTracker() colour_tracker.run()
Resultado