Nuevas Entradas

Object Tracking System OpenCV

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/

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 = None
Generamos 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



Les dejo una Imagen del estado actual del proyecto:

Estas entradas continuarán con todo el ensamblado y el código del Robot

Share this:

 
Copyright © 2014 Security Signal.
Designed by OddThemes | Distributed By Gooyaabi Templates