2017-05-05 86 views
1

我有一個帶有點的二進制圖像,我使用OpenCV的goodFeaturesToTrack獲取,如Image1所示。如何適合隨機點雲上的點網格

Image1 : Cloud of points

我想適應的4個* 25點就可以了,比如網格上鏡像2所示(並非所有的點都可見的圖像,但它是一個普通的4個* 25點長方形)。

Image2 : Model grid of points

4×25點我的模型網格由參數化: 1 - 左上角的位置 2 - 與地平線 矩形的傾斜下面的代碼顯示一個函數,它建立這樣的模型。

這個問題似乎接近棋盤角落的問題。

我想知道如何將我的模型雲點擬合到輸入圖像,並獲得雲的位置和角度。 我可以很容易地測量兩幅圖像(輸入圖像和模型網格上的圖像)之間的距離,但是我希望避免檢查圖像上的每個像素和角度以找出距離的最小值。

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

一個解決方案,我發現,它的工作原理相對較好如下:

首先,我創造一切積極像素的位置的指標,只是通過影像去。我將稱這些像素角落。

然後我用這個指數來計算平均傾斜角度: 對於每個角落,我尋找其他在某些區域足夠接近的人,以定義一個十字。我管理每個像素以找到直接位於左側,右側,頂部和底部的像素。 我使用這個十字來計算傾角,然後使用所有獲得的傾角的中位數作爲我的模型網格點的角度。

一旦我有了這個角度,我只需使用這個角度和每個角落的位置來建立一張桌子。 優化功能測量兩個圖像上重合像素的數量,並返回最佳位置。

這種方式對大多數例子都很好,但返回的「最佳位置」必須是其中一個角,這並不意味着它對應於最佳位置......主要是如果網格的左上角在角落的雲中失蹤。