У меня есть следующий идентификатор, и я хочу его обнаружить и деформировать.Основные проблемы
Этот метод не работает со всеми видами набора данных изображений, я не могу найти лучший контур, пожалуйста, предложите лучшие способы его предварительной обработки?
Я получаю два контура, один для фона и один для идентификатора, я хочу просто отфильтровать другие вещи и получить только идентификатор.
Результат:
document_img = cv2.imread(dataset + imfile)
document_img = imutils.resize(document_img, width=460)
src = imutils.resize(document_img, width=460)
gray = cv2.cvtColor(document_img,cv2.COLOR_BGR2GRAY)
document_type = document_types.ID_front.value
equ = cv2.medianBlur(gray, 1)
fil = cv2.bilateralFilter(equ, 9, 11, 17)
thresh = cv2.adaptiveThreshold(fil, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, \
cv2.THRESH_BINARY, 11, 2)
cv2.imshow('canny', thresh)
cv2.waitKey()
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(contours, key=cv2.contourArea, reverse=True)[:5]
screenCnt = None
# loop over our contours
for c in cnts:
# approximate the contour
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.015 * peri, True)
# if our approximated contour has four points, then
# we can assume that we have found our screen
if len(approx) == 4:
screenCnt = approx
break
cv2.drawContours(src, cnts, -1, (0, 255, 0), 3)
cv2.imshow('contours', src)
cv2.waitKey()
# cv2.drawContours(im, appr, -1, (0,255,0), 3)
points_list = [[i[0][0], i[0][1]] for i in screenCnt]
left = sorted(points_list, key=lambda p: p[0])[0:2]
right = sorted(points_list, key=lambda p: p[0])[2:4]
print("l " + str(left))
print("r " + str(right))
lu = sorted(left, key=lambda p: p[1])[0]
ld = sorted(left, key=lambda p: p[1])[1]
ru = sorted(right, key=lambda p: p[1])[0]
rd = sorted(right, key=lambda p: p[1])[1]
print("lu " + str(lu))
print("ld " + str(ld))
print("ru " + str(ru))
print("rd " + str(rd))
lu_ = [(lu[0] + ld[0]) / 2, (lu[1] + ru[1]) / 2]
ld_ = [(lu[0] + ld[0]) / 2, (ld[1] + rd[1]) / 2]
ru_ = [(ru[0] + rd[0]) / 2, (lu[1] + ru[1]) / 2]
rd_ = [(ru[0] + rd[0]) / 2, (ld[1] + rd[1]) / 2]
print("lu_ " + str(lu_))
print("ld_ " + str(ld_))
print("ru_ " + str(ru_))
print("rd_ " + str(rd_))
src_pts = np.float32(np.array([lu, ru, rd, ld]))
dst_pts = np.float32(np.array([lu_, ru_, rd_, ld_]))
h, w, b = src.shape
H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
print("H" + str(H))
imw = cv2.warpPerspective(src, H, (w, h))
im = imw[int(lu_[1]):int(rd_[1]), int(lu_[0]):int(rd_[0])] # cropping image
cv2.imshow('ff', im)
cv2.waitKey()