例題のスクリプトが動かないなと思ったときの対処
Python2.7からimport cv2としている状況においての自分の経験を話します。
1.入力画像がない。
スクリプトだけを入手しても、そのスクリプトが前提としている入力画像がなければ動きようがありません。
'box.png','box_in_scene.png'など、使われている文脈に関連している画像をOpenCVの配布物の中にないか探して見ます。
2.関数が見つからない
スクリプトを実行中にcv2.drawMatchesを呼び出した時点でエラーを生じたとします。
>>> help(cv2.drawMatches)
でもエラーを生じます。
>>> cv2.__version__
とすると、3.0.0以前の値が表示されているはずです。
OpenCV3での配布物もOpenCV2での配布物も共通にcv2.pydですので
どちらのバージョンを使っているのかを確かめます。
drawMatches()はOpenCV2には含まれてなくOpenCV3の配布物に実装している関数です。
Pythonのライブラリの置き場所(例 C:\Python27\Lib\site-packages、各自の環境に合わせて読み替えてください)に、
利用したい版のOpenCVのPythonバインディング cv2.pydをコピーしておきます。
その後、pythonを再起動させて、同様のことをすると、cv2.drawMatchesが見つかります。
>>> import cv2
>>> cv2.__version__
'3.0.0-beta'
>>> help(cv2.drawMatches)
Help on built-in function drawMatches:
drawMatches(...)
drawMatches(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg
3.関数が見つからない(名前が違っていた)
Pythonで利用するOpenCVの版をOpenCV3にあげたのにもかかわらず
OpenCV3について書かれたスクリプトが動作しないことがあります。
ORB特徴量を計算するための検出器です。
>>> cv2.ORB()
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'module' object has no attribute 'ORB'
>>> cv2.ORB_create()
>>>
cv2.__version__
が'3.0.0-beta'では、関数名がcv2.ORB()ではなく、 cv2.ORB_create()になっています。
なぜ、cv2.ORB_create()だってわかったかだって?
[Python Documentation Server]を起動させる
[Open Browser]のボタンを押すとPythonのライブラリがブラウザに表示される。
[C:\Python27\lib\site-packages]
にリンクをたどり[cv2]を選択する。
そこで"ORB"でページ内検索して見つけました。
OpenCV3で追加になった機能は、まだ大幅に仕様が変わる可能性が高いと思われます。
(この文章の記述は、すぐに陳腐化して役立たずになるはずです。)
4.期待している動作になっていない?
cv2.drawMatches(...) で目的のマッチング結果を2枚の画像に対して示してくれるはず、
一枚の画像しか表示されておらず、対応関係を示しているとは言いがたい。何がおかしい?
cv2.drawMatches で検索してみると、drawMatchesを自作公開してくれている方がいらっしゃいました。
それを使わせていただいて、
無事、2枚の画像の対応点を直線で結んであるグラフが表示されました。
(しかし、間違った対応付けの点が多数見受けられます。それは、特徴点の記述子とマッチングアルゴリズムによるものです。)
付記:
例題のスクリプトが動かないなと思った元のサイトでは、絶えず改訂が行われているはずです。
そのため、このページでは、そのような不具合に出会ったときに、初心者・中級者が自力で問題を少しでも解決に近づけることができる考え方を示したつもりです。