首先,我有一張我傳入引數的影像,然后我用 OpenCV(使用cv.findContours方法)檢索了他的所有輪廓。我用我的parseArray方法決議這個串列,得到一個決議良好的 img x,y 輪廓坐標[(x1, y1), (x2, y2), ...]串列(這個串列的大小等于24163我的獨角獸影像)
所以這是我的代碼:
def parseArray(array):
parsedArray = []
for i in array:
for j in i:
parsedArray.append((j[0][0], j[0][1]))
return parsedArray
def delItemList(index, list):
del list[index: index 1]
img = cv.imread(sys.argv[1])
canny = cv.Canny(img, 215, 275)
contours, hierarchies = cv.findContours(canny,cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
parsedArray = parseArray(contours)
drawList = []
while (len(parsedArray) > 0):
tmp = [(0,0)]
tree = KDTree(parsedArray)
dist, ind = tree.query(tmp, k=1)
tmp[0] = parsedArray[int(ind)]
drawList.append(parsedArray[int(ind)])
delItemList(int(ind), parsedArray)
這是一個time:

我怎樣才能大大減少我的回圈時間(不到一秒),這可能嗎?
uj5u.com熱心網友回復:
我認為您將大部分時間都花在了 while 回圈中,因此我將專注于以下幾行:
while (len(parsedArray) > 0):
tmp = [(0,0)]
tree = KDTree(parsedArray)
dist, ind = tree.query(tmp, k=1)
tmp[0] = parsedArray[int(ind)]
drawList.append(parsedArray[int(ind)])
delItemList(int(ind), parsedArray)
我的理解是,您想使用 KDTree 在輪廓點中找到點 [(0,0]] 的最近鄰居,一旦找到它,就將其從輪廓點中洗掉并重新開始。這個代價高昂,因為您正在創建一個復雜的結構,該結構經過優化以僅針對一個查詢執行最近鄰查詢,然后您一次又一次地創建它。我可以建議您進行兩種優化:
- 如果您出于某種原因想保留 KDTree,請立即查詢所有點:(
tree.query(tmp, k=len(parsedArray))參見scipy 檔案) - 計算 [(0, 0)] 和輪廓的每個點之間的距離,并按此距離對它們進行排序。您可以在其他執行緒上找到解決方案,例如這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/430353.html
