17

C++ で認識プログラムを作成していますが、より堅牢にするために、画像内のオブジェクトの距離を見つけることができる必要があります。

8.5 x 11 の写真から 22.3 インチ離れて撮影された画像があるとします。システムは、寸法が 319 ピクセル x 409 ピクセルのボックス内のその画像を正しく識別します。
実際の高さと幅 (AH と AW) とピクセルの高さと幅 (PH と PW) を距離 (D) に関連付ける効果的な方法は何ですか?

実際に方程式を使用する場合、PH と PW は D に反比例し、AH と AW は定数であると想定しています (認識されるオブジェクトは常に、ユーザーが幅と高さを指定できるオブジェクトであるため)。

4

3 に答える 3

5

ある時点で質問を変更したかどうかはわかりませんが、私の最初の回答は、あなたが望むものに対して非常に複雑です。あなたはおそらくもっと簡単なことをすることができます。

1) 長くて複雑な解決策 (より一般的な問題)

まず、オブジェクトのサイズを知る必要があります。

コンピュータビジョンアルゴリズムを見ることができます。オブジェクト(その寸法と形状)を知っている場合。あなたの主な問題は、ポーズ推定の問題です(つまり、カメラに対するオブジェクトの位置を見つけることです)。これから距離を見つけることができます。[1] [2] を参照するか (たとえば、興味がある場合は他の記事を見つけることができます)、POSIT、SoftPOSIT で検索できます。この問題を最適化問題として定式化できます。実際の画像と期待される画像 (推定された姿勢が与えられた場合のオブジェクトの投影) の間の「差」を最小限に抑えるために、姿勢を見つけます。通常、この差は、各イメージ ポイント Ni と、現在のパラメータの対応するオブジェクト (3D) ポイント Mi の投影 P(Mi) との間の (二乗) 距離の合計です。

ここから距離を抽出できます。

このためには、カメラを調整する必要があります (大まかに言うと、ピクセル位置と視野角の関係を見つけます)。

これらすべてを自分でコーディングしたくない場合は、OpenCV、Gandalf [3] などのコンピューター ビジョン ライブラリを使用できます。

ここで、もっと単純な (そしておおよその) ことをしたいと思うかもしれません。カメラから同じ「深さ」(Z) にある 2 点間の画像距離を見つけることができる場合、次の式で画像距離 d を実際の距離 D に関連付けることができます。焦点距離に関連するカメラ、カメラのキャリブレーションを使用して見つけることができるピクセル数)

2)短い解決策(単純な問題の場合)

しかし、ここに(単純で短い)答えがあります:「カメラ平面」に平行な平面(つまり、カメラに完全に面している)で写真を撮る場合は、次を使用できます:

PH = a AH / Z
PW = a AW / Z

ここで、Z は画像の平面の深さであり、a はカメラの固有パラメーターです。

参考までに、ピンホール カメラ モデルは、画像座標 m=(u,v) を世界座標 M=(X,Y,Z) に次のように関連付けます。

m   ~       K       M

[u]   [ au as u0 ] [X]
[v] ~ [    av v0 ] [Y]
[1]   [        1 ] [Z]

[u] = [ au as ] X/Z + u0
[v]   [    av ] Y/Z + v0

ここで、「~」は「比例」を意味し、K はカメラの固有パラメータの行列です。K パラメータを見つけるには、カメラのキャリブレーションを行う必要があります。ここでは、au=av=a、as=0 とします。

これらの方程式のいずれかから Z パラメータを復元できます (または両方の平均をとります)。Z パラメータは、オブジェクトからの距離 (オブジェクトのさまざまなポイントによって異なります) ではなく、オブジェクトの深さ (カメラ平面とオブジェクト平面の間の距離) であることに注意してください。とにかくそれがあなたが望むものだと思います。

[1] リニア N 点カメラ ポーズの決定、Long Quan および Zhongdan Lan

[2] カメラの姿勢を決定するための完全な線形 4 点アルゴリズム、Lihong Zhi および Jianliang Tang

[3] http://gandalf-library.sourceforge.net/

于 2011-06-03T07:21:37.490 に答える
2

実世界のオブジェクトのサイズとカメラの画角がわかっている場合、水平画角 alpha(*) がわかっていると仮定すると、画像の水平解像度は xres になり、オブジェクトまでの距離 dw は画像では xp ピクセル幅、現実世界では xw メートル幅の画像の中央は、次のように導出できます (三角法はどうですか?)。

# Distance in "pixel space" relates to dinstance in the real word 
# (we take half of xres, xw and xp because we use the half angle of view):
(xp/2)/dp = (xw/2)/dw 
dw = ((xw/2)/(xp/2))*dp = (xw/xp)*dp (1)

# we know xp and xw, we're looking for dw, so we need to calculate dp:
# we can do this because we know xres and alpha 
# (remember, tangent = oposite/adjacent):
tan(alpha) = (xres/2)/dp
dp = (xres/2)/tan(alpha) (2)

# combine (1) and (2):
dw = ((xw/xp)*(xres/2))/tan(alpha)
# pretty print:
dw = (xw*xres)/(xp*2*tan(alpha))

(*) アルファ = カメラ軸と、ちょうど表示されている画像の中央の行の一番左の点を通る線との間の角度。

変数へのリンク: dw = D、xw = AW、xp = PW

于 2011-06-03T09:05:06.503 に答える
1

これは完全な答えではないかもしれませんが、正しい方向にあなたを押すかもしれません。NASAが宇宙からのそれらの写真でそれをどのように行うかを見たことがありますか?彼らがそれらの小さな十字架を持っている方法は、画像全体にあります。それが、私が知る限り、オブジェクトの深さとサイズについて彼らが公正な考えを得る方法です。解決策は、画像内の正しいサイズと深さを知っているオブジェクトを用意し、それを基準にして他のオブジェクトを計算することです。あなたがいくつかの研究をする時間です。それがNASAのやり方であるなら、それはチェックする価値があるはずです。

私は言わなければなりませんこれは私がstackoverflowで長い間見た中で最も興味深い質問の1つです:D。この質問に付けられているタグが2つしかないことに気づきました。画像に関連して何かを追加すると、より良い結果が得られる場合があります。

于 2011-06-03T07:08:28.583 に答える