当前位置: 首页 > 面试题库 >

酸洗cv2.KeyPoint导致酸洗错误

乐正镜
2023-03-14
问题内容

我想搜索给定目录中所有图像中的冲浪,并保存它们的关键点和描述符以供将来使用。我决定使用泡菜,如下所示:

#!/usr/bin/env python
import os
import pickle
import cv2

class Frame:
  def __init__(self, filename):
    surf = cv2.SURF(500, 4, 2, True)
    self.filename = filename
    self.keypoints, self.descriptors = surf.detect(cv2.imread(filename, cv2.CV_LOAD_IMAGE_GRAYSCALE), None, False)

if __name__ == '__main__':

  Fdb = open('db.dat', 'wb')
  base_path = "img/"
  frame_base = []

  for filename in os.listdir(base_path):
    frame_base.append(Frame(base_path+filename))
    print filename

  pickle.dump(frame_base,Fdb,-1)

  Fdb.close()

当我尝试执行时,出现以下错误:

File "src/pickle_test.py", line 23, in <module>
    pickle.dump(frame_base,Fdb,-1)
...
pickle.PicklingError: Can't pickle <type 'cv2.KeyPoint'>: it's not the same object as cv2.KeyPoint

有人知道吗,这是什么意思,以及如何解决?我正在使用Python 2.6和Opencv 2.3.1

十分感谢


问题答案:

问题是您不能将cv2.KeyPoint转储到pickle文件中。我遇到了同样的问题,并设法通过本质上对关键点进行序列化和反序列化来解决此问题,然后再将其与Pickle一起转储。

因此,用元组表示每个关键点及其描述符:

temp = (point.pt, point.size, point.angle, point.response, point.octave, 
        point.class_id, desc)

将所有这些点附加到您随后与Pickle一起转储的某个列表中。

然后,当您想再次检索数据时,请用Pickle加载所有数据:

temp_feature = 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]) 
temp_descriptor = point[6]

使用上面的代码从该数据创建一个cv2.KeyPoint,然后可以使用这些点来构建功能列表。

我怀疑有一个更整洁的方法可以做到这一点,但是以上对我来说很好(并且很快)。您可能需要稍微处理一下数据格式,因为我的功能存储在特定于格式的列表中。我试图以自己的想法为基础介绍以上内容。希望对您有所帮助。



 类似资料:
  • 问题内容: 我有一个类,该类的实例需要按照用户的指示格式化输出。有一种默认格式,可以覆盖。我是这样实现的: 可以吗 让我知道是否有更好的方法来进行设计。 不幸的是,我需要腌制此类的实例。但是只有在模块顶层定义的功能才能被酸洗。函数是不可拾取的,因此我的instance属性破坏了酸洗。 我尝试重写此代码以使用类方法而不是lambda函数,但由于相同的原因仍然没有运气: 请注意,即使不覆盖默认值,此处

  • 问题内容: 我必须腌制这样的对象数组: 它给出了以下错误: 有办法解决吗? 问题答案: 内置的pickle模块无法序列化几种python对象(包括lambda函数,嵌套函数和在命令行中定义的函数)。 picloud软件包包括一个更强大的pickler,可以对lambda函数进行pickle。 可以使用常规的pickle / cPickle和功能来反序列化PiCloud序列化的对象。 莳萝还提供类似

  • 问题内容: 我最近更改了程序的目录布局:以前,我的所有模块都位于“主”文件夹中。现在,我将它们移动到以该程序命名的目录中,并在其中放置一个包。 现在,我的主目录中只有一个.py文件,用于启动程序,这更加整洁。 无论如何,尝试从程序的早期版本中加载腌制文件失败。我收到“ ImportError:没有名为工具的模块”的信息- 我猜是因为我的模块以前位于主文件夹中,而现在位于whyteboard.too

  • 我正在使用数据库,并且在数据框架中有一个列,我需要通过外部Web服务调用为每条记录更新该列。在这种情况下,它使用Azure机器学习服务SDK并进行服务调用。当在Spark中不作为UDF运行时,此代码可以正常工作(即。只是python),但是当我尝试将其称为UDF时,它会引发序列化错误。如果我使用lambda和带有rdd的map,也会发生同样的情况。 该模型使用快速文本,并且可以通过正常的超文本传输

  • 大多数纸牌游戏都需要洗牌,也就是让纸牌随机排列。在第10.5节,我们看到了怎样生成随机数,但怎样利用随机数实现洗牌功能却并非显然意见的。 一种可行的方案是,模拟人洗牌的方法,将牌分为两堆,然后通过在每个牌堆中轮流选择的方式实现原牌堆的重新组织。因为一般而言,人并不能做到完美地洗牌,而程序经过大约7次迭代之后,牌堆中纸牌的顺序已经相当随机了。但是计算机程序每次在做完美洗牌的时候有一个令人讨厌的属性—

  • {“subject”:“test-oracle-jdbc-emp1-value”,“version”:1,“id”:2,“schema”:“{\”type\“:\”record\“,\”name\“:\”emp1\“,\”fields\“:[{\”name\“:\”empno\“,\”type\“:{\”type\“:\”bytes\“,\”scale\“:0,\”precision\“:64,\