ビデオから異なるフレームでの車の位置をキャプチャしました。 仮定車の(画像で私たちの方に来ているegleft側車)ビデオ・フレーム1の重心は、ビデオ・フレーム4でP(x1、y1)とQ(x2、y2)があります。
PおよびQポイントを3Dに表すことはできますか?正しいピクセル距離d(PQ)を計算し、最後に実際の距離を計算できるように
注:uはカメラが静止しており、地面から10 mの高さに配置されていると想定できます。u は、次の図も参照できる場合は、適切なデータを想定できます。
ビデオから異なるフレームでの車の位置をキャプチャしました。 仮定車の(画像で私たちの方に来ているegleft側車)ビデオ・フレーム1の重心は、ビデオ・フレーム4でP(x1、y1)とQ(x2、y2)があります。
PおよびQポイントを3Dに表すことはできますか?正しいピクセル距離d(PQ)を計算し、最後に実際の距離を計算できるように
注:uはカメラが静止しており、地面から10 mの高さに配置されていると想定できます。u は、次の図も参照できる場合は、適切なデータを想定できます。
回答:
[編集済み]これがどのように行われるかです。
手順:1. Road Dividerパーツを分離します。
次に、ハフラインを使用して、画像内の最も長いラインを見つけます。画像の境界を越える極値点を見つけます。あなたは四角形のポイントを得ました。手動で選択することで、この部分をスキップしました。私の場合、画像の上部の道路の幅は10、下部の道路の幅は60です。
ここで、Destinationに対して、Divider Quadilateralが60の均一な幅を持つようにImageを作成する必要があります。そのため、別の配列に新しいポイントを保存します。新しいポイントは、同じボトムポイントを持ちますが、トップポイントは、イメージと同じ高さの長方形を形成するため変更されます(またはそれより大きい場合は、一度実行して結果を確認した後、自分に合うように調整できます)、幅は60です。この四角形の領域にディバイダーが収まるように画像を変換しています。画像は自動的に変更されます。
今、使用して
Mat TransformMat = getPerspectiveTransform(ipPts, opPts);
最初と宛先の四辺形ポイントにopencvを適用すると、テストイメージに適用する変換行列が得られます。
warpPerspective(ipImg, opImg, TransformMat, ipImg.size());
多くの領域が出力をInputImageサイズに合わせるためにトリミングされているのがわかります。ただし、予想どおり、Imageが変換されて並列のDividerになることがわかります。いくつかの変換とスタッフを実行し、より大きなサイズの出力画像を取得することで、これが得られます。サイズが非常に大きくなる可能性があるため、完全にラップされた出力イメージを取得することはできません。しかし、タスクを実行するいくつかの制約に達します。これが最後の画像です:
これは一種の光線追跡問題のように見えます。カメラの位置と向きがわかっている場合は、3x4の射影行列とその逆を計算できるはずです。
これにより、イメージポイントから3D位置(道路上)に変換できます。このディスカッションhttp://opencv-users.1802565.n2.nabble.com/2D-to-3D-projection-with-given-plane-td7272428.htmlには、さらに役立つ情報が含まれている可能性があります。
それをMATLABで適用することは。ありaffine3dトランスフォーム格納するために使用することができます。http://www.mathworks.com/matlabcentral/fileexchange/25974-raytracerなど、ファイル交換での投影/レイトレーシングに役立つものもあるかもしれませんが、何が何に関連しているかを詳細に調べていませんあなたが欲しい。