首先,我正在尝试生成模拟环境OpenAI Gym的图像。我得到的是一个128 x 128 x 3
numpy.ndarray,它被分配给变量state
。该图像包含一个目标对象,我想通过使用SimpleBlobDetector
(opencv)中的cv2
来检测该对象。
到目前为止,我已经尝试了三种方法来实现此目标。
1.使用变量state
作为SimpleBlobDetector
的输入
2.使用matplotlib.pyplot.savefig()
将变量state
保存为test_mat.png
,然后将图像恢复为SimpleBlobDetector
的输入。
3.除了使用cv2.imwrite()
保存图像外,其他步骤与2.相同。
以下是我存储图像的方式:
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()
,并且斑点检测器起作用。
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()
保存)时,斑点检测器失败。
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
的输入也不起作用。