以前特徴点のマッチングを利用した画像分類を記事にしましたが、特徴点(KeyPoint)はC++で実装されているためかそのままPickleやjoblibで保存することはできません。下記のようにKeyPointオブジェクトから値を取り出しPythonのオブジェクト(ここでは辞書)として扱えるようにする必要があります。
dumpの作成
joblibが好きなのでjoblib使っていますが、pickleでも同じようにできるはずです。
def _dump(keypoints):
return [
{"pt": p.pt,
"size": p.size,
"angle": p.angle,
"response": p.response,
"octave": p.octave,
"class_id": p.class_id
} for p in keypoints
]
def make_dump(dump_data, dump_path, compress=3):
(kp, des) = dump_data
kp_dump = _dump(kp)
dump_data = (kp_dump, des)
joblib.dump(dump_data, dump_path, compress=compress)
作成したdumpの読み込み
def _load(objs):
return [
cv2.KeyPoint(x=p["pt"][0],
y=p["pt"][1],
_size=p["size"],
_angle=p["angle"],
_response=p["response"],
_octave=p["octave"],
_class_id=p["class_id"]
) for p in objs]
def read_dump(dump_path):
(kp_dump, des) = joblib.load(dump_path)
kp = _load(kp_dump)
return (kp, des)
OpenCVはC++のほうがAPIが充実していたり高速だったりするので、C++が書ける人は必要な処理だけC++で書いてツール化してあげると良いかもしれません。