2014-01-27 58 views
0

我在Python編程中遇到了很多麻煩,主要是因爲我是初學者。python中包含形狀拐角和質心的數據結構

我首先將findContours應用於圖片,並且必須將檢索到的形狀拐角和形狀質心保存在數據結構中以供後面的修改使用。

我創建看起來像這樣(形狀的數量是未知的)的形狀的數據結構:

Shapes = [[shape1-Corners], 
      [shape2-Corners], 
      [shape3-Corners], 
      [...] 
      [shapeN-Corners]] 

和含有中心(再次形狀的數量是未知的)另一個問題:

Centers = [x0, y0, x1, y1, x2, y2,...,xn, yn] 

現在我要訪問這兩個結構中的數據,並執行pointPolygonTest檢查的形狀是裏面一個又一個,但當然這真的很難(因爲我明白,這個解決方案有兩個數據結構不是最好的)

這是我寫的訪問數據結構的代碼:

for k in range(0, len(centers), 2): 
    nowcx = centers[k] 
    nowcy = centers[k+1] 
    for j in range(len(shapes)): 
     if cv2.pointPolygonTest(shapes[j],(nowcx, nowcy),False)==1: 
      print "inside" 
     else: 
      print "outside" 

爲了便於理解,這是在紅色的質心的畫面。你可以看到有三種形狀:三角形,正方形和五角形。所以數據結構包含3個形狀的3個記錄和3個質心的6個元素。

https://www.dropbox.com/s/vibl0h0y4ses1za/graph.png

輸出給我9個比較,當它們應該是實際3:

  1. 三角形針對正方形 - >外針對五邊形
  2. 三角形 - >內部
  3. 平方againstr五邊形 - >裏面

這就是輸出:

inside 
outside 
inside 
outside 
inside 
inside 
inside 
outside 
inside 

我在做什麼錯?請幫幫我。 在此先感謝!

回答

0

我找到了解決辦法我自己,當然與URI的幫助(謝謝!)

首先,我改變的不是有兩個數據結構,現在我只有一個數據結構。這種數據結構是這樣形成的:

Shapes = [[shape1-Corners],[CenterX, CenterY], 
      [shape2-Corners],[CenterX, CenterY], 
      [shape3-Corners],[CenterX, CenterY], 
      [...] 
      [shapeN-Corners],[CenterX, CenterY]] 

這意味着質心被保存在形狀的角點之後。

在此之後,數據結構的訪問是這樣做:

for k in range(1, len(shapes), 2): 
    nowcx = shapes[k][0][0] #x coordinate of the center 
    nowcy = shapes[k][0][1] #y coordinate of the center 
    for z in range(k+1, len(shapes), 2): 
     if cv2.pointPolygonTest(shapes[z],(nowcx, nowcy),False)==1: 
      print "inside" 
     else: 
      print "outside" 

而且輸出(如希望):你給

outside 
inside 
inside 
0

當你實際上不想這樣做時,你在嵌套兩個循環。 使用嵌套循環,對於每個中心,您正在檢查所有形狀。你想要做的是爲每個中心測試適當的多邊形。

for point, shape in zip(zip(*[iter(centers)]*2), shapes): 
    if cv2.pointPolygonTest(shape, point, False): 
     print "inside" 
    else: 
     print "outside" 

for k in range(0, len(centers), 2): 
    nowcx = centers[k] 
    nowcy = centers[k+1] 
    if cv2.pointPolygonTest(shapes[k/2],(nowcx, nowcy),False)==1: 
     print "inside" 
    else: 
     print "outside" 

您可以通過使用zip(* [國際熱核實驗堆(S)] * N)成語來聚類中心列表中兩個值的元組做一點點更清潔,更「Pythonian」

+0

第一個解決方案我實際上工作將形狀[k/2]放在pointPolygonTest中。所以這行代碼將是:如果cv2.pointPolygonTest(形狀[k/2],(nowcx,nowcy),False)== 1: –

+0

順便說一句,您的解決方案不能解決問題。它實際上將每個質心與它自己的形狀進行比較,而不是針對其他形狀。 –