« 2010年6月 | トップページ | 2010年9月 »

2010年7月

2010年7月15日 (木)

OpenCVで画像処理−2:外部パラメータの表示、や推定

メモメモメモメモ・・・行列の計算はコンピに任せます。
今回はCPUの処理速度というより人間が使いやすいかどうかになるかもしれません。

3次元の任意の軸の周りの回転行列は、回転軸vとして、
Vect1 

となります(導出は省略)が、水平回転と仰角回転があれば十分なので、
こちら向きの右手座標系で
Vect2

でいろいろ回転できます。平行移動も行列計算でやってしまいたいので、
Cocolog_oekaki_2010_07_15_17_58

にして4x4行列を用意すると、平行移動と定数倍は
Vect3_2

回転どもも拡張して
Vect4

としておけば、例えば

①適当な位置に設置されたカメラで見る,ある点(x,y,z)はカメラの座標系から見てどうなるか?(画面上のどこに来るか)
@基準の座標系でのカメラのx,y,zを cx,cy,czとしておきます。
<手順>
ある点(x,y,z)に対して以下の操作をするる
1)カメラ座標が原点になるように平行移動
2)カメラの水平角、仰角の分回しもどして、カメラ座標系に合わせる。
3)スクリーンに投影する。(拡大・縮小)

まず(1)と(2)(↓)
Cocolog_oekaki_2010_07_15_19_03

でAがわかるので、(1)〜(3)をして
Cocolog_oekaki_2010_07_15_19_05
が画面上の点。
 
 

②外部パラメータが知りたい(基準の座標系のx, y, z をカメラから推定)
(ただし既知のパラメータが1つは必要)
さっきの逆を辿ればOKです。
画面上の座標(x,y)に対して以下の操作をするる
1)スクリーンに投影する。(L = zoom距離 を zとして3次元化)
1')実際の長さに延長
2)カメラの水平角、仰角の分回して、基準の座標系に合わせる。
4)カメラ座標を足して原点も合わせる。(平行移動)
Aは平行移動をまたがない限りはいつ掛けても一緒なので、まず
(1)と(2)(↓)

Cocolog_oekaki_2010_07_15_18_38
(対象物の...が既知のパラメータ)
でAを出してから、(1)→(2)→(1')→(3)の順にして、

Cocolog_oekaki_2010_07_15_18_44

を求める感じでしょうか。

2010年7月14日 (水)

OpenCVで画像処理-1:WEBカメラ

 微妙に時間ができたので久々に。前回の不運は忘れます。

OpenCVの触れ始めとして、
新しくプロジェクトを作ってやっていきます。今回もWin32アプリでいきましょう。
とりあえず動作確認したい場合は、
「cv_WebCam.txt」をダウンロード
を参考にしてみて下さい。

たぶんそれより困るであろうパス通しは前回の
パスを通す
で何とか設定できると思います。

実行時にdillが見つからないと言われてしまうときは、数も知れているので
c++ファイルと同じ場所にコピーしてやると手っ取り早いかもしれません。
ちなみにdll達は、
・・・OpenCV2.1 >> binの中にいます。

実行結果(下)

Cvb_1

OpenCVで扱うイメージはIplImageで、
例えばQVGA(320x240)のカラー配列の要素の割り当てが下のようになってます。
(1ピクセルごとにBlue,Green,Redで3要素)

Cocolog_oekaki_2010_07_14_21_33

この絵から何の情報も得られそうにないのはさておき、
対するBITMAPは1ピクセルごとに要素を4つ割いておられるので、その変換をして
仮想画面 hMenDC に読み込んでから BitBlt で hdc にコピーして表示しているのが
最後に書いている関数の内容です。

OpenCVで気を遣う解放ですが、グローバル変数にしておけば大抵は乗り切れます。
(毎回新しくメモリを確保しようとする関数などは注意)不安なときはタスクマネージャで
メモリ使用量がガンガン増えていないか確かめるとよろしゅうございます^^

« 2010年6月 | トップページ | 2010年9月 »