前回なぜ魚眼レンズのキャリブレーションに必死になっていたかというと,単眼SLAMで遊びたかったからなんです.特に最近流行りのLSD SLAMを使いたかったので,広視野のレンズが必要だったんですね.で,晴れて魚眼レンズのrectificationができたので,LSD SLAMにデータを食わせてみました.
「プログラミング」カテゴリーアーカイブ
fisheye calibration
ここ数日ブログが見れなくなっていたようで,すみません.OpenCVで魚眼レンズのキャリブレーションを行ったんですが,なかなか手こずったので備忘録を残しておきます.
基本的なキャリブレーションの手順はピンホールカメラのキャリブレーションと同じで,1)画像上のマーカーパターン検出,2)対応する3Dマーカー座標用意,3)キャリブレーション関数にそれらを渡す,という感じで,基本的には3番目で使う関数をcv::fisheye::calibrate()を変えればOKです.ただ,cv::fisheye::calibrate()がどうにも不安定で,原因を調べていました.
結論から言うと,1)ヤコビアンの逆行列を求める際の精度が足りていなかった,2)カメラ行列とレンズ歪みパラメータの同時推定が不安定だった,というのが原因だったようです.
Recurrent Convolutional Neural Network で The Street View House Number Dataset を学習
最近,Amazon EC2のp2.xlarge(GPU インスタンス)で少し遊んでいました.スポットインスタンスなら一時間あたり$0.2くらいで使用できてそこそこ遊べます.GPUは2世代前のTesla K80で,そんなに速くはないですが(手持ちのGTX1060と同じか少し遅いくらいでした),メインメモリが61GiB,グラフィクスメモリも12GBもあり,大規模学習などには便利です.
今回はこの p2.xlarge 上で“The Street View House Numbers”の学習を行いました.ネットワークは識別率ランキングの上の方から見ていって,実装が楽そうだった“Recurrent Convolutional Neural Network for Object Recognition”にしました.実装にはchainerを使用しました.
CompressedImageのcompressedDepthをデコードする
ROSで画像を扱うにはsensor_msgs/Imageがおなじみですが,画像容量とか通信帯域を節約したいときにはsensor_msgs/CompressedImageを使ったりすると思います.CompressedImageでは,普通のRGB画像はだいたいjpgとかpngとかで圧縮されているので,公式チュートリアルにあるみたいにOpenCVのimdecodeでデコードすればいいんですが,Depth画像の圧縮フォーマットを見ると”compressedDepth”とかいうよくわからないフォーマットになっていて,そのままではデコードできません.C++ならimage_transportパッケージを使うといいんだと思いますが,pythonには対応していないというのと,republishもなんだか微妙だったので”compressedDepth”の中身とデコードの仕方を調べてみました.