Почему OpenCV SimpleBlobDetector работает только с изображением, сохраненным с помощью matplotlib.pyplot.savefig (), но не с помощью cv2.imwrite ()? - PullRequest
0 голосов
/ 31 мая 2019

Прежде всего, я пытаюсь сгенерировать образы среды симуляции 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 также не сработало.

...