No.83   triangulation done
Category : 研究
色々遠回りしてやっと、2つのカメラから得られた画像においてそれぞれ対応する2次元座標から3次元座標を得るTriangulationができた。
いちばん簡単なやつで実装したので、別の手法も試したほうがいいかもしれないが、まずはこれでどれほど正確に三次元座標が測れているかチェック。
そしたら以外にかなり正確に測れているんじゃないだろうか。とりあえずTriangulationはこれでいいとして、他にもやることがいっぱいあるので精度はあまり気にしないでどんどん進めていかないと。
とりあえず嬉しくなってさっそくBenに報告。
Hi Ben,
I checked the accuracy today.
That was more accurate than I expected!
These are the quick results before talking to you further tomorrow.
I measured the depth up to the object which is on straight line along
camera ray, with a measure, and with the triangulation.
measure(cm): triangulation(cm)
30 : 30.0
40 : 39.8
50 : 49.4
60 : 59.8
70 : 69.3
200 : 208
今回は対応点を2つのカメラ画像から目視で選択して、Triangulationを行ったが、実際には自動で対応点を見つけていかなくてはいかない。
基本的にはHarrisCornerという何処か角のようなわかりやすい特徴点を見つけていくことになる。
さらに2つのカメラでそれぞれ特徴点を見つけてから、今度はひとつのカメラのどの特徴点と、もうひとつのカメラのどの特徴点が対応する点かというのを見つけてやらなければならない。
これをするには、2次元空間を探索してやる途方もない作業になると思うかもしれないが、エピポラ拘束というステレオカメラの幾何学的な条件より、実は1次元の探索で済む。
つまり、片方の画像のある点に対応するもう片方の画像の点を見つけようと思ったとき、それは特定の線上のどこかにあることがわかっている。あとはピクセルごとに調べていって対応点を見つけていくなりすることになる。
ところである線上のどこかにあるとわかっていても、斜めの線に沿ってピクセルごとに調べていくというのは中々骨がおれる。
そこで、この線が水平になるように画像を変換してやるのがRectificationである。
そしたらx座標だけシフトしていって対応点を探せるのでラクチンである。
対応する特徴点を見つけた後も、これらを追従するとか色々やるべきことはたくさん!
いよいよ加速して、できるとこまで行きたい。
今日はTriangulationの前に大きな問題が解決できて嬉しかった。
前々から、プログラムを走らせていたらものすごく重たくなって、マウス、キーボードがあまり反応しない、そのうち固まってしまう、ということが多かったので困っていた。
原因は2つのうちどちらかと考えた。
○ウェイトが小さいためにイベントキューがたまってしまい、イベントを処理しきれていない。
○どこかでメモリリークしている。
マウスやキーボードのイベントが反応しないので前者の方とにらんでいたのだけど、どうにもうまくいかない。ウェイトを結構おおきくしても、固まるまでの時間は長くなるにしてもやっぱり固まるということを発見して、どうもどっかでメモリの解放を忘れているんじゃないかとループの中を片っ端から調べていった。
そしたら時間かかって怪しいとこがわかった。
ループの中で毎回image = cvCreateImage()としているところがあったのだけど、これはどんどん新しい領域を確保していってしまうようで、メモリもどんどんなくなってしまっていたようだ。
これを別のやり方に変えて実装したら直った。
OpenCVのバグかとか思って、どうしよーもないと思ったけど、原因がわかってよかった!
悩んだかいあった。
C言語はそこまで使ったことなかったけど、やっぱりメモリ管理とか気にしないといけないのが大変だなと思った。ループをがんがんまわすリアルタイムなソフトを開発するときには、メモリをちゃんと使ったら解放するというのが本当に気にしないと固まってしまうという致命的な事態になっちゃうんだね。
ループのなかでのメモリリークは絶対にないように今後気をつけよう。
これDeadlyっ。
まずは短いところからスタート。メジャーで距離はかって比較!
メジャーがたわまないように先っちょをボルトに載せる。
5分でできる実験準備。簡単でいいね。
徐々に距離を伸ばす。画像が暗くて対応点をクリックしにくかったので、
ちょうどあったUSBのLEDライトで照らしていい感じに。
一気に2メートルへ。これがメジャーの最長。
結果は予想以上の精度でした!
いちばん簡単なやつで実装したので、別の手法も試したほうがいいかもしれないが、まずはこれでどれほど正確に三次元座標が測れているかチェック。
そしたら以外にかなり正確に測れているんじゃないだろうか。とりあえずTriangulationはこれでいいとして、他にもやることがいっぱいあるので精度はあまり気にしないでどんどん進めていかないと。
とりあえず嬉しくなってさっそくBenに報告。
Hi Ben,
I checked the accuracy today.
That was more accurate than I expected!
These are the quick results before talking to you further tomorrow.
I measured the depth up to the object which is on straight line along
camera ray, with a measure, and with the triangulation.
measure(cm): triangulation(cm)
30 : 30.0
40 : 39.8
50 : 49.4
60 : 59.8
70 : 69.3
200 : 208
今回は対応点を2つのカメラ画像から目視で選択して、Triangulationを行ったが、実際には自動で対応点を見つけていかなくてはいかない。
基本的にはHarrisCornerという何処か角のようなわかりやすい特徴点を見つけていくことになる。
さらに2つのカメラでそれぞれ特徴点を見つけてから、今度はひとつのカメラのどの特徴点と、もうひとつのカメラのどの特徴点が対応する点かというのを見つけてやらなければならない。
これをするには、2次元空間を探索してやる途方もない作業になると思うかもしれないが、エピポラ拘束というステレオカメラの幾何学的な条件より、実は1次元の探索で済む。
つまり、片方の画像のある点に対応するもう片方の画像の点を見つけようと思ったとき、それは特定の線上のどこかにあることがわかっている。あとはピクセルごとに調べていって対応点を見つけていくなりすることになる。
ところである線上のどこかにあるとわかっていても、斜めの線に沿ってピクセルごとに調べていくというのは中々骨がおれる。
そこで、この線が水平になるように画像を変換してやるのがRectificationである。
そしたらx座標だけシフトしていって対応点を探せるのでラクチンである。
対応する特徴点を見つけた後も、これらを追従するとか色々やるべきことはたくさん!
いよいよ加速して、できるとこまで行きたい。
今日はTriangulationの前に大きな問題が解決できて嬉しかった。
前々から、プログラムを走らせていたらものすごく重たくなって、マウス、キーボードがあまり反応しない、そのうち固まってしまう、ということが多かったので困っていた。
原因は2つのうちどちらかと考えた。
○ウェイトが小さいためにイベントキューがたまってしまい、イベントを処理しきれていない。
○どこかでメモリリークしている。
マウスやキーボードのイベントが反応しないので前者の方とにらんでいたのだけど、どうにもうまくいかない。ウェイトを結構おおきくしても、固まるまでの時間は長くなるにしてもやっぱり固まるということを発見して、どうもどっかでメモリの解放を忘れているんじゃないかとループの中を片っ端から調べていった。
そしたら時間かかって怪しいとこがわかった。
ループの中で毎回image = cvCreateImage()としているところがあったのだけど、これはどんどん新しい領域を確保していってしまうようで、メモリもどんどんなくなってしまっていたようだ。
これを別のやり方に変えて実装したら直った。
OpenCVのバグかとか思って、どうしよーもないと思ったけど、原因がわかってよかった!
悩んだかいあった。
C言語はそこまで使ったことなかったけど、やっぱりメモリ管理とか気にしないといけないのが大変だなと思った。ループをがんがんまわすリアルタイムなソフトを開発するときには、メモリをちゃんと使ったら解放するというのが本当に気にしないと固まってしまうという致命的な事態になっちゃうんだね。
ループのなかでのメモリリークは絶対にないように今後気をつけよう。
これDeadlyっ。
まずは短いところからスタート。メジャーで距離はかって比較!
メジャーがたわまないように先っちょをボルトに載せる。
5分でできる実験準備。簡単でいいね。
徐々に距離を伸ばす。画像が暗くて対応点をクリックしにくかったので、
ちょうどあったUSBのLEDライトで照らしていい感じに。
一気に2メートルへ。これがメジャーの最長。
結果は予想以上の精度でした!
PR
Trackback URL: