画像変換についてのメモ
-
OpenCvによる画像変換の流れ(2012.10.23)
-
基本的な処理方針
-
サーフェイスビューでViewを作成
-
画像はBitmapで読み込み
-
BitmapをMat型に変換
-
Mat型の画像データをOpenCVのメソッドで処理
-
Mat型のデータをBitmapに再変換
-
canvasのメソッドでViewに描画
-
OpenCVメモ
-
使用しているのはAndroid OpenCV2.4.0
-
プロジェクトとライブラリのリンクはProperty->Android->Libraryから.Build-Pathからだと上手くいかないらしい
Eclipseでのプロジェクト生成の解説
-
Bitmap<-->Matの変換は注意が必要:BitmapToMat & MatToBitmapを使う際の注意点 OpenCV Java API for Android
-
ホモグラフィを見つけるメソッドはfindHomography(src, dst)メソッド.
MatOfPoint2f::src :入力画像の座標群
MatOfPoint2f::dst :出力画像の座標群
帰り値 :ホモグラフィ行列
-
変換を適用するには別のメソッドが必要:
-
ハードウェアアクセラレーションの検討(2012.10.23)
-
画像変換の流れ
-
プロジェクタの姿勢P(r,p,y)を計測し,回転行列Rを求める
-
プロジェクタの設置高Hと姿勢Pから,投影距離Dを求める
-
プロジェクタ設置位置を世界座標系原点W(0,0,0)として,X方向に距離Dの位置A(D,0,0)に投影したと仮定する
-
そのときのプロジェクタ座標系における画像Aのある頂点r0i(xi,yi)を世界座標系の位置Aに投影した際の座標qwi(D,Yqi,Zqi)を,事前に求めておいた行列αにより求める
-
行列Rを用いて座標qwiを回転変換し,座標q`wiを求める
-
原点Wと座標q`wiを結んだ直線l0iを求め,平面Z=-H(地面)との交点である座標q``wiを求める
-
座標q``wiを行列Rの逆行列R^-1を用いて回転変換し,座標q```wiを求める
-
座標q```wiを,位置Aでの投影面上での2次元座標系に変換し,座標q```2dwi(Y```wi,Z```wi)を求める
-
座標q```2dwiを行列αを用いて(ココ曖昧)デバイス座標系に変換し,座標r`0i(x`i,y`i)を求める
-
この処理を4頂点について適用し,座標r`01, r`02, r`03, r`04を求める
-
画像Aの元の4頂点の座標r0iおよび画像Aの床上に投影されている4頂点の座標r`0iの合計4組の座標(8つ)から,8元一次方程式を解き,ホモグラフィ行列における変換係数a~hを求める
-
変換係数a~hから,ホモグラフィ行列Hmatを生成する
-
ホモグラフィ行列Hmatの逆行列H^-1matを求める
-
画像Aの元の座標r0iを行列H^-1matで変換すると,台形補正済みの座標t0iが得られる
射影変換とかホモグラフィと呼ばれる方法で座標変換できます。
変換前の座標を(X,Y)とし、変換後の座標を(x,y)とおくと
(x,y) = ( (A*X+B*Y+C)/(G*X+H*Y+1) , (D*X+E*Y+F)/(G*X+H*Y+1) )
という変換式です。文字A~Hは「画像の平面内の四頂点の座標」から決まる定数です。
A~Hの求め方は、少々面倒ですが8次元連立一次方程式を解いて求めます。
変換前の4点の座標を(X1,Y1)(X2,Y2)(X3,Y3)(X4,Y4)とし、変換後の4点の座標を(x1,y1)(x2,y2)(x3,y3)(x4,y4)とすると、連立方程式は次のようになります。
X1*A + Y1*B + C - x1*X1*G - x1*Y1*H = x1
X1*D + Y1*E + F - y1*X1*G - y1*Y1*H = y1
X2*A + Y2*B + C - x2*X2*G - x2*Y2*H = x2
X2*D + Y2*E + F - y2*X2*G - y2*Y2*H = y2
X3*A + Y3*B + C - x3*X3*G - x3*Y3*H = x3
X3*D + Y3*E + F - y3*X3*G - y3*Y3*H = y3
X4*A + Y4*B + C - x4*X4*G - x4*Y4*H = x4
X4*D + Y4*E + F - y4*X4*G - y4*Y4*H = y4
手計算するのは大変なので、この方程式を行列で書き直してエクセルに計算させれば簡単に定数A~Hが求まります。<
最終更新:2012年10月23日 21:08