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.

¿Por qué estoy enfrentando un problema con la detección de cuadros en una imagen?

Estoy tratando de detectar todas las formas de cuadrados marcadas en rojo en esta imagen de detección de cuadro de deseo y mostrarlos en este cuadro rojo.

Aquí está mi IMAGEN ORIGINAL:

Aquí está el código que tengo, pero faltan algunos cuadrados.

import cv2
import numpy as np

image = cv2.imread('Music/1.bmp')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, 5)
sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen = cv2.filter2D(blur, -1, sharpen_kernel)

thresh = cv2.threshold(sharpen,160,255, cv2.THRESH_BINARY_INV)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)

cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

min_area = 100
max_area = 1500
image_number = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area > min_area and area < max_area:
        x,y,w,h = cv2.boundingRect(c)
        ROI = image[y:y+h, x:x+w]
        cv2.imwrite('ROI_{}.png'.format(image_number), ROI)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
        image_number += 1

cv2.imshow('sharpen', sharpen)
cv2.imshow('close', close)
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()

Y aquí está mi IMAGEN DE SALIDA:

Por favor, ayúdame a predecir las ubicaciones de los cuadrados que faltan en base a los cuadrados reconocidos. ¿O podemos modificar el algoritmo anterior para el algoritmo de detección de cuadrados?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para detectar todos los cuadros faltantes en la imagen, puedes modificar el algoritmo de la siguiente manera:

    1. Primero, convierte la imagen al espacio de color HSV utilizando cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    2. Define un rango de color rojo en formato HSV: red_lower = np.array([0,50,50]), red_upper = np.array([10,255,255]) y crea una máscara: cv2.inRange(hsv, red_lower, red_upper)
    3. Aplica transformaciones morfológicas a la máscara para eliminar el ruido: cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) y cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    4. Encuentra contornos en la máscara utilizando cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    5. Recorre los contornos y filtra aquellos con un área menor que un umbral, y dibuja cuadros delimitadores alrededor de ellos utilizando cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)

    Aquí está el código modificado:

    import cv2
    import numpy as np
    
    image = cv2.imread('Music/1.bmp')
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    # define rango de color rojo en HSV
    red_lower = np.array([0,50,50])
    red_upper = np.array([10,255,255])
    mask1 = cv2.inRange(hsv, red_lower, red_upper)
    
    # define rango de color rojo en HSV
    red_lower = np.array([170,50,50])
    red_upper = np.array([180,255,255])
    mask2 = cv2.inRange(hsv, red_lower, red_upper)
    
    # combina máscaras
    mask = cv2.bitwise_or(mask1, mask2)
    
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    
    cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    
    min_area = 100
    image_number = 0
    for c in cnts:
        area = cv2.contourArea(c)
        if area > min_area:
            x,y,w,h = cv2.boundingRect(c)
            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
    
    cv2.imshow('mask', mask)
    cv2.imshow('image', image)
    cv2.waitKey()
    

    Aquí está la imagen resultante:

    Output Image

    Ten en cuenta que este enfoque asume que los cuadros rojos son uniformes en color y no tienen ninguna textura o patrón en ellos. Si los cuadros tienen textura o patrón, es posible que necesites utilizar un algoritmo más avanzado como el emparejamiento de características o el emparejamiento de plantillas.

Comments are closed.