Прежде всего, я пытаюсь сгенерировать образы среды симуляции OpenAI Gym. Я получаю 128 x 128 x 3
numpy.ndarray, который присваивается переменной state
. Это изображение содержит целевой объект, и я хочу обнаружить объект с помощью SimpleBlobDetector
в cv2
(opencv).
До сих пор я пробовал три способа достижения этой цели.
1. используйте переменную state
в качестве ввода SimpleBlobDetector
2. используйте matplotlib.pyplot.savefig()
, чтобы сохранить переменную state
как test_mat.png
, затем восстановите изображение как ввод SimpleBlobDetector
.
3. Выполните те же действия, что и 2., за исключением использования cv2.imwrite()
для сохранения изображения.
Вот как я храню изображения:
import gym
import random
import matplotlib.pyplot as plt
import cv2
env = gym.make('Reacher-v2')
state = env.reset()
print("State:",state.shape) # (128, 128, 3)
# save the image with matplotlib
%matplotlib inline
plt.axis('off')
plt.imshow(state)
plt.savefig('test_mat.png', bbox_inches='tight', pad_inches=0)
plt.show()
# save the image with cv2
cv2.imwrite('test_cv2.png', state)
Затем я попытался прочитать изображение test_mat.png
, используя cv2.imread()
, и детектор BLOB-объектов сработал.
im_cv2 = cv2.imread("test_mat.png")
detector = cv2.SimpleBlobDetector_create()
print("im_cv2: ", im_cv2.shape, type(im_cv2))
keypoints = detector.detect(im_cv2)
print("Keypoints: ", keypoints)
if keypoints:
print(keypoints[0].pt)
Вывод выглядит так:
im_cv2: (237, 243, 3) <class 'numpy.ndarray'>
Keypoints: [<KeyPoint 0x128a5b2a0>]
(102.55021667480469, 96.66270446777344)
Однако, когда я попытался использовать cv2.imread()
для восстановления test_cv2.png
(который сохраняется с помощью cv2.imwrite()
), детектор BLOB-объектов не удался.
im_cv2 = cv2.imread("test_cv2.png")
detector = cv2.SimpleBlobDetector_create()
print("im_cv2: ", im_cv2.shape, type(im_cv2))
keypoints = detector.detect(im_cv2)
print("Keypoints: ", keypoints)
if keypoints:
print(keypoints[0].pt)
Выход:
im_cv2: (128, 128, 3) <class 'numpy.ndarray'>
Keypoints: []
Кроме того, использование переменной state
в качестве ввода SimpleBlobDetector
также не сработало.