如何使用Python 3在OpenCV 3上正确加载cv2.KeyPoint和描述符?

如何使用Python 3在OpenCV 3上正确加载cv2.KeyPoint和描述符?,python,opencv,computer-vision,Python,Opencv,Computer Vision,前几天,我不得不恢复一个与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.K

前几天,我不得不恢复一个与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上运行没有问题,但是,我尝试将代码改编为Python3,如下所示:

    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.load(打开(路径).read()) TypeError:需要类似字节的对象,而不是“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.load和描述符将返回以下内容:

index=pickle.load(打开(路径).read().encode())UnicodeDecodeError: “ascii”编解码器无法解码位置2中的字节0xfa:序号不在 射程(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,但我不知道如何解决此错误。

好的。。。我使用

代码:

        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)