將掃描(拍照)點集與模板點集(圖像中的藍色,綠色,紅色,粉色圓圈)相匹配的最佳方式是什麼? 我正在使用opencv/C++。也許某種ICP算法?我想將掃描圖像封裝到模板圖像中!2D點集匹配
模板點集:
掃描點集:
將掃描(拍照)點集與模板點集(圖像中的藍色,綠色,紅色,粉色圓圈)相匹配的最佳方式是什麼? 我正在使用opencv/C++。也許某種ICP算法?我想將掃描圖像封裝到模板圖像中!2D點集匹配
模板點集:
掃描點集:
如果對象是合理的剛性和排列,簡單auto-correlation會做的伎倆。 如果不是,我會用RANSAC來估計主題和模板之間的轉換(看起來你有特徵點)。請提供一些關於這個問題的細節。
編輯: RANSAC(隨機樣本共識)可用於您的情況。將模板中不必要的點考慮爲噪聲(由特徵檢測器檢測到虛假特徵) - 它們是大綱。 RANSAC可以處理大綱,因爲它會隨機選擇一小部分特徵點(可以啓動模型的最小量),啓動模型並計算模型與給定數據的匹配程度(模板中有多少個點與您的模型相對應其他點)。如果您選擇錯誤的子集,該值將會很低,您將放棄該模型。如果你選擇正確的子集,它會很高,你可以用LMS算法來提高你的匹配。
你看過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...
您可能需要調整的反應強度,使得它不會被提取階段閾值處理了。但是,希望這可以說明你可能會嘗試做什麼。
您是否必須匹配紅色矩形?原始圖像在角落中包含四個黑色矩形,它們似乎是用於匹配的。我能可靠地與4行的Mathematica代碼找到它們:
lotto = [source image]
lottoBW = Image[Map[Max, ImageData[lotto], {2}]]
這需要最大(R,G,B)對每一個像素,即,它濾出紅色和黃色的打印(更多或更少)。結果是這樣的:
然後我使用日誌過濾器來查找黑斑和結果圖像中尋找局部最大值
lottoBWG = ImageAdjust[LaplacianGaussianFilter[lottoBW, 20]]
MaxDetect[lottoBWG, 0.5]
結果:
如果你看我的其他模板,有一個黑色矩形缺失:http://imageshack.us/f/27/thn.png/ http://imageshack.us/photo/my-images/683/hhn。 PNG / – Ben
請按照下列步驟操作:
好吧,我正在檢測模板和掃描圖像上的矩形。現在我想使用邊緣點(藍色,綠色,紅色圓圈)來包裝圖像...我不知道任何對應的點,你需要findHomography(openCV)/ RANSAC? – Ben
但我仍然需要點對RANSAC?一些匹配的掃描和模板圖像的點? http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findhomography – Ben