Я пытался работать над определением нестандартного номерного знака, используя 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)
При этом я получаю ниже: Контуры номерного знака