Я занимаюсь этим университетским проектом, в котором я пытаюсь обнаружить элементы пользовательского интерфейса на скриншотах приложений Android, используя openCV.Я не ожидаю 100-процентной точности для этого обнаружения элементов пользовательского интерфейса.
Это мой код ниже.Я преобразовываю изображение в оттенки серого, применяю размытие по Гауссу, а затем использую адаптивный порог для преобразования изображения в двоичное.После чего я использую метод поиска контуров.
ap = argparse.ArgumentParser()
ap.add_argument("-i","--image", help = "path to an image", required =
True)
args = vars(ap.parse_args())
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray)
cv2.waitKey(0)
blurred = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.adaptiveThreshold(blurred, 255,
cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 4)
cv2.imshow("thresh",thresh)
cv2.waitKey(0)
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cv2.drawContours(image, cnts, -1, (0,255,0), 1)
cv2.imshow("contours", image)
cv2.waitKey(0)
for c in cnts:
area = cv2.contourArea(c)
print(area)
if area > 50:
M = cv2.moments(c)
cX = int(M['m10'] / M['m00'])
cY = int(M['m01'] / M['m00'])
#cv2.drawContours(image, [c], -1, (0,255,0), 2) # draw contours on image
(x,y,w,h) = cv2.boundingRect(c) # for each contour get a
bounding rectangle
mask = np.zeros(image.shape[:2], dtype = "uint8") # find
shape of the image dimensions and set up a mask
mask[y: y + h, x: x + w] = 255 # convert region of
interest into white
to_display = cv2.bitwise_and(image,image, mask = mask) # carry
out bitwise and
#cv2.putText(image, 'center', (c))
cv2.imshow("Image", to_display)
cv2.waitKey(0)
Это скриншот, на котором я запускаю свой код.
Крайний левый скриншот представляет изображение после применения к нему порога.
Среднее изображение представляет изображение, которое я получаю после рисования контуров.
Последнее изображение показывает, когда я изучаю каждый отдельный контур.Контур покрывает линию, но не инкапсулирует прямоугольник.
У меня есть несколько вопросов.
1) Можно ли просеять контуры для белых прямоугольников.Какие изменения я должен внести в свой код, чтобы добиться этого?
2) Я пытаюсь отсеять неважные контуры, например.слова, и я подумал, смогу ли я использовать функцию getArea (), чтобы помочь мне с этим.Идея состоит в том, что я бы установил минимальный размер контура, чтобы отфильтровать меньшие контуры, составляющие слова.
Это еще одно изображение, на котором я пытался определить «объекты» на этих снимках экрана.
Здесь я сталкиваюсь с той же проблемой, когда не могу определить белые прямоугольники.Я только определяю границы прямоугольника.
Буду признателен за любую форму помощи, так как я все еще новичок в openCv
Исходные изображения перед обработкой: