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

标签 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.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/

相关文章:

c++ - Mat与Mat1b/Mat3b之间的转换

java - 无法在 opencv 4.1.0 中解析 DescriptorExtractor 和 FeatureDetector 的导入

Android OpenCV通过socket传输图像

opencv - 对象跟踪所需的硬件[计算机视觉]

machine-learning - 如何从 RGB 中获取真实颜色

python - 如何访问我网站上的MySQL服务器?

python - 保存设备上下文绘制的图像,wxPython

python - 用 Python 绘制 15k 个城市 map 的有效方法

python - Pickle Tfidfvectorizer 以及自定义分词器

c# - EmguCV-将彩色图像转换为rg色度