[:ja]Windowsでレジストリをいじらず,単独のpythonスクリプトにファイルをドロップする[:]

[:ja]タイトル長いですが,要するにwindows上でpythonスクリプトに対して以下の画像のようにファイルをドロップするような処理がしたいときの話です.

Windowsではデフォルトではファイルをドロップできるのはexeやbatファイルに限られているようで,”script.py”のようなファイル名の場合にはファイルをドロップすることができません.レジストリをいじって*.pyにファイルドロップを可能にする方法対応するbatファイルを作成してそれからpyファイルを呼び出す方法などがありましたが,レジストリ変更したくない&複数ファイルに分けたくなかったので,以下のような方法を取りました.

'''
python %0 %*
exit /B
:'''

import sys
if __name__ == '__main__':
  print sys.argv

要点としては,「*.pyの拡張子は諦めて*.batにする」「batで自身とドロップしたファイルを引数としてpythonを実行するコードを,pythonから見えないようにコメントアウトする」という感じです.処理結果は以下のような感じです(見やすさのため少し整形しています).

>'''
''''' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

> python "awesome_script.bat" test.svg test2.svg   # 自身とドロップしたファイルを引数としてpythonを実行
['awesome_script.bat', 'test.svg', 'test2.svg']          # ドロップしたファイル名が取得できている

pythonのブロックコメントの”’がcmdで認識できないのではじめにエラーが表示されますが,pythonの処理自体は問題なく実行できます.あとはファイルの拡張子がpyではなくbatなので,エディタのシンタックスハイライトや入力補完ができないのが問題でしょうか.

少々問題はありますが,レジストリ無変更かつ単独ファイルでpythonスクリプトへのファイルドロップができます.もっとスマートな解法がありそうな気がするので,ご存じの方は教えていただけるとうれしいです.[:]

OpenCVで魚眼レンズのキャリブレーション

前々回の記事でOpenCVの魚眼レンズのキャリブレーション関数がうまく動作しなかったため,fisheye::calibrate()関数をちょこちょこ改造したものを貼っていましたが,あとで必要になりそうな気がするので,キャリブレーションプログラム全体のソースを置いておきます.

fisheye::calibrate()に加えた変更点は,以下のような感じです.
1. ヤコビアンの逆行列の計算をEigen::fullPivLUに変更
2. 最急降下法の学習率を外部から設定できるように変更

プログラム全体としては,チェスコーナーの検出後,一度,カメラ内部パラメータのみの推定を行った後,それを初期値として歪みパラメータを含めた推定を行うようにしています.

学習率(α)は特にセンシティブなので,何回か変更しながら実行して,いい具合に収束する値を使うといいと思います.手持ちのPCでは0.4~0.6あたりが誤差の収束が良かったです.うまくいくと,下左の画像のように再投影誤差(error)がぐいぐい下がっていきます.収束は画像の枚数にもかなり依存しているようなので,多すぎない適当な枚数(30~40くらい?)で試すと良さそうです.

続きを読む

lsd slam

前回なぜ魚眼レンズのキャリブレーションに必死になっていたかというと,単眼SLAMで遊びたかったからなんです.特に最近流行りのLSD SLAMを使いたかったので,広視野のレンズが必要だったんですね.で,晴れて魚眼レンズのrectificationができたので,LSD SLAMにデータを食わせてみました.

続きを読む

fisheye calibration

(17/04/10)プログラム全体を上げました.

ここ数日ブログが見れなくなっていたようで,すみません.OpenCVで魚眼レンズのキャリブレーションを行ったんですが,なかなか手こずったので備忘録を残しておきます.

基本的なキャリブレーションの手順はピンホールカメラのキャリブレーションと同じで,1)画像上のマーカーパターン検出,2)対応する3Dマーカー座標用意,3)キャリブレーション関数にそれらを渡す,という感じで,基本的には3番目で使う関数をcv::fisheye::calibrate()を変えればOKです.ただ,cv::fisheye::calibrate()がどうにも不安定で,原因を調べていました.

結論から言うと,1)ヤコビアンの逆行列を求める際の精度が足りていなかった,2)カメラ行列とレンズ歪みパラメータの同時推定が不安定だった,というのが原因だったようです.

続きを読む