PythonでKeyPointの保存

OpenCV By Output不足なエンジニア

以前特徴点のマッチングを利用した画像分類を記事にしましたが、特徴点(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++で書いてツール化してあげると良いかもしれません。


カテゴリー:OpenCV,python,画像処理

Output不足なエンジニア

統計が好きになれず、機械学習やったら必然的に統計が必要になるだろうと思ったら想像以上に機械学習にハマる。数学は芸術なので商売にするつもりはないけど、DeepLearningは数学じゃないし商売にしたいと思っているところ。画像処理がメイン。