Детектор OpenCV ORB не возвращает ничего для небольшой выделенной области того же изображения - PullRequest
0 голосов
/ 28 марта 2020

Я хочу применить ORB для отслеживания объекта после его выбора (например, комок на картинке). Но

kp2, des2 = obr.detectAndCompute(im_crop_gray, None) # im_crop_gray shape:(55, 95)

не возвращает очков (kp2 = [], des2 = None) Получение некоторого результата только после увеличения выделенной области.

Почему? Можно ли использовать ORB для этой задачи? Нужно ли настраивать некоторые параметры?

import cv2
from nes_py.wrappers import JoypadSpace
import gym_super_mario_bros
from gym_super_mario_bros.actions import SIMPLE_MOVEMENT
env = gym_super_mario_bros.make('SuperMarioBros2-v0')
env = JoypadSpace(env, SIMPLE_MOVEMENT)

done = True
for step in range(5000):
    if done:
        state = env.reset()
    state, reward, done, info = env.step(env.action_space.sample())

    im_bgr = cv2.cvtColor(state, cv2.COLOR_RGB2BGR)
    im_scaled = cv2.resize(im_bgr, (state.shape[0]*2, state.shape[0]*2)) # scale 2 times up

    # cv2.imshow("image", im_scaled)

    # Select ROI
    r = cv2.selectROI(im_scaled)

    # Crop image
    im_crop = im_scaled[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]

    # Display cropped image
    cv2.imshow("selected", im_crop)

    obr = cv2.ORB_create(nfeatures=300, scoreType=cv2.ORB_FAST_SCORE)

    im_crop_gray = cv2.cvtColor(im_crop, cv2.COLOR_BGR2GRAY)
    cv2.imshow("selected gray", im_crop_gray)
    kp2, des2 = obr.detectAndCompute(im_crop_gray, None) # <--- kp2 = [], des2 = None

    im_scaled_gray = cv2.cvtColor(im_scaled, cv2.COLOR_BGR2GRAY)
    kp1, des1 = obr.detectAndCompute(im_scaled_gray, None)

    cv2.waitKey(0)
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
    matches = bf.match(des1, des2)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

    env.render()

env.close()

selecting an object

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...