def recuperaRatioDilatacao(contornos, imgOriginal, identificador): ratio = 0.1 for i, c in enumerate(contornos): x, y, w, h = cv2.boundingRect(c) b = 10 roi = imgOriginal[y-b:y + h+b, x-b:x + w+b] resized = roi.copy() #resized = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY) retval, resized = cv2.threshold(resized, 120, 255, type = cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) utils.save('D{}.jpg'.format(i), roi, id=identificador) preResized = resized.copy() print('IMAGEM: ' + str(i)) print('=======================') for x in range(0, 7): print('Processando Ratio: ' + str(ratio)) resized = utils.dilatation(preResized, ratio=ratio) utils.save('ratio{}_{}.jpg'.format(i,x), resized, id=identificador) im2, contours2, hierarchy = cv2.findContours(resized, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contours2 = removeContornosPqnos(contours2) if (len(contours2) == 1): break else: ratio += 0.3 print() print('Ratio encontrado: ' + str(ratio)) return ratio
def extraiContornos(imgGray, identificador): utils.save('cnh_antesTh.jpg', imgGray, id=identificador) retval, imgGray = cv2.threshold(imgGray, 2, 255, type = cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) utils.save('cnh_postTh.jpg', imgGray, id=identificador) imgGray, densidade = utils.removeContornosPqnosImg(imgGray) utils.save('cnh_novosContornos.jpg', imgGray, id=identificador) imgGray = utils.dilatation(imgGray, ratio=0.2) im2, contours, hierarchy = cv2.findContours(imgGray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) return imgGray, contours, hierarchy
def extrai(): color = cv2.imread('data\leo.jpg', 1) color = cv2.resize(color, (0, 0), fx=0.3, fy=0.3) color = utils.removeSombras(color) imgGray = cv2.cvtColor(color, cv2.COLOR_BGR2GRAY) save(imgGray) retval, imgGray = cv2.threshold(imgGray, 2, 255, type=cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) imgGray = utils.removeContornosPqnosImg(imgGray) imgGray = utils.dilatation(imgGray, ratio=0.09) im2, contours, hierarchy = cv2.findContours(imgGray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts2 = sorted(contours, key=sortAltura, reverse=True) assinaturas = list() for i, c in enumerate(cnts2): x, y, w, h = cv2.boundingRect(c) existeEntre = existeEntreAlgumaFaixa(assinaturas, y, h) if existeEntre == False: assinaturas.append((y, y + h)) print(existeEntre) for ass in assinaturas: cv2.rectangle(color, (0, ass[0]), (color.shape[0] + w, ass[1]), (255, 0, 0), 6) save(color)
def extrai(path, identificador): color = cv2.imread(path, -1) color = cv2.resize(color, (0, 0), fx = 0.3, fy = 0.3) imgOriginal = color.copy() color = utils.removeSombras(color) utils.save('semSombra.jpg', color, id=identificador) #imgOriginal, color = recuperaAreaAssinada(color.copy(), imgOriginal, identificador) #utils.save('antesGray.jpg', color, id=identificador) imgGray = cv2.cvtColor(color, cv2.COLOR_BGR2GRAY) imgPbOriginal = imgGray.copy() utils.save('pb1.jpg', imgGray, id=identificador) #imgGray = rotate_bound(imgGray, 90) #utils.save('pb2.jpg', imgGray) #imgGray = cv2.blur(imgGray, (blurI, blurI)) #utils.save('blur.jpg', imgGray) utils.save('AntesThr.jpg', imgGray, id=identificador) imgGray, contours, hierarchy = extraiContornos(imgGray, identificador) utils.save('thr.jpg', imgGray, id=identificador) cnts2 = sorted(contours, key=functionSort, reverse=True)[0:5] printaContornoEncontrado(imgOriginal, cnts2, identificador) cnts2 = sorted(cnts2, key=functionSortPrimeiroPapel) printaOrdem(imgOriginal, cnts2, identificador) originalEmGray = cv2.cvtColor(imgOriginal, cv2.COLOR_BGR2GRAY) #originalHisto = cv2.equalizeHist(originalEmGray) originalHisto = originalEmGray lista = dict() cntArr = dict() #ratioDilatacao = recuperaRatioDilatacao(cnts2, imgPbOriginal, identificador) for i, c in enumerate(cnts2): x, y, w, h = cv2.boundingRect(c) b = 0 #print('{} x={} - y{}'.format(i,x,y)) utils.save('imgPbSemSombra2-{}.jpg'.format(i), imgPbOriginal, id=identificador) roi = imgPbOriginal[y-b:y + h+b, x-b:x + w+b] utils.save('roi_{}.jpg'.format(i), roi, id=identificador) #utils.save('_1_hist_{}.jpg'.format(i), roi) #roi = utils.resize(roi, width=300, height=300) resized = roi.copy() #resized = cv2.blur(resized, (blurI,blurI)) #utils.save('__{}_blur1.jpg'.format(i), resized) #resized = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY) #resized = cv2.blur(resized, (5,5)) retval, resized = cv2.threshold(resized, 120, 255, type = cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) resized = utils.removeContornosPqnosImg(resized) utils.save('t_{}.jpg'.format(i), resized, id=identificador) cv2.waitKey(0) #print('ratioDilatacao ' + str(ratioDilatacao)) resized = utils.dilatation(resized, ratio=0.3) utils.save('t1_{}.jpg'.format(i), resized, id=identificador) im2, contours2, hierarchy = cv2.findContours(resized, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) print('Ajustando espacos') contours2, resized = ajustaEspacosContorno(contours2, resized) print('espacos ajustados') cnts = sorted(contours2, key=functionSort, reverse=True)[0] #roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) novaMat = np.zeros(roi.shape, dtype = "uint8") cv2.drawContours(novaMat, [cnts], -1, 255, -1) #novaMat = cv2.resize(novaMat, (200,200), interpolation = cv2.INTER_AREA) #lista[i] = mahotas.features.zernike_moments(novaMat, 21) lista[i] = cnts cntArr[i] = cnts utils.save('_img_{}.jpg'.format(i), novaMat, id=identificador) #utils.show(color) hd = cv2.createHausdorffDistanceExtractor() sd = cv2.createShapeContextDistanceExtractor() out = "" sizeOut = "" resultadoApi = True imgResultado = imgOriginal.copy() for idx1 in range(0,1): #recupera apenas a primeira imagem e a compara com as outras item1 = lista[idx1] altura1, largura1 = calculaAlturaLargura(item1) soma = 0 for idx2 in range(0,5): item2 = lista[idx2] altura2, largura2 = calculaAlturaLargura(item2) #sizeOut += 'Altura {} - {} = {} / {}\n'.format(altura1, altura2, abs(altura1 - altura2), calcPercentual(largura1, largura2)) #sizeOut += 'Largura {} - {} = {} / {}\n'.format(largura1, largura2, abs(largura1 - largura2), calcPercentual(largura1, largura2)) sizeOut += 'Dimensao {} x {} \n'.format(largura2, altura2) tamanhoCompativel = alturaLarguraCompativel(altura1, largura1, altura2, largura2) #match = hd.computeDistance(item1, item2) #match = cv2.matchShapes(cntArr[idx1], cntArr[idx2], 1, 0.0) ida = sd.computeDistance(item1, item2) volta = sd.computeDistance(item2, item1) #ida = dist.euclidean(item1, item2) #volta = dist.euclidean(item2, item1) ida = round(ida, 5) volta = round(volta, 5) out += '{} vs {} ({}) == {} - {}\n'.format(idx1, idx2, tamanhoCompativel, ida, volta) #BGR if ( idx2 == 0 ): imgResultado = contorna(imgResultado, cnts2[idx2], (0,255,0)) #sucesso elif ( ida < 10 and volta < 10 and tamanhoCompativel == True): imgResultado = contorna(imgResultado, cnts2[idx2], (0,255,0)) #sucesso else: imgResultado = contorna(imgResultado, cnts2[idx2], (0,0,255)) #falha resultadoApi = False pathTxt = utils.buildPath(identificador, path="calc.txt") with open(pathTxt, "w") as text_file: text_file.write(sizeOut) text_file.write('\n') text_file.write(out) utils.save(names.RESULTADO, imgResultado, id=identificador) return resultadoApi