puede utilizar http://pypi.python.org/pypi/Polygon/2.0.4, aquí es un ejemplo:
>>> import Polygon
>>> a = Polygon.Polygon([(0,0),(1,0),(0,1)])
>>> b = Polygon.Polygon([(0.3,0.3), (0.3, 0.6), (0.6, 0.3)])
>>> a & b
Polygon:
<0:Contour: [0:0.60, 0.30] [1:0.30, 0.30] [2:0.30, 0.60]>
para convertir el resultado de cv2.findContours a formato de coma polígono, se puede:
points1 = contours[0].reshape(-1,2)
Esto convertirá la forma de (N, 1, 2) a (N, 2)
siguiente es un ejemplo completo:
import Polygon
import cv2
import numpy as np
from scipy.misc import bytescale
y, x = np.ogrid[-2:2:100j, -2:2:100j]
f1 = bytescale(np.exp(-x**2 - y**2), low=0, high=255)
f2 = bytescale(np.exp(-(x+1)**2 - y**2), low=0, high=255)
c1, hierarchy = cv2.findContours((f1>120).astype(np.uint8),
cv2.cv.CV_RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
c2, hierarchy = cv2.findContours((f2>120).astype(np.uint8),
cv2.cv.CV_RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
points1 = c1[0].reshape(-1,2) # convert shape (n, 1, 2) to (n, 2)
points2 = c2[0].reshape(-1,2)
import pylab as pl
poly1 = pl.Polygon(points1, color="blue", alpha=0.5)
poly2 = pl.Polygon(points2, color="red", alpha=0.5)
pl.figure(figsize=(8,3))
ax = pl.subplot(121)
ax.add_artist(poly1)
ax.add_artist(poly2)
pl.xlim(0, 100)
pl.ylim(0, 100)
a = Polygon.Polygon(points1)
b = Polygon.Polygon(points2)
intersect = a&b # calculate the intersect polygon
poly3 = pl.Polygon(intersect[0], color="green") # intersect[0] are the points of the polygon
ax = pl.subplot(122)
ax.add_artist(poly3)
pl.xlim(0, 100)
pl.ylim(0, 100)
pl.show()
Salida:
¿Es este método realmente rápido? Necesito seguir buscando la intersección de cada fotograma mientras capturo, y los recursos del sistema no son muy altos. –
Cuando intento crear un polígono a partir de un contorno de convec o casco convexo, este es el error que obtengo: 'cPolygon.Error: polígono o contorno no válido para la operación' El formato que ha especificado no es el formato que tengo (se muestra en mi publicación original). Supongo que algunas modificaciones pueden ser necesarias, pero no puedo imaginar cómo se podría hacer. –
por favor publique algunos datos de muestra. – HYRY