Spaces:
No application file
No application file
#!/usr/bin/python | |
import cv2 | |
import numpy as np | |
import random | |
# Check if a point is inside a rectangle | |
def rect_contains(rect, point) : | |
if point[0] < rect[0] : | |
return False | |
elif point[1] < rect[1] : | |
return False | |
elif point[0] > rect[2] : | |
return False | |
elif point[1] > rect[3] : | |
return False | |
return True | |
# Draw a point | |
def draw_point(img, p, color ) : | |
cv2.circle( img, p, 2, color, cv2.cv.CV_FILLED, cv2.CV_AA, 0 ) | |
# Draw delaunay triangles | |
def draw_delaunay(img, subdiv, delaunay_color ) : | |
triangleList = subdiv.getTriangleList(); | |
size = img.shape | |
r = (0, 0, size[1], size[0]) | |
for t in triangleList : | |
pt1 = (t[0], t[1]) | |
pt2 = (t[2], t[3]) | |
pt3 = (t[4], t[5]) | |
if rect_contains(r, pt1) and rect_contains(r, pt2) and rect_contains(r, pt3) : | |
cv2.line(img, pt1, pt2, delaunay_color, 1, cv2.CV_AA, 0) | |
cv2.line(img, pt2, pt3, delaunay_color, 1, cv2.CV_AA, 0) | |
cv2.line(img, pt3, pt1, delaunay_color, 1, cv2.CV_AA, 0) | |
# Draw voronoi diagram | |
def draw_voronoi(img, subdiv) : | |
( facets, centers) = subdiv.getVoronoiFacetList([]) | |
for i in xrange(0,len(facets)) : | |
ifacet_arr = [] | |
for f in facets[i] : | |
ifacet_arr.append(f) | |
ifacet = np.array(ifacet_arr, np.int) | |
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) | |
cv2.fillConvexPoly(img, ifacet, color, cv2.CV_AA, 0); | |
ifacets = np.array([ifacet]) | |
cv2.polylines(img, ifacets, True, (0, 0, 0), 1, cv2.CV_AA, 0) | |
cv2.circle(img, (centers[i][0], centers[i][1]), 3, (0, 0, 0), cv2.cv.CV_FILLED, cv2.CV_AA, 0) | |
if __name__ == '__main__': | |
# Define window names | |
win_delaunay = "Delaunay Triangulation" | |
win_voronoi = "Voronoi Diagram" | |
# Turn on animation while drawing triangles | |
animate = True | |
# Define colors for drawing. | |
delaunay_color = (255,255,255) | |
points_color = (0, 0, 255) | |
# Read in the image. | |
img = cv2.imread("d.jpg"); | |
# Keep a copy around | |
img_orig = img.copy(); | |
# Rectangle to be used with Subdiv2D | |
size = img.shape | |
rect = (0, 0, size[1], size[0]) | |
# Create an instance of Subdiv2D | |
subdiv = cv2.Subdiv2D(rect); | |
# Create an array of points. | |
points = []; | |
# Read in the points from a text file | |
with open("d.jpg.txt") as file : | |
for line in file : | |
x, y = line.split() | |
points.append((int(x), int(y))) | |
# Insert points into subdiv | |
for p in points : | |
subdiv.insert(p) | |
# Show animation | |
if animate : | |
img_copy = img_orig.copy() | |
# Draw delaunay triangles | |
draw_delaunay( img_copy, subdiv, (255, 255, 255) ); | |
cv2.imwrite("win_delaunay1.jpg", img_copy) | |
cv2.waitKey(100) | |
# Draw delaunay triangles | |
draw_delaunay( img, subdiv, (255, 255, 255) ); | |
# Draw points | |
for p in points : | |
draw_point(img, p, (0,0,255)) | |
# Allocate space for Voronoi Diagram | |
img_voronoi = np.zeros(img.shape, dtype = img.dtype) | |
# Draw Voronoi diagram | |
draw_voronoi(img_voronoi,subdiv) | |
# Show results | |
cv2.imwrite("win_delaunay.jpg",img) | |
cv2.imwrite("win_voronoi.jpg",img_voronoi) | |
cv2.waitKey(0) |