Обрезать контур с текстом - PullRequest
       38

Обрезать контур с текстом

0 голосов
/ 17 октября 2019

Я пытался работать над определением нестандартного номерного знака, используя opencv и python. Я дошел до того, что, похоже, не могу найти выход, обнаружив только контур номерного знака из нескольких контуров. Проблема в том, что Катар имеет нестандартные размеры номерных знаков и цвета фона. Я не могу обрезать площадь тарелки в зависимости от цвета и размера. Я должен сделать это на основе текста, потому что изображения с камеры показывают табличку и соседние области, которые не имеют текста. Как я могу это сделать. Любая помощь будет оценена. Код пока такой, как показано ниже, а контурное изображение показано под кодом.

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

# Read the image file
image = cv2.imread(r'C:/Users/Anaconda/Anaconda3/envs/ALPR/OOOL/pictures/Car_1.jpg')

# Crop the ROI
roi = image[414:1000, 374:1500]
# cv2.imshow("ROI Image", roi)
# cv2.waitKey(0)

# RGB to Gray scale conversion
plt.rcParams['figure.figsize'] = 7, 7
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
# cv2.imshow("1 - Grayscale Conversion", gray)
# cv2.waitKey(0)

# blur the image
blur = cv2.GaussianBlur(gray, (7, 7), 0)
cv2.imshow('2 - blur', blur)
cv2.waitKey(0)

# find the sobel gradient. use the kernel size to be 3
sobelx = cv2.Sobel(blur, cv2.CV_8U, 1, 0, ksize=3)
cv2.imshow('3 - sobelx', sobelx)
cv2.waitKey(0)

# Otsu thresholding
_, th2 = cv2.threshold(sobelx, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('4 - binary', th2)
cv2.waitKey(0)

# Morphological Closing
se = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 5))
closing = cv2.morphologyEx(th2, cv2.MORPH_CLOSE, se)
cv2.imshow('5 - Morph', closing)
cv2.waitKey(0)

contours, _ = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    rect = cv2.minAreaRect(cnt)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(roi, [box], 0, (0, 255, 0), 2)
cv2.imshow('6 - contours', roi)
cv2.waitKey(0)


# validate a contour. We validate by estimating a rough area and aspect ratio check.
def validate(cnt):
    rect = cv2.minAreaRect(cnt)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    output = False
    width = rect[1][0]
    height = rect[1][1]
    if (width != 0) & (height != 0):
        if ((height / width > 1) & (height > width)) | ((width / height > 1) & (width > height)):
            if (height * width < 16000) & (height * width > 3000):
                output = True
    return output


# Lets draw validated contours with red.
for cnt in contours:
    if validate(cnt):
        rect = cv2.minAreaRect(cnt)
        box = cv2.boxPoints(rect)
        box = np.int0(box)
        cv2.drawContours(roi, [box], 0, (0, 0, 255), 2)
cv2.imshow('7 - f_contours', roi)
cv2.waitKey(0)

При этом я получаю ниже: Контуры номерного знака

...