2

將掃描(拍照)點集與模板點集(圖像中的藍色,綠色,紅色,粉色圓圈)相匹配的最佳方式是什麼? 我正在使用opencv/C++。也許某種ICP算法?我想將掃描圖像封裝到模板圖像中!2D點集匹配

模板點集: template image

掃描點集: scan image

回答

1

如果對象是合理的剛性和排列,簡單auto-correlation會做的伎倆。 如果不是,我會用RANSAC來估計主題和模板之間的轉換(看起來你有特徵點)。請提供一些關於這個問題的細節。

編輯: RANSAC(隨機樣本共識)可用於您的情況。將模板中不必要的點考慮爲噪聲(由特徵檢測器檢測到虛假特徵) - 它們是大綱。 RANSAC可以處理大綱,因爲它會隨機選擇一小部分特徵點(可以啓動模型的最小量),啓動模型並計算模型與給定數據的匹配程度(模板中有多少個點與您的模型相對應其他點)。如果您選擇錯誤的子集,該值將會很低,您將放棄該模型。如果你選擇正確的子集,它會很高,你可以用LMS算法來提高你的匹配。

+0

好吧,我正在檢測模板和掃描圖像上的矩形。現在我想使用邊緣點(藍色,綠色,紅色圓圈)來包裝圖像...我不知道任何對應的點,你需要findHomography(openCV)/ RANSAC? – Ben

+0

但我仍然需要點對RANSAC?一些匹配的掃描和模板圖像的點? http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findhomography – Ben

0

你看過OpenCV的descriptor_extractor_matcher.cpp樣本嗎?本示例使用RANSAC檢測兩個輸入圖像之間的單應性。我假設你什麼時候換你實際上意味着扭曲?如果您想用您檢測到的單應性矩陣來翹曲圖像,請查看warpPerspective函數。最後,here是在OpenCV中使用不同特徵檢測器的一些很好的教程。

編輯: 你可能沒有SURF功能,但你肯定有不同類別的特徵點。基於特徵的匹配通常分爲兩個階段:特徵檢測(您已經完成)和提取,您需要匹配。因此,您可以嘗試將您的功能轉換爲KeyPoint,然後進行特徵提取和匹配。這裏是你怎麼可能去了解這一點的代碼片段:

typedef int RED_TYPE = 1; 
typedef int GREEN_TYPE = 2; 
typedef int BLUE_TYPE = 3; 
typedef int PURPLE_TYPE = 4; 

struct BenFeature 
{ 
    Point2f pt; 
    int classId; 
}; 

vector<BenFeature> benFeatures; 

// Detect the features as you normally would in addition setting the class ID 

vector<KeyPoint> keypoints; 
for(int i = 0; i < benFeatures.size(); i++) 
{ 
    BenFeature bf = benFeatures[i]; 
    KeyPoint kp(bf.pt, 
       10.0, // feature neighborhood diameter (you'll probaby need to tune it) 
       -1.0, // (angle) -1 == not applicable 
       500.0, // feature response strength (set to the same unless you have a metric describing strength) 
       1, // octave level, (ditto as above) 
       bf.classId // RED, GREEN, BLUE, or PURPLE. 
       ); 
    keypoints.push_back(kp); 
} 

// now proceed with extraction and matching... 

您可能需要調整的反應強度,使得它不會被提取階段閾值處理了。但是,希望這可以說明你可能會嘗試做什麼。

+0

那麼,我沒有特徵點?我剛剛得到了我的點的x,y座標,我不認爲像surf/sift這樣的東西在這裏工作。因爲如果你看我的原始模板圖像點幾乎相似的周邊地區..所以我不能匹配他們通過使用brutfource或flann methode。但你是對的,我想使用findHomography,warpPerspective OpenCV的方法..但我怎麼能找到我的模板和掃描圖像之間的點對? – Ben

+0

@Ben看到我的編輯評論迴應。 – mevatron

1

您是否必須匹配紅色矩形?原始圖像在角落中包含四個黑色矩形,它們似乎是用於匹配的。我能可靠地與4行的Mathematica代碼找到它們:

lotto = [source image] 
lottoBW = Image[Map[Max, ImageData[lotto], {2}]] 

這需要最大(R,G,B)對每一個像素,即,它濾出紅色和黃色的打印(更多或更少)。結果是這樣的:

bw filter result

然後我使用日誌過濾器來查找黑斑和結果圖像中尋找局部最大值

lottoBWG = ImageAdjust[LaplacianGaussianFilter[lottoBW, 20]] 
MaxDetect[lottoBWG, 0.5] 

結果: enter image description here

+0

如果你看我的其他模板,有一個黑色矩形缺失:http://imageshack.us/f/27/thn.png/ http://imageshack.us/photo/my-images/683/hhn。 PNG / – Ben

0

請按照下列步驟操作:

  1. 匹配兩個圖像中的點或特徵,這將確定您的包裝;
  2. 確定您正在尋找什麼轉換爲您的包裝。最一般的應該是單應性(見cv :: findHomography()),較不常用的是簡單的翻譯(使用cv :: matchTempalte())。中間情況將是沿x,y和旋轉的平移。爲此,我寫了一個比Homography更好的快速函數,因爲它使用較少的自由度,同時仍然優化正確的度量(座標差的平方差): https://stackoverflow.com/a/18091472/457687
  3. 如果您認爲您的匹配有很多異常值,請使用RANSAC您需要隨機選擇一組最小的點來尋找參數,求解,確定內點,使用所有內點再次求解,然後迭代嘗試改進當前的解決方案(增加內點的數量,減少錯誤或兩者)。請參閱維基百科RANSAC算法:http://en.wikipedia.org/wiki/Ransac