1. mrsaa2000

    No comment

    mrsaa2000
Changes in tags
Changes in body
Source | HTML | Preview
@@ -1,61 +1,61 @@
Pickleモジュールを使いKeyPointをファイルに書き出そうとしたところエラーが出たので
その時の対応策のメモです。
検索すれば割とすぐ出てきたのであまり需要はないかもしれませんが一応。
## 環境
- Python 3.5.2
- OpenCV 3.1.0
## 参考URL
http://stackoverflow.com/questions/26501193/opencv-python-find-a-code-for-writing-keypoins-to-a-file
ここでの回答とほぼ同じです
## 失敗例
```python:out_kp_and_des.py
import cv2
import pickle
img = cv2.imread('XXXX.jpg')
detector = cv2.AKAZE_create()
-# keypointsとdescritors
+# keypointsとdescriptors
kp, des = detector.detectAndCompute(img, None)
with open('XXXX.pickle', mode='wb') as f:
pickle.dump((kp, des), f)
```
KeyPointをそのままPickle化しようとすると```PicklingError: Can't pickle <class 'cv2.KeyPoint'>: it's not the same object as cv2.KeyPoint```のようなエラーが出ます。
## 解決策
```python:out_kp_and_des.py
import cv2
import pickle
img = cv2.imread('XXXX.jpg')
detector = cv2.AKAZE_create()
kp, des = detector.detectAndCompute(img, None)
index = []
for p in kp:
temp = (p.pt, p.size, p.angle, p.response, p.octave, p.class_id)
index.append(temp)
with open('XXXX.pickle', mode='wb') as f:
pickle.dump((index, des), f)
```
KeyPointのアトリビュートを取り出してそれをリストに入れてPickle化って感じになります。
ファイル読み込みは以下のような感じです。
```python:load_kp_and_des.py
import cv2
import pickle
with open('XXXX.pickle', mode='rb') as f:
index, des = pickle.load(f)
kp = []
for p in index:
temp = cv2.KeyPoint(x=p[0][0], y=p[0][1], _size=p[1], _angle=p[2],
_response=p[3], _octave=p[4], _class_id=p[5])
kp.append(temp)
```