2014-04-04 509 views
3

我有一個熔鍊立方體的圖像,隨着時間的推移形成一個液滴。到目前爲止,我提取了它的輪廓,但接下來我需要區分物體和表面。我的想法是檢測物體接觸表面的角落,但我正在努力尋找一個合理的方法來做到這一點(最好使用opencv的C++接口)。我會很感激任何建議。
這裏是所提取的輪廓的一些例子:
1234opencv物體輪廓角點檢測

編輯: @Haris:

我已經想你的建議的一個變種,它是做的工作對我來說:

r1r2r2

在ap接近輪廓i從左邊靠近,尋找具有指定範圍中的值的第一個角度,然後從右邊開始。由於逼近的輪廓點是原始輪廓點的一個子集,我然後確定原始序列中的2個角點,並在兩個角落處剪切它。我把中間的部分當作水滴,左邊和右邊的部分,我重新宣佈是我的表面線。可能會有更好,更穩定的方法,但這對我有用。謝謝!

+0

也許它會更容易從表面的物體與原始圖像區分(與爲例一個閾值)。我們有可能看到原始圖像嗎?首先想到的是 – Irisciences

+0

。如果輪廓點按順序存儲(如它們在圖像中一樣)。我將選擇一個「好」的d_Index表示〜5(對於平滑的小噪聲),併爲每個點i計算「正切」向量P [i + 5] -P [i]。鄰接切線向量的內積將顯示拐角處的下降。找到下降的最小位置/ i(通過線性插值??)。第一個min_i_h和最後一個min_i_e將分割來自所有對象的輪廓。如果您需要該區域,請在P [i_h]到P [i_e]的原始圖像中畫一條線,然後重新找到輪廓線。 – maythe4thbewithu

回答

7

你可以試試這個方法,

  1. 查找contour and approxPolyDP.

  2. 假設你有approxPolyDP點像P1,P2,P3等等

  3. 現在計算連續線之間的角度,即線(P1,P2),線(P2,P3)等之間的角度,並檢查每條調整線的角度差,如果差值接近90度,則可以說有角。

對於角度可以使用方程

double Angle = atan2(y2 - y1, x2 - x1) * 180.0/CV_PI; 
+0

謝謝你的回答!它肯定聽起來不錯,我不知道哪個輪廓點正好能夠優化出approxPolyDP函數,而且我現在太累了,現在就自己去閱讀一下,但是在接下來的幾天裏肯定會得到它:-) I'將讓您知道結果 – user2950911

+1

approxPolyDP採用對角度計算非常重要的精度或公差參數。因爲在立方體融化時它保持相同,所以在連結幀序列中找到一條線更容易。像前景減法。 – Vlad