En este post se detalla como añadir una barra deslizante (trackbar) usando Python y openCV. Usaremos las funciones createTrackbar() y getTrackbarPos() para crear la barra deslizante. Y aplicaremos una suma ponderada con la función addWeighted para cambiar el resultado modificando los valores. También usaremos barras deslizantes para encontrar los valores del detector Canny que se adapten mejor a una imagen.
En este primer ejemplo usaremos la función addWeighted, la primera parte del código se muestra a cotinuación:
import cv2
#Leer las imágenes
img1 = cv2.imread("Galapagos.jpg")
img2 = cv2.imread("Cotopaxi.jpg")
Las imágenes usadas son las siguientes:
Usaremos las siguientes funciones de openCV para desarrollar este ejemplo:
Crearemos una ventana con la función namedWindow(), luego creamos la barra deslizante con createTrackbar(), y con la función getTrackbarPos() conoceremos la posición de la barra deslizante.
Nota: Recuerda instalar openCV e importar la biblioteca al inicio del código
Crear una ventana – namedWindow()
La función namedWindow()
crea una ventana (winname) que se puede utilizar para mostrar imágenes y la crear las barras deslizantes. En la siguiente línea se crea una ventana llamada "BarraDeslizante
"
cv2.namedWindow("BarraDeslizante")
Las ventanas creadas serán llamadas por el resto del código según el nombre que tenga asignado, en este ejemplo deberán llamar a "BarraDeslizante"
.
Crear el trackbar – createTrackbar()
La función createTrackbar()
crea una barra de seguimiento, y sus parámetros son los siguientes:
cv2.createTrackbar("trackbarname", "winname", value, count, onChange)
- trackbarname: Nombre de la barra de seguimiento creada. En este ejemplo se llama
"Porcentaje"
- winname: Nombre de la ventana que se utilizará para mostrar la barra de seguimiento creada. Aquí llamaremos a la ventana "BarraDeslizante"
- value: Posición que tendrá la barra inicialmente (No hay valores negativos). En este ejmplo iniciará en 0
- count: Posición máxima de la barra deslizante. Será 100
- onChange: Es la función que será llamada cada vez que el control deslizante cambie de posición. En este esjemplo se llama a la función nada
Con los valores de ejemplo que estamos desarrollando la función createTrackbar
quedará de la siguiente manera:
cv2.createTrackbar("Porcentaje", "BarraDeslizante", 0, 100, nada)
Obtener posición del trackbar – getTrackbarPos()
La función getTrackbarPos()
devuelve la posición actual de la barra de seguimiento especificada. Los parámetros son los siguientes:
valor = cv2.getTrackbarPos('trackbarname', 'winname')
- trackbarname: Nombre de la barra deslizante de donde se obtendrá la posición/valor, aquí será
'Porcentaje'
- winname: Nombre de la ventana donde está la barra deslizante, aquí será
'BarraDeslizante'
getTrackbarPos dará como resultado valor, que representa la posición de la barra deslizante. Este valor lo podemos usar en el resto del código.
Con los valores de ejemplo que estamos desarrollando la función getTrackbarPos
quedará de la siguiente manera:
valor = cv2.getTrackbarPos('Porcentaje', 'BarraDeslizante')
Usamos el bucle while
para que se lea contantemente el valor de la barra deslizante. A continuación se muestra como quedaría el código completo, con la suma ponderada.
import cv2
#Función asociada a la barra deslizante
def nada(x):
pass
#Cargarlas imágenes
img1 = cv2.imread("Galapagos.jpg")
img2 = cv2.imread("Cotopaxi.jpg")
#Crear una ventana y la barra deslizante
cv2.namedWindow("BarraDeslizante")
cv2.createTrackbar("Porcentaje", "BarraDeslizante", 0, 100, nada)
cv2.createTrackbar("Gamma", "BarraDeslizante", 0, 100, nada)
while True:
alpha = cv2.getTrackbarPos('Porcentaje', 'BarraDeslizante') / 100
betha = 1 - alpha
gamma = cv2.getTrackbarPos('Gamma', 'BarraDeslizante')
res = cv2.addWeighted(img1, alpha, img2, betha, gamma)
cv2.imshow("BarraDeslizante", res)
if (cv2.waitKey(1) == ord('s')):
break
cv2.destroyAllWindows()
El resultado con las imágenes que usamos será el siguiente:
Canny con trackbars
En un post anterior vimos cómo funciona el detector de bordes Canny, y que a veces es complicado definir los valores máximos y mínimos de este detector pero podríamos utilizar barras deslizantes para conocer que valores nos conviene usar en nuestras aplicaciones.
Usaremos las siguientes imágenes:
Desarrollamos el código siguiendo el mismo procedimiento y funciones que en la parte inicial de este post.
Descarga estos archivos en GitHub
import cv2
def nada(x):
pass
img = cv2.imread("/home/kipuna/Escritorio/TrackBar-Canny/imagenes/tomates.jpg")
#Redimensionarla imagen
filas, columnas, _ = img.shape
img = cv2.resize(img, (columnas//10, filas//10) )
#Usar blur
img = cv2.blur(img, (5,5))
#Crear la ventana y barras delizantes
cv2.namedWindow("Canny con barras")
cv2.createTrackbar("Umbral1", "Canny con barras", 0, 400, nada)
cv2.createTrackbar("Umbral2", "Canny con barras", 0, 400, nada)
while True:
img2 = img.copy()
a = cv2.getTrackbarPos("Umbral1", "Canny con barras")
b = cv2.getTrackbarPos("Umbral2", "Canny con barras")
imgCanny = cv2.Canny(img, a, b)
#Encontrar y dibujar contornos
contornos, _ = cv2.findContours(imgCanny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img2, contornos, -1, (0, 255, 0), 3)
cv2.imshow("Canny con barras", imgCanny)
cv2.imshow("Contornos", img2)
if cv2.waitKey(1) == ord("s"):
break
cv2.destroyAllWindows()
Obtenesmos un resultado así: