我有2個輪廓A和B,我想檢查它們是否相交。 A和B兩者都是類型CV點::向量和是不同尺寸OpenCV檢測輪廓相交
的要檢查相交,我試圖做bitwise_and。這是拋出一個異常,因爲輸入的大小不同。我該如何解決 ?
編輯:
所附的圖像應該給有關問題的一個更好的主意。汽車由藍色輪廓跟蹤,而障礙物由粉紅色輪廓跟蹤。我需要檢查路口。
我有2個輪廓A和B,我想檢查它們是否相交。 A和B兩者都是類型CV點::向量和是不同尺寸OpenCV檢測輪廓相交
的要檢查相交,我試圖做bitwise_and。這是拋出一個異常,因爲輸入的大小不同。我該如何解決 ?
編輯:
所附的圖像應該給有關問題的一個更好的主意。汽車由藍色輪廓跟蹤,而障礙物由粉紅色輪廓跟蹤。我需要檢查路口。
一個簡單但可能不是最有效的方法是使用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
圖像將包含輪廓之間的交叉區域。
如果您首先使用幾乎任何一致的排序標準對您的矢量進行排序,那麼您可以直接在矢量上使用std::set_intersection
。如果輪廓比圖像大小短,這可能比公認的答案更快。
我發現Clipper庫對於這些目的非常有用。 (將cv::Point
的向量轉換爲Clipper Path
對象可以直接進行。)
謝謝!似乎工作很好。 – Madman 2011-12-19 07:56:19