Añadir nuevo comentario

Seguimiento de objetos con Raspberry . Visión Artificial

Español

En este proyecto vamos a presentar como usar la Raspberry Pi para conectar una webcam y poder realizar el seguimiento de un objeto a través de esa camara y un servomotor conectada a ella. 

1.- Instalación del SO en la SD de la Raspberry

Para realizar el proyecto probamos primeramente con Raspbian y con Pidora. El hecho de usar estos SO nos obliga posteriormente a instalar muchas librearias externas, y al final algunas nos dieron problemas de compatibilidad. Es por ello que nos decantamos por Occidentalis (sección HOW TO INSTALL) .Esta versión ya incluye la mayoria de librerias que necesitamos para el proyecto.

 

2.- Conexión del servomotor a la Raspberry Pi

 

Para realizar la conexión entre el portapilas (necesario para alimentar el servo) , Servo y Raspberry Pi procederemos de la manera siguiente:

- El servo lleva tres cables :

rojo = +5V

negro = GND

Amarillo/blanco/naranja = señal de control 

- Unimos el cable rojo del portapilas con el cable rojo del servomotor

- Unimos el cable negro del servo con el cable negro del portapilas

Ahora tenemos hechas las conexiones tal y como se muestra en la fotografia 

- Conectamos los 2 pins ( negativo y control ) a la raspberry Pi .

 

Para ello debemos conectar el negativo a alguno de los pins de masa de la Raspberry ( pin 6, pin 14 o pin 25) y conectar el cable de control al pin correspondiente donde enviaremos los pulsos, en nuestro caso el pin 4 (si queremos cambiar de pin , deberemos ajustar las lineas correspondientes de codigo ).

Programa : servo.py

# Servo Control
import time
# Definimos la variable de la función
def set(property, value):
try:
f = open("/sys/class/rpi-pwm/pwm0/" + property, 'w')
f.write(value)
f.close()
except:
print("Error writing to: " + property + " value: " + value)
# Definimos el angulo que tiene que realizar el servo
def setServo(angle):
set("servo", str(angle))
set("delayed", "0")
set("mode", "servo")
# Angulo máximo al cual debe llegar el servo
set("servo_max", "180")
set("active", "1")
# Funcíon para indicar la velocidad de giro del servo.
delay_period = 0.01
# Funció de repetición(bucle).
while True:
# Acción para empezar a 0º y llegar hasta 180º
for angle in range(0, 180):
setServo(angle)
time.sleep(delay_period)
# Acción para empezar en 180º y llegar hasta 0º
for angle in range(0, 180):
setServo(180 - angle)
time.sleep(delay_period)

(fuente : Adafruit )

Con este programa comprobaremos que el servomotor realiza giros de 180º en los dos sentidos. De esta manera sabemos que la comunicación con la raspberry es correcta.

3.- Conexión de la webcam a la Raspberry Pi

Ahora debemos conectar la webcam a la raspberry y comprobar también su comunicación en combinación con el servo. La unión entre la webcam y el servo puede ser simplemente un velcro de doble cara

El programa que usaremos para la comunicación es el siguiente : cam.py

 

# - * - Coding: utf-8 - * - 
# CamTracker.py - track a colourful object with a webcam mounted atop a servo
# Running on a Raspberry Pi, Raspbian Wheezy OS
# (c) Sakari Kapanen, 2013
import cv2
import numpy as np
from RPIO import PWM
# the HSV range we use to detect the colourful object
Hmin = 159
Hmax = 179
Smin = 108
Smax = 255
Vmin = 80
Vmax = 255
# minimum detected area
minArea = 50
# frame parameters
width = 160
height = 120
cx = int(0.5 * width)
cy = int(0.5 * height)
# servo PWM pulsewidths
dServo = 20
servoVal = 1500
servoMin = 500
servoMax = 2500
# the maximum delta (pixels) when the object is still considered centered
eps = 15
rangeMin = np.array([Hmin, Smin, Vmin], np.uint8)
rangeMax = np.array([Hmax, Smax, Vmax], np.uint8)
cv2.namedWindow("Adjustment")
cv2.namedWindow("Video")

cv2.namedWindow("Binary")
def nothing(*args):
pass
def updateRanges():
Hmin = cv2.getTrackbarPos("Hmin", "Adjustment")
Hmax = cv2.getTrackbarPos("Hmax", "Adjustment")
Smin = cv2.getTrackbarPos("Smin", "Adjustment")
Smax = cv2.getTrackbarPos("Smax", "Adjustment")
Vmin = cv2.getTrackbarPos("Vmin", "Adjustment")
Vmax = cv2.getTrackbarPos("Vmax", "Adjustment")
minArea = cv2.getTrackbarPos("minArea", "Adjustment")
rangeMin = np.array([Hmin, Smin, Vmin], np.uint8)
rangeMax = np.array([Hmax, Smax, Vmax], np.uint8)
return rangeMin, rangeMax, minArea
# create controls for adjusting the detection range
cv2.createTrackbar("Hmin", "Adjustment", Hmin, 179, nothing)
cv2.createTrackbar("Hmax", "Adjustment", Hmax, 179, nothing)
cv2.createTrackbar("Smin", "Adjustment", Smin, 255, nothing)
cv2.createTrackbar("Smax", "Adjustment", Smax, 255, nothing)
cv2.createTrackbar("Vmin", "Adjustment", Vmin, 255, nothing)
cv2.createTrackbar("Vmax", "Adjustment", Vmax, 255, nothing)
cv2.createTrackbar("minArea", "Adjustment", minArea, 1000, nothing)
# capture from the first webcam found
cap = cv2.VideoCapture(0)
if cap.isOpened():
cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, height)
servo = PWM.Servo()
servo.set_servo(4, servoVal)
while True:
servo.set_servo(4, servoVal)
# read a frame
ret, image = cap.read()
# blur the frame
image = cv2.blur(image, (3, 3))
# convert to HSV
imgHSV = cv2.cvtColor(image, cv2.cv.CV_BGR2HSV)
rangeMin, rangeMax, minArea = updateRanges()
# pixels within range are set to 1, others to 0
imgThresh = cv2.inRange(imgHSV, rangeMin, rangeMax)
#imgThresh = cv2.blur(imgThresh, (2, 2))
# calculate image moments
moments = cv2.moments(imgThresh, True)
if moments['m00'] >= minArea:
# calculate the centroid of the object using the moments
x = moments['m10'] / moments['m00']
y = moments['m01'] / moments['m00']
cv2.circle(image, (int(x), int(y)), 5, (0, 255, 0), -1)
# move the servo if necessary, check limits
dx = x - cx
step = abs(int(dx / 20) * dServo)
if (x - cx) > eps:
servoVal += step
elif (cx - x) > eps:
servoVal -= step
if servoVal < servoMin:
servoVal = servoMin
if servoVal > servoMax:
servoVal = servoMax
cv2.imshow("Video", image)
cv2.imshow("Binary", imgThresh)
key = cv2.waitKey(10)
if key == 27:
break
cv2.destroyAllWindows()

(fuente : Flanelhead)

Para probar la comunicación ejecutaremos el programa cam.py desde el terminal (LXTerminal en la Raspberry):

>sudo python cam.py

Con ello deberiamos tener 4 ventanas en el escritorio:

  • LXterminal con datos de la cam
  • Pantalla de Video de la webcam
  • Pantalla de la zona detectada por la webcam
  • Pantalla de ajustes de valores 

Si por alguna razón no es correcto el funcionamiento o no se ejecuta el programa cam.py procederemos a instalar 3 librerias (Open CV, Numpy y RPIO) de la siguiente manera desde el terminal :

  • Biblioteca "Open CV" 

> sudo apt-get install libopencv-dev python-opencv

(enlace web)

  • Biblioteca "Numpy"

sudo apt-get install python-numpy

> sudo apt-get install python-scipy

> sudo apt-get install python-sympy

(enlace web)

  • Biblioteca "RPIO"

> sudo apt-get install python-setuptools

> sudo easy_install -U RPIO

(enlace web)


En este video podeis ver el seguimiento de la webcam a un objeto en este caso de color rosa (determinado por el ajuste de valores) y también lo que aparece en pantalla : Selector de color, Visión de la webcam y detección del objeto.

 

 

Plain text

  • No se permiten etiquetas HTML.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Saltos automáticos de líneas y de párrafos.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.