DelaunayTriangulation_VoronoiDiagram_using_OpenCV的实现

前言

最近project中有关于delaunay的实现问题,查找资料,看到learnopencv这个网站,有很多peoject的实现,本文主要是实现Delaunay Triangulation and Voronoi Diagram using OpenCV这个project,基于Python实现的。

环境

系统环境:win7_64

python版本:python3.5.2

实现过程

1.下载代码和依赖的资源;

Satya Mallick的Github

github上列出了learnopencv用到的全部代码,非常不错!推荐~

2.基于python的代码;

#!/usr/bin/python
#RE:http://www.learnopencv.com/delaunay-triangulation-and-voronoi-diagram-using-opencv-c-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 )
    cv2.circle( img, p, 2, color, cv2.FILLED, 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, 0)
            cv2.line(img, pt2, pt3, delaunay_color, 1, 0)
            cv2.line(img, pt3, pt1, delaunay_color, 1, 0)
 
 
# Draw voronoi diagram
def draw_voronoi(img, subdiv) :
 
    ( facets, centers) = subdiv.getVoronoiFacetList([])
 
    for i in range(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, 0);
        ifacets = np.array([ifacet])
        cv2.polylines(img, ifacets, True, (0, 0, 0), 1, 0)
        cv2.circle(img, (centers[i][0], centers[i][1]), 3, (0, 0, 0), cv2.FILLED, 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("obama.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("obama.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.imshow(win_delaunay, 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.imshow(win_delaunay,img)
    cv2.imshow(win_voronoi,img_voronoi)
    cv2.waitKey(0)
View Code

注意:官网上的代码由于版本的不同不能正常运行,需要调试通过;

3.代码调试;

调试代码的过程中遇到较多的问题,针对出现的问题一一进行解决;

3.1)ImportError: No module named 'cv2'

原因:没有安装cv2第三方库;

解决方法:

在Python的安装目录下打开.Scripts路径,再次目录下打开cmd,使用以下命令安装cv2

pip3 install opencv-python

尝试过的方法

第一次安装使用的命令是

pip install cv2

但是没有正确安装;

后来找到另一个方法,刚看的时候觉得很不错,不过仔细看发现主要是针对python2.7版本的,之后就放弃了;

3.2)忘记加载资源文件;

原因:程序代码中需要用到图片和txt文件,将其加载到合适的路径下即可;

3.3)版本有关;

解决方法:直接将cv2.CV_AA remove即可;

3.4)版本问题;

解决方法:将cv2.cv.CV_FILLED替换为cv2.CV_FILLED即可;

3.5)版本问题;

解决方法:直接将cv2.CV_FILLED替换为cv2.FILLED即可;

3.6)不同版本的语法问题;

解决方法:将xrange替换为range即可;

之前也遇到过这个问题,现在想想应该是不同版本的Python的语法不同造成的;

4.运行结果;

参考

1.learnopencv官网

2.官网作者的github

3.CV_AA问题的解决

4.no_attibute_cv问题的解决

5.CV_FILLED问题的解决

原文地址:https://www.cnblogs.com/happyamyhope/p/7553205.html