Opencv - извлечение данных из игровых изображений - PullRequest
0 голосов
/ 27 января 2019

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

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

Я могу добиться успеха во многих случаях, но есть некоторые изображения, где мне не удается найти некоторые контуры, поэтому я не могунайти все данные.

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

Я хотел бы знать, что я могу сделать, чтобы улучшить производительность моей программы.-

  • Является ли KNN хорошей моделью для такого рода задач или есть другие модели, которые могут дать мне лучшие результаты?
  • Есть ли способ распознавания символов без определения контуров?
  • Как я могу сделать мой конвейер предварительной обработки максимально надежным, учитывая тот факт, что фон сильно различается по всем изображениям?

Моя цель - обработатьизображения как можно быстрее, начиная минимум с 2-х изображений в секунду.

Заранее благодарим за любую помощь или совет, который вы можете мне дать!

1 Ответ

0 голосов
/ 27 января 2019

Проще говоря, может помочь увеличение изображения, поскольку оно увеличивает темную границу числа.

Я собрал некоторый код, который делает это.Результат можно улучшить, но я хочу показать, что 4 теперь можно определить как контур.Для повышения эффективности я выбрал только контуры в пределах определенного размера.

Кроме того, поскольку он является частью HUD, это обычно означает, что местоположение на экране всегда одинаково.Если это так, вы можете добиться значительного увеличения производительности, только выбрав область со значениями (описано здесь ) - как я сделал вручную.

Наконец, поскольку числа имеют согласованную форму, вы можете попробовать matchShapes в качестве альтернативы kNN для распознавания чисел.Я не знаю, как они сравниваются по производительности, поэтому вам придется попробовать это самим.

Результат: enter image description here

Код:

import numpy as np 
import cv2
# load image
img = cv2.imread("fn2.JPG")
# enlarge image
img = cv2.resize(img,None,fx=4, fy=4, interpolation = cv2.INTER_CUBIC)
# convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# create mask using threshold
ret,mask = cv2.threshold(gray,200,255,cv2.THRESH_BINARY)
# find contours in mask
im, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# draw contour on image
for cnt in contours:
    if cv2.contourArea(cnt) < 3000 and cv2.contourArea(cnt) > 200:
        cv2.drawContours(img, [cnt], 0, (255,0,0), 2)

#show images
cv2.imshow("Mask", mask)
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
...