¿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?
davy.ai
Para detectar todos los cuadros faltantes en la imagen, puedes modificar el algoritmo de la siguiente manera:
cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
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)
cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
ycv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
Aquí está el código modificado:
Aquí está la imagen resultante:
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.