2014-07-22 17 views
7

我一直在圖像處理和機器人技術方面開展自我項目,而機器人通常會檢測顏色並挑選出對象,並嘗試檢測電路板上的孔洞(類似於不同的多邊形)。爲了更好地理解這裏設置的是圖像: enter image description here如何改善關鍵點檢測和匹配

正如你可以看到我有來檢測這些漏洞,找出它們的形狀,然後用機器人適合對象插入孔中。我正在使用kinect深度相機來獲取深度圖像。 PIC的如下所示:

enter image description here

我陷入瞭如何用相機檢測孔,最初使用掩蔽,以除去背景部分和思想一些基於深度測量前景部分,但是這並沒有奏效,因爲在相機的不同方向上,這些孔將與電路板合併在一起......像干擾一樣(它完全變成白色)。那時,我發現adaptiveThreshold功能

adaptiveThreshold(depth1,depth3,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,7,-1.0); 

帶着噪聲去除使用侵蝕,擴張,高斯模糊;如下圖所示,它以更好的方式檢測到這些孔。然後,我使用cvCanny邊緣檢測器來獲取邊緣,但到目前爲止,它並不如下圖所示。之後,我試用了來自SIFT,SURF,ORB,GoodFeaturesToTrack的各種特徵檢測器,並發現ORB給​​出了最好的時間和檢​​測到的功能。在此之後,我試圖通過找到它的關鍵點並匹配這些關鍵點來獲得查詢圖像的相對姿勢,以得到findHomography函數的良好匹配。結果如下示出爲圖中:

enter image description here

在最後,我想獲得的相對照相機的兩個圖像之間的姿勢,並使用旋轉和平移矢量從得到了機器人移動到該位置solvePnP函數。

那麼有沒有其他方法可以提高檢測到的關鍵點檢測和匹配的 孔的質量?

我還曾試圖輪廓檢測和approxPolyDP但近似的形狀是不是真的好:

enter image description here

我試圖調整的閾值和精明的功能,但 的輸入參數,這是最好的我可以得到

另外,我的方法是讓攝像機姿態正確嗎?

UPDATE:不管是什麼我想我不能得到良好的可重複的特性映射。然後我在網上讀到,深度圖像在分辨率上很便宜,而且它只用於掩蔽和獲取距離等內容。所以,它讓我覺得這些功能並不合適,因爲低分辨率圖像具有雜亂的邊緣。所以我想到了在RGB圖像上檢測特徵並使用深度圖像僅獲得這些特徵的距離。我得到的功能的質量從字面上來說,它甚至檢測到板上的螺絲!以下是使用GoodFeaturesToTrack關鍵點檢測檢測到的關鍵點。 keypoints using GoodFeaturesToTrack。 我遇到了另一個障礙,同時得到的距離點的距離沒有正確出來。我搜索了可能的原因,經過一段時間之後,我發現RGB和深度圖像之間存在偏移,因爲相機之間存在偏移。您可以從頭兩張圖像中看到這一點。然後我搜索瞭如何補償這個抵消的網絡,但找不到一個可行的解決方案。

如果你們中的任何一個人可以幫我補償偏移量,那會很棒!

UPDATE:我無法很好地使用goodFeaturesToTrack函數。該函數給出了Point2f類型的角點。如果要計算描述符,我們需要關鍵點並將Point2f轉換爲Keypoint並使用下面的代碼片段導致縮放和旋轉不變性的損失。

for(size_t i = 0; i < corners1.size(); i++) 
{ 
keypoints_1.push_back(KeyPoint(corners1[i], 1.f)); 
} 

特徵匹配的可怕結果如下所示loss of invariance

我必須現在就開始不同的功能匹配。我會發布進一步的更新。如果有人能夠幫助消除偏移問題,這將非常有幫助。

+0

以下是圖像的其餘http://www.hostingpics.net/viewer.php ?id = 764686img3.jpg(這是深度圖像)。 – SidJaw

+0

這是自適應閾值圖像http://www.hostingpics.net/viewer.php?id=468584adapthresh.png。這是approxpolyDP圖像http://www.hostingpics.net/viewer.php?id=196889coo.png任何人都可以善待我的問題,因爲我需要至少10個聲望發佈圖像。 – SidJaw

+0

爲什麼不嘗試模板匹配,因爲您已經知道機器人必須適應的孔的形狀。注意:如果對象的大小不同,模板匹配將無法正常工作。即如果矩形的大小在不同的電路板或放大/縮小等方面有所不同。 – Darshan

回答

0

補償圖像輸出與世界之間的區別座標:

你應該使用好老相機校準方法,用於校準相機響應,並可能產生一個校正矩陣攝像機輸出(以將其轉換成真正的秤)。

一旦您打印出棋盤模板並捕捉各種鏡頭,這並不複雜。 (對於這個應用程序,您不必擔心旋轉不變性就校準與圖像陣列的世界觀。)

您可以在這裏找到更多的信息:http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/own_calib.html

-

現在,因爲我似乎無法評論這個問題,我想問問你的具體應用是否需要機器在飛行中「發現」孔的形狀。如果孔形狀數量有限,則可以用數學方法對它們進行建模,並在黑白邊緣圖像上查找支持預定義模型的像素。 (x)^ 2 +(y)^ 2-r^2 = 0對於半徑爲r的圓,而x和y是像素座標。

這就是說,我相信需要更多關於應用程序的要求(形狀檢測)的說明。

+0

嗨。感謝您的回覆。但是我已經通過攝像機標定得到了攝像機固有和失真係數矩陣。我在接下來要做的事情上失去了知識。 – SidJaw

+0

你好,我不知道在這裏要求更新是否合適,但是你有進步到目前爲止? – ahmet

0

如果您要檢測提供的圖像中的特定形狀,那麼最好使用分類器。深入研究哈爾分類器,或者更好地研究詞袋。

使用BoW,您需要訓練一堆數據集,包括正和負樣本。正樣本將包含您想要檢測的每個形狀的N個獨特樣本。如果N> 10,最好> 100,並且變異性和獨特性更好,這對於良好的魯棒分類器訓練來說更好。

負樣本會(很明顯)包含不以任何方式表示您的形狀的東西。這只是爲了檢查分類器的準確性。另外,一旦你有你的分類器訓練,你可以分發你的分類器數據(比如,假設你使用SVM)。

這裏有一些鏈接,讓您開始使用文字包: https://gilscvblog.wordpress.com/2013/08/23/bag-of-words-models-for-visual-categorization/

示例代碼: http://answers.opencv.org/question/43237/pyopencv_from-and-pyopencv_to-for-keypoint-class/