Я хочу применить 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](https://i.stack.imgur.com/zHtzy.png)