2011-12-18 317 views
9

我有2個輪廓A和B,我想檢查它們是否相交。 A和B兩者都是類型CV點::向量和是不同尺寸OpenCV檢測輪廓相交

的要檢查相交,我試圖做bitwise_and。這是拋出一個異常,因爲輸入的大小不同。我該如何解決 ?

編輯:

所附的圖像應該給有關問題的一個更好的主意。汽車由藍色輪廓跟蹤,而障礙物由粉紅色輪廓跟蹤。我需要檢查路口。 enter image description here

回答

11

一個簡單但可能不是最有效的方法是使用drawContours來創建兩個圖像:一個具有汽車輪廓,另一個具有障礙輪廓。

然後and他們在一起,任何仍然是積極的點將是交點。

一些僞代碼(我使用Python接口,這樣就不會得到C++語法正確的,但它應該是非常簡單,你轉換):

import numpy as np # just for matrix manipulation, C/C++ use cv::Mat 
# find contours. 
contours,h = findContours(img, mode=RETR_LIST, method=CHAIN_APPROX_SIMPLE) 
# Suppose this has the contours of just the car and the obstacle. 

# create an image filled with zeros, single-channel, same size as img. 
blank = np.zeros(img.shape[0:2]) 

# copy each of the contours (assuming there's just two) to its own image. 
# Just fill with a '1'. 
img1 = drawContours(blank.copy(), contours, 0, 1) 
img2 = drawContours(blank.copy(), contours, 1, 1) 

# now AND the two together 
intersection = np.logical_and(img1, img2) 

# OR we could just add img1 to img2 and pick all points that sum to 2 (1+1=2): 
intersection2 = (img1+img2)==2 

如果我看intersection我會得到一個圖像是等高線相交的地方,而其他地方是0。

另外,您可以填寫整個輪廓(不只是輪廓,但在裏面太滿)與drawContours(blank.copy(), contours, 0, 1, thickness=-1)然後intersection圖像將包含輪廓之間的交叉區域。

+0

謝謝!似乎工作很好。 – Madman 2011-12-19 07:56:19

0

如果您首先使用幾乎任何一致的排序標準對您的矢量進行排序,那麼您可以直接在矢量上使用std::set_intersection。如果輪廓比圖像大小短,這可能比公認的答案更快。

0

我發現Clipper庫對於這些目的非常有用。 (將cv::Point的向量轉換爲Clipper Path對象可以直接進行。)