Как обнаружить прямоугольник на низкоконтрастном изображении с низким разрешением в openCV или любым другим способом? - PullRequest
0 голосов
/ 15 апреля 2020

Прежде всего, я использую python 3.7 с openCV 3.4.6.27

У меня есть файл python, который обнаруживает автомобили на шоссе (в видео) .` Разрешение видео 1280 * 720. Он обнаруживает автомобили и сохраняет изображение автомобиля. Изображение машины всегда меньше 200 * 200 пикселей. В изображении автомобиля я должен обнаружить номерной знак и сохранить его изображение.

Но вот проблема, изображение автомобиля имеет такое низкое разрешение, что я не могу определить контур, окружающий номерной знак. В максимуме я могу получить изображение лобового стекла и в большинстве случаев даже не это.

* Я изменил размер изображения до большего размера, который не помог. * Я использовал выравнивание гистограммы, и это еще больше испортило изображение (хотя я все равно не знаю, как это работает) * Я использовал порог, но он тоже не работал (цвета автомобилей и номерных знаков сильно различаются) * Иногда помогает двусторонняя фильтрация иногда нет.

Так может ли кто-нибудь подсказать, что я должен сделать, чтобы иметь возможность обнаружить номерной знак? Пожалуйста, смотрите изображения в этой ссылке. Обнаружение лицензии на изображения

Вот мой код:

import numpy as np
import cv2
import  imutils

imgFile = cv2.imread('1.jpeg')

areaTH = (imgFile.shape[0]*imgFile.shape[1])//1000

image = cv2.cvtColor(imgFile, cv2.COLOR_BGR2GRAY)
image = cv2.bilateralFilter(image, 20, 50, 50)

highThresh, thresh_im = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
lowThresh = 0.5*highThresh

image = cv2.Canny(image, lowThresh, highThresh)

cv2.imshow('canny', image)
cv2.imwrite('canny.png',image)

cnts = cv2.findContours(image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]

for i in cnts:

    if cv2.contourArea(i) > areaTH:

        peri = cv2.arcLength(i, True)
        approx = cv2.approxPolyDP(i, 0.05 * peri, True)

        if (len(approx) == 4):

            cv2.drawContours(imgFile, [i], 0, (0,255,0), -1)
            x,y,w,h = cv2.boundingRect(approx)
            cv2.rectangle(imgFile, (x, y), (x + w, y + h), (0,0,255), 1)



cv2.imshow('contour_detected',imgFile)
cv2.imwrite('contour_detected.png', imgFile)
cv2.waitKey(0)

...