Извлечь прямоугольник лица из удостоверения личности - PullRequest
0 голосов
/ 26 декабря 2018

Я исследую вопрос извлечения информации из удостоверений личности и нашел подходящий алгоритм для определения лица на передней панели.На самом деле, в OpenCV для этого есть каскады Хаара, но я не уверен, что можно использовать для выделения полного прямоугольника, в котором находится человек, а не только лицо (как это сделано в https://github.com/deepc94/photo-id-ocr). Несколько идей, которые яЕще предстоит проверить:

  1. Найти второй по величине прямоугольник внутри карточки, содержащей прямоугольник лица
  2. Делать «взрыв» прямоугольника лица, пока он не достигнет границы
  3. Поэкспериментируйте с фильтрами, чтобы увидеть, что можно увидеть

Что можно порекомендовать попробовать и здесь? Любые мысли, идеи или даже существующие примеры хороши.

1 Ответ

0 голосов
/ 26 декабря 2018

Обычный подход:

import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread("a.jpg")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,128,255,cv2.THRESH_BINARY)
cv2.imshow("thresh",thresh)

thresh = cv2.bitwise_not(thresh)

element = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=(7, 7))

dilate = cv2.dilate(thresh,element,6)
cv2.imshow("dilate",dilate)
erode = cv2.erode(dilate,element,6)
cv2.imshow("erode",erode)

morph_img = thresh.copy()
cv2.morphologyEx(src=erode, op=cv2.MORPH_CLOSE, kernel=element, dst=morph_img)
cv2.imshow("morph_img",morph_img)

_,contours,_ = cv2.findContours(morph_img,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

areas = [cv2.contourArea(c) for c in contours]

sorted_areas = np.sort(areas)
cnt=contours[areas.index(sorted_areas[-3])] #the third biggest contour is the face
r = cv2.boundingRect(cnt)
cv2.rectangle(image,(r[0],r[1]),(r[0]+r[2],r[1]+r[3]),(0,0,255),2)

cv2.imshow("img",image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Я обнаружил, что первые два самых больших контура - это граница, третий самый большой - это лицо.Результат:

enter image description here

Существует также другой способ исследования изображения с использованием суммы значений пикселей по осям:

x_hist = np.sum(morph_img,axis=0).tolist() 
plt.plot(x_hist)
plt.ylabel('sum of pixel values by X-axis')
plt.show()

y_hist = np.sum(morph_img,axis=1).tolist()
plt.plot(y_hist)
plt.ylabel('sum of pixel values by Y-axis')
plt.show()

enter image description here enter image description here

Основываясь на суммах пикселей по 2 асфиксам, вы можете обрезать область, которую хотите, задав для нее пороговые значения.

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