2014-01-27 26 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

顺便说一句,您的解决方案不能解决问题。它实际上将每个质心与它自己的形状进行比较,而不是针对其他形状。 –