为什么OpenCV SimpleBlobDetector仅适用于使用matplotlib.pyplot.savefig()保存的图像,而不适用于cv2.imwrite()保存的图像?

时间:2019-05-31 20:04:40

标签: python opencv openai-gym

首先,我正在尝试生成模拟环境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的输入也不起作用。

0 个答案:

没有答案