Обрезать прямоугольник из изображения (объекты из схемы базы данных) - PullRequest
1 голос
/ 07 января 2020

У меня есть этот код, мне нужно обрезать каждую сущность из разных типов схем базы данных, верстак, sqlserver phpmyadmin et c. этот код должен обнаруживать, рисовать и обрезать каждую сущность, но в том же случае он не работает.

import cv2
import os
import pytesseract
from PIL import Image

#obtengo la direccion donde se encuentra los recortes

lista = os.listdir('C:/Users/Usuario/Documents/Deteccion de Objetos/recortes')

#busco la ultima carpeta creada de los recortes

ultimo = lista.pop()
convertido = int(ultimo)

path = 'C:/Users/Usuario/Documents/Deteccion de Objetos/recortes/' + ultimo
image = cv2.imread("C:/Users/Usuario/Documents/Deteccion de Objetos/imagenes/Nuevacarpeta/sqlserver.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]


cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area < 5000:
        cv2.drawContours(thresh, [c], -1, (0,0,0), -1)


close_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
close = 255 - cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, close_kernel, iterations=6)
cnts = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area < 15000:
        cv2.drawContours(close, [c], -1, (0,0,0), -1)


close = 255 - close
open_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20,20))
opening = cv2.morphologyEx(close, cv2.MORPH_OPEN, open_kernel, iterations=3)

# Busca los contornos y dibuja los resultados
ROI_number = 0
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(image, [c], -1, (36,255,12), 3)
    #aqui se realiza el recorte de cada entidad
    x,y,w,h = cv2.boundingRect(c)
    ROI = image[y:y+h, x:x+w]
    cv2.imwrite(os.path.join(path , 'imagen_{}.png'.format(ROI_number)), ROI)
    cv2.rectangle(image,(x,y),(x+w,y+h),(36,255,12),2)
    ROI_number += 1

nuevo = str(convertido + 1).zfill(7)

os.chdir('C:/Users/Usuario/Documents/Deteccion de Objetos/recortes')
os.mkdir(nuevo)

print("Cantidad de entidades ", len(cnts))
cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('image', image)
cv2.waitKey()

например, я получаю этот результат из схемы sqlserve:

enter image description here

я получаю это из этого изображения в верстаке:

enter image description here

я получаю это из схемы phpmyadmin: в данном случае ничего не работает.

enter image description here

, но в этом случае это работает:

enter image description here

Не могли бы вы помочь мне правильно нарисовать контуры каждой сущности из любой схемы?

это картинки, которые не работают.

enter image description here enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...