有一天,我不得不恢复一个使用 OpenCV 3 和 Python 2.7 的旧项目。
在这段代码上,要加载 cv2.KeyPoint 我这样做:
import numpy as np
import cPickle
import cv2
keypoints_list = cPickle.loads(open(path).read())
kp = []
for point in keypoints_list:
temp = cv2.KeyPoint(x=point[0][0], y=point[0][1], _size=point[1], _angle=point[2], _response=point[3],
_octave=point[4], _class_id=point[5])
kp.append(temp)
对于加载描述符我这样做:
descriptors_list = cPickle.loads(open(path).read())
descriptors = []
for i in xrange(len(descriptors_list )):
temp = descriptors_list[i] * 1
descriptors.append(temp)
descriptors = np.asarray(descriptors)
它在 Python2.7 上运行没有问题,但是,我尝试将代码调整为 Python 3,如下所示:
import numpy as np
import pickle #or import _pickle as pickle
import cv2
keypoints_list = pickle.loads(open(path).read())
kp = []
for point in keypoints_list:
temp = cv2.KeyPoint(x=point[0][0], y=point[0][1], _size=point[1], _angle=point[2], _response=point[3],
_octave=point[4], _class_id=point[5])
kp.append(temp)
它的返回:
index = pickle.loads(open(path).read()) TypeError: a bytes-like object is required, not 'str'
我想,好吧,我将把字符串添加为字节。我尝试了以下方法:
keypoints_list = pickle.loads(open(path).read().encode())
kp = []
for point in keypoints_list :
temp = cv2.KeyPoint(x=point[0][0], y=point[0][1], _size=point[1], _angle=point[2], _response=point[3],
_octave=point[4], _class_id=point[5])
kp.append(temp)
和描述符...:
descriptors_list = pickle.loads(open(path).read().encode())
descriptors = []
for i in range(len(descriptors_list)):
temp = descriptors_list[i] * 1
descriptors.append(temp)
descriptors = np.asarray(descriptors)
有了这个,关键点加载正确,但是,带有描述符的pickle.loads返回这个:
index = pickle.loads(open(path).read().encode()) UnicodeDecodeError: 'ascii' codec can't decode byte 0xfa in position 2: ordinal not in range(128)
我也尝试过:
with open(path, 'r', encoding="utf-8") as f:
index = pickle.loads(f.read().encode())
descriptors = []
for i in range(len(index)):
temp = index[i] * 1
descriptors.append(temp)
descriptors = np.asarray(descriptors)
以及其他派生...但总是返回相同的错误。
我看到描述符的类型为 cnumpy.core.multiarray,但我不知道如何解决此错误。
最佳答案
好的...我使用 np.fromfile(path) 解决了这个问题
代码:
descriptors_list = np.fromfile(path)
descriptors = []
for i in range(len(descriptors_list)):
temp = descriptors_list[i] * 1
descriptors.append(temp)
descriptors = np.asarray(descriptors)
关于python - 如何使用 Python 3 在 OpenCV 3 上正确加载 cv2.KeyPoint 和描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48457690/