python - 类型 'KeyPoint'的对象不是JSON可序列化的opencv

标签 python json opencv sift keypoint

我正在尝试将带有图像关键点和描述符的服务器请求作为json对象发送...这是我的代码..

import cv2 
import requests
import json

imgDetail = {'keypoints': '', 'descriptor': ''}
sift = cv2.xfeatures2d.SIFT_create()

img = cv2.imread('images/query.jpg', 0)  
kp, des = sift.detectAndCompute(img, None)

des = des.tolist()

imgDetail['keypoints'] = kp  
imgDetail['descriptor'] = des

jsonDump = json.dumps(imgDetail)

resp = requests.post("http://localhost:5000", json=jsonDump, headers={'content-type': 'application/json'})

但是它给了我以下错误........
Traceback (most recent call last):
File "E:/python projects/mawa/image.py", line 23, in <module>
jsonDump = json.dumps(imgDetail)
File "E:\Programs\Python\Python36\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "E:\Programs\Python\Python36\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "E:\Programs\Python\Python36\lib\json\encoder.py", line 257, in iterencode return _iterencode(o, 0)
File "E:\Programs\Python\Python36\lib\json\encoder.py", line 180, in default o.__class__.__name__)

TypeError: Object of type 'KeyPoint' is not JSON serializable

谁能为此提供解决方案?

最佳答案

如果您看到 kp 变量,则它是 KeyPoint 实例的列表。
即:kp看起来像[<KeyPoint 0x109f6da50>, <KeyPoint 0x109f6dd50>, <KeyPoint 0x10a1b2060>, <KeyPoint 0x10a1b2090>, <KeyPoint 0x10a1b20c0>, <KeyPoint 0x10a1b2030>, <KeyPoint 0x10a1a0a80>, <KeyPoint 0x10a1a0660>,...]
当您尝试转储imgDetail时,关键点(即kp)给出了错误,因为KeyPoint实例无法序列化。

您需要遍历kp列表并将实例更改为dict。

imgDetail['keypoints'] = [{'angle': k.angle, 'response': k.response} for k in kp]

KeyPoint类没有 tolist() __dict__ ()方法。因此,您可能需要创建自己的字典并将其传递给json.dumps()。

关于python - 类型 'KeyPoint'的对象不是JSON可序列化的opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48918008/

相关文章:

jQuery $.each 循环

opencv - HOGDescriptor错误和断言失败

c++ - OpenCv图像 block ,大小错误?

python - 基本运行周期不工作

python - 解析json数据

python - 在python中循环导入类

python - Pandas - 两列的直方图?

如果子数组包含项目,Javascript 将过滤 JSON 对象

javascript - 使用 Dojo xhr 通过 json 和文件上传发送多部分表单

c++ - 一种无需最大化内存即可实时缓冲高清视频的有效方法