1

私はOpenCVのgoodFeaturesToTrackを使って取得したドットを持つ2値画像をImage1に示しています。ランダムな点群に点のグリッドを合わせるには

Image1 : Cloud of points

画像2に示すように、私はそのように上の4×25ドットのグリッドに合わせたい(必ずしもすべての点が画像上に表示されますが、それは通常の4つの* 25ポイントです矩形)。

Image2 : Model grid of points

4×25ドットのマイモデルグリッドによってパラメータ化される: 1 - 左上隅 2の位置を - 地平線 以下のコードを有する矩形の傾きは、その機能を示しますそのようなモデルを構築する。

この問題は、チェス盤の角の問題に近いようです。

モデルクラウドを入力画像に合わせてクラウドの位置と角度を取得する方法を知りたいと思います。 2つの画像の間の距離を簡単に測定できますが(入力1とモデルグリッドのオン)、この距離の最小値を見つけるために画像上のすべてのピクセルと角度を確認する必要はありません。

まず、私はイメージを通過する、すべての正の画素の位置のインデックスを作成します。

def ModelGrid(pos, angle, shape): 

    # Initialization of output image of size shape 
    table = np.zeros(shape) 

    # Parameters 
    size_pan = [32, 20]# Pixels 
    nb_corners= [4, 25] 
    index = np.ndarray([nb_corners[0], nb_corners[1], 2],dtype=np.dtype('int16')) 
    angle = angle*np.pi/180 

    # Creation of the table 
    for i in range(nb_corners[0]): 
     for j in range(nb_corners[1]): 
      index[i,j,0] = pos[0] + j*int(size_pan[1]*np.sin(angle)) + i*int(size_pan[0]*np.cos(angle)) 
      index[i,j,1] = pos[1] + j*int(size_pan[1]*np.cos(angle)) - i*int(size_pan[0]*np.sin(angle)) 

      if 0 < index[i,j,0] < table.shape[0]: 
       if 0 < index[i,j,1] < table.shape[1]: 
        table[index[i,j,0], index[i,j,1]] = 1 

    return table 

答えて

0

比較的よく働く私が見つけた解決策は、次のようです。私はこれらのピクセルの角を呼ぶでしょう。

次に、このインデックスを使用して平均傾斜角を計算します。 各コーナーでは、十字を定義するのに十分近い、他のものを探します。私は、各ピクセルがその左、右、上、下に直接あるものを見つけるために管理します。 このクロスを使用して傾斜角を計算し、得られたすべての傾斜角の中央値をモデル格子の角度として使用します。

この角度を取得したら、この角度と各コーナーの位置を使用してテーブルを作成するだけです。 最適化機能は、両方の画像の一致するピクセル数を測定し、最良の位置を返します。

この方法はほとんどの例でうまく動作しますが、返される「ベストポジション」はコーナーの1つでなければなりません。これは、最良の位置に対応することを意味しません...主にグリッドの左上隅コーナーの雲の中に欠けている。

関連する問題