私が知っているのは、ビデオ内のオブジェクトの高さと幅だけです。cまたはc ++を使用して、ビデオ内のカメラから検出されたオブジェクトの距離を計算する方法を教えてもらえますか? それを行うためのアルゴリズムまたは式はありますか?前もって感謝します
2 に答える
Martin Ch がカメラを調整する必要があると言ったのは正しかったですが、vasile が指摘したように、それは直線的な変化ではありません。カメラのキャリブレーションとは、このマトリックスを見つけることを意味します
camera_matrix = [fx,0 ,cx,
0,fy,cy,
0,0, 1];
この行列は、3 次元座標 (x、y、z) を操作し、それを 2 次元同次座標に変換します。通常のユークリッド (x,y) 座標に変換するには、1 番目と 2 番目のコンポーネントを 3 番目のコンポーネントで割るだけです。では、これらの変数は何をしているのでしょうか。
cx/cy:必要に応じて座標系を変更できるようにするために存在します。たとえば、カメラ空間の原点を画像の左上に、ワールド空間の原点を中央に配置したい場合があります。その場合
cx = -width/2;
cy = -height/2;
座標系を変更しない場合は、これらを 0 のままにします。
fx/fy: これらは x ピクセルと y ピクセルの単位で焦点距離を指定します。これらは同じ値に近いことが多いため、同じ値 f を指定するだけでよい場合があります。これらのパラメーターは、基本的に遠近効果の強さを定義します。cx と cy がないと仮定したワールド座標からスクリーン座標へのマッピング (上記のマトリックスから自分で解決できるように)
xsc = fx*xworld/zworld;
ysc = fy*yworld/zworld;
ご覧のとおり、物を近くで大きくし、遠くで小さくする重要な量はf/z比です。線形ではありませんが、同次座標を使用することで線形変換を使用できます。
要するに。キャリブレーションされたカメラとワールド座標での既知のオブジェクト サイズを使用して、カメラからの距離を計算できます。どちらかが欠けていれば無理です。ワールド座標でのオブジェクトのサイズを知らなくても、(fx を知っている) 比率 xworld/zworld を決定することによって、その画面位置をワールド座標の光線にマッピングすることが最善の方法です。
カメラだけだと簡単にはいかないと思いますが、
kinect/ステレオカメラのような3番目のデバイス/センサーを使用することを検討してください。
次に、データから深さ(z)を取得します。