cv2.boundingRect возвращает неправильные координаты - PullRequest
0 голосов
/ 09 июня 2018

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

import gym
import os
import cv2

env = gym.make('Breakout-v0')

def motion_detection(frame1,frame2):
    delta = cv2.absdiff(frame1,frame2)[2:-2, 2:-2]
    delta = cv2.cvtColor(delta,cv2.COLOR_RGB2GRAY)
    cnts, _, _ = cv2.findContours(delta, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    objects = []
    for c in cnts:
        objects.append(cv2.boundingRect(c))
    return objects

observation = env.reset()
f = 0
while True:
    f += 1
    old_observation = observation
    observation, reward, done, info = env.step(env.action_space.sample())
    objects = motion_detection(old_observation,observation)
    for obj in objects:
        x,y,w,h = obj
        cv2.rectangle(observation,(x,y),(x+w,y+h),(0,255,0),1)
    cv2.imwrite(os.getcwd()+'/'+str(f)+'.png',observation)
    if done:
        break

Теперь у меня проблема в том, что функция cv2.boundingRect(), кажется, возвращает неправильные координаты.Коробка всегда на стороне изображения.Почему это так и как мне это исправить?An example of what I'm talking about

1 Ответ

0 голосов
/ 09 июня 2018

Согласно последней документации , порядок возврата для findContours - это изображение, контур, иерархия.Так что ваш cnts, _, _ = cv2.findContours должен быть _, cnts, _ = cv2.findContours.

. Других проблем я не вижу.

...