Я пытаюсь научить мою инфраструктуру автоматизации тестирования обнаруживать выбранный элемент в приложении, используя opencv (платформа берет кадры / снимки экрана с тестируемого устройства).Выбранные элементы всегда имеют определенный размер и всегда имеют синюю рамку, которая помогает, но они содержат разные миниатюрные изображения.См. Приведенный пример изображения.
Я много гуглил и читал по этой теме, и я близок к тому, чтобы заставить его работать, ожидаю для одного сценария, который является изображением C на изображении примера. пример изображения Здесь на выбранном элементе есть символ воспроизведения.
Моя теория заключается в том, что OpenCV в этом случае запутывается, потому что символ воспроизведения в основном представляет собой круг с треугольником в нем иЯ прошу его найти прямоугольную форму.
Я нашел это очень полезным: https://www.learnopencv.com/blob-detection-using-opencv-python-c/
Мой код выглядит так:
import cv2
import numpy as np
img = "testimg.png"
values = {"min threshold": {"large": 10, "small": 1},
"max threshold": {"large": 200, "small": 800},
"min area": {"large": 75000, "small": 100},
"max area": {"large": 80000, "small": 1000},
"min circularity": {"large": 0.7, "small": 0.60},
"max circularity": {"large": 0.82, "small": 63},
"min convexity": {"large": 0.87, "small": 0.87},
"min inertia ratio": {"large": 0.01, "small": 0.01}}
size = "large"
# Read image
im = cv2.imread(img, cv2.IMREAD_GRAYSCALE)
# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()
# Change thresholds
params.minThreshold = values["min threshold"][size]
params.maxThreshold = values["max threshold"][size]
# Filter by Area.
params.filterByArea = True
params.minArea = values["min area"][size]
params.maxArea = values["max area"][size]
# Filter by Circularity
params.filterByCircularity = True
params.minCircularity = values["min circularity"][size]
params.maxCircularity = values["max circularity"][size]
# Filter by Convexity
params.filterByConvexity = False
params.minConvexity = values["min convexity"][size]
# Filter by Inertia
params.filterByInertia = False
params.minInertiaRatio = values["min inertia ratio"][size]
# Create a detector with the parameters
detector = cv2.SimpleBlobDetector(params)
# Detect blobs.
keypoints = detector.detect(im)
for k in keypoints:
print k.pt
print k.size
# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures
# the size of the circle corresponds to the size of blob
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0, 0, 255),
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# Show blobs
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)
Какя могу заставить OpenCV смотреть только на внешнюю форму, определяемую синей рамкой, и игнорировать внутренние формы (символ воспроизведения и, конечно, миниатюрное изображение)?Я уверен, что это как-то выполнимо.