es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo detecto una textura a cuadros en una imagen con OpenCV?

A partir de una imagen de Minecraft donde el objetivo es detectar la presencia de la armadura de malla, he utilizado filtrado en máscaras con HSV.

import numpy as np
import cv2

detect_state = False

lower_range_chainmail_armor = np.array([75, 80, 100])
upper_range_chainmail_armor = np.array([90, 255, 255])

frameHSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

mask_chainmail_armor = cv2.inRange(frameHSV, lower_range_chainmail_armor, upper_range_chainmail_armor)
mask_chainmail_armor_vis = cv2.bitwise_and(frame, frame, mask=mask_chainmail_armor)

'''

Este código no funciona porque no solo necesito comparar el color

'''

if(int(cv2.countNonZero(mask_chainmail_armor)) > 5000):
        print("¡Detectado armadura de malla!")
        detect_state = True
'''

El problema es que no es suficiente con encontrar el color gris, sino que también tiene que ser una especie de textura a cuadros, como en esa imagen.

Imagen original:

[imagen1]

[imagen2]

Imagen binarizada con filtro HSV:

[imagen3]

[imagen4]

¿Cómo hacer que una variable de detección sea verdadera solo cuando detecte una imagen a cuadros como esta?
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Un enfoque para detectar la textura a cuadros es utilizar un algoritmo de detección de bordes, como la detección de bordes de Canny, que puede detectar los límites de objetos y texturas en la imagen. Luego, podemos verificar si los bordes detectados forman un patrón a cuadros, buscando líneas verticales y horizontales alternadas.

    Aquí hay un ejemplo de cómo modificar el código para realizar esta verificación:

    import numpy as np
    import cv2
    
    detect_state = False
    
    lower_range_chainmail_armor = np.array([75, 80, 100])
    upper_range_chainmail_armor = np.array([90, 255, 255])
    
    frameHSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    mask_chainmail_armor = cv2.inRange(frameHSV, lower_range_diamond, upper_range_diamond)
    mask_chainmail_armor = cv2.bitwise_and(frame, frame, mask=mask_chainmail_armor)
    
    # Realizar detección de bordes de Canny en la imagen enmascarada
    edges = cv2.Canny(mask_chainmail_armor, 100, 200)
    
    # Verificar líneas verticales y horizontales alternadas
    vertical_lines = np.sum(edges[:, ::10], axis=1)
    horizontal_lines = np.sum(edges[::10, :], axis=0)
    if np.any(np.diff(vertical_lines > 0) == -1) and np.any(np.diff(horizontal_lines > 0) == -1):
        print("¡Detectar armadura de malla!")
        detect_state = True
    

    En este código, primero realizamos la detección de bordes de Canny en la máscara de la región de la armadura de malla, con un umbral de 100 y 200. Luego, sumamos los píxeles en bloques de 10 a lo largo de las direcciones verticales y horizontales, respectivamente, para crear histogramas de las intensidades de los bordes. Finalmente, verificamos si hay gotas alternadas en los valores del histograma, lo que indicaría la presencia de líneas alternadas.

    Tenga en cuenta que este enfoque asume que la textura a cuadros tiene una frecuencia espacial específica, y es posible que no funcione para patrones arbitrarios. Un enfoque más robusto sería utilizar algoritmos de aprendizaje automático para entrenar un clasificador en un conjunto de datos de imágenes de armadura de malla con patrones y condiciones de iluminación variables.

Comments are closed.