如何判斷點在輪廓內? OpenCV 計算機視覺

2021-10-03 22:17:06 字數 1922 閱讀 6958

本人對計算機視覺感興趣,正在閱讀《opencv計算機視覺程式設計攻略(第3版)》一書,非專業,純屬業餘愛好。本文是為了記錄學習過程中所思所想。

如有錯誤,請多指教。

本文基於opencv。

學到了第7.5節 提取連續區域。本節用到了 cv::findcontours 函式來查詢二值影象(非邊緣圖)中的連續區域。

std::vector<:vec4i> hierarchy;

cv::

findcontours

( image,

contours,

// 存放輪廓的向量

hierarchy,

// 層次結構

cv::retr_tree,

// 樹狀結構的輪廓

;// 每個輪廓的全部畫素

該函式不僅能找到連續區域,也能識別出輪廓間的父子關係。

識別出連續區域。影象上半部分大輪廓為父輪廓,內部小輪廓為子輪廓。父子關係存放於物件hierarchy中。詳見opencv官方文件或書籍p161。

那麼怎麼能判斷乙個區域在另乙個區域內呢?根據連續區域的定義,只需要判斷小區域上某個點在大區域內即可。所以問題變成了怎麼判斷點在乙個區域內。 通過google得到opencv有pointpolygontest函式可實現此功能。但是沒有查到該函式的原理,本人水平有限,還不能順利讀通原始碼。所以自己思考了一下如何實現這個功能。請注意,下文並不是opencv內pointpolygontest的原理。

隨手畫個示意圖。對乙個點p(x, y),依x軸、y軸方向分別一條線lx、ly,以向右為正。lx和輪廓的交點是a1、a2、…、a2n。ly和輪廓的交點是b1、b2、…、b2m。輪廓是有限封閉區域,所以直線與其交點必為偶數個(切點的情況,請移至 「 如何處理切點 」 處)。如果p點實際位置與其中任意點重合,那麼p點在輪廓上。一下討論不重合的情況。

如果p點在輪廓內,lx、ly與輪廓都必有交點;反之,都沒有交點。需考察一條直線即可。

若p點從負向無窮遠處沿lx向正向移動。那麼p點依次經過a1、a2、…、a2n。經過點,也可以理解為穿過邊緣。p點經過第乙個點時,有外部穿過邊緣,p點進入輪廓內。第二次經過點時,有內部穿過邊緣,p點進入外部。以此類推。

可見,只需要對a1、a2、…、a2n各點的橫座標進行排序,與p點實際橫座標進行比較,即可知p點是否在輪廓內。

當某個點是切點時,穿過切點並不會使p點與輪廓的關係發生變化,所以要把切點去除掉。如何去除切點呢?——利用點的梯度方向。

實現時,可使用drawcontours函式,在空白影象上繪製輪廓圖(繪製findcontours函式的結果)。在輪廓圖上計算每個交點的梯度,如果交點梯度方向與直線垂直,則可判斷該點就是切點。

同理。如果lx恰好與輪廓的一邊重合,會出現很多個點。這些點都可視為切點,與上述處理過程相同。即在對交點進行預處理時,不需要考慮交點的性質、點是否連線等,只需要計算梯度決定是否去除即可。

如果是其他方法得到的邊緣圖,可能存在邊緣厚度大於1的情況。那麼在同一處,邊緣與直線的相交處可能不是乙個點,而是一條線段。這對於判定、求梯度都會帶來麻煩。這篇**[1]第4.8節中關於「廣義霍夫變換誤差」的處理方法可能會起到作用,繼續思考…

思考果然使我快樂~~~

[1]ballard d h . generalizing the hough transform to detect arbitrary shapes[j]. pattern recognition, 1981, 13(2):111-122.

javascript 判斷點在麵內,點在圓內

點在多邊形內常用的演算法就是使用射線法,作為筆記直接上 判斷乙個點是否在多邊形內部 param points 多邊形座標集合 param testpoint 測試點座標 返回true為真,false為假 function insidepolygon points,testpoint return i...

OpenCV判斷輪廓是內輪廓還是外輪廓

使用opencv的findcontours函式查詢輪廓,當引數為cv retr list時,查詢到的輪廓不建立等級關係,也就是當前模式下不存在父輪廓或內嵌輪廓的位置關係,所以當圖中存在環形輪廓內外巢狀時 如下圖所示數字輪廓8 如果要判斷輪廓位置關係,需要自行判斷。判斷方法是可通過遍歷輪廓點,計算每個...

判斷點在多邊形內演算法

點和多邊形關係的演算法實現 好了,現在我們已經了解了向量叉積的意義,以及判斷直線段是否有交點的演算法,現在回過頭看看文章開始部分的討論的問題 如何判斷乙個點是否在多邊形內部?根據射線法的描述,其核心是求解從p點發出的射線與多邊形的邊是否有交點。注意,這裡說的是射線,而我們前面討論的都是線段,好像不適...