Example #1
0
def hough_line_transform(edges):
    rho = 1  # distance resolution in pixels of the Hough grid
    theta = np.pi / 180  # angular resolution in radians of the Hough grid
    threshold = 10  # minimum number of votes (intersections in Hough grid cell)
    min_line_length = 120  # minimum number of pixels making up a line
    max_line_gap = 10  # maximum gap in pixels between connectable line segments
    line_image = np.copy(edges) * 0  # creating a blank to draw lines on
    kernel = np.ones((5, 5), np.uint8)
    #opening = cv2.morphologyEx(edges, cv2.MORPH_OPEN, kernel)
    #dilation = cv2.dilate(edges, kernel, iterations=1)
    closing = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)
    closing2 = cv2.morphologyEx(closing, cv2.MORPH_CLOSE, kernel)
    closing3 = cv2.morphologyEx(closing2, cv2.MORPH_CLOSE, kernel)
    #dilation = cv2.dilate(closing3, kernel, iterations=2)
    cv2.imwrite('closingfine.png', closing3)

    closing_img = cv2.imread('closingfine.png', cv2.IMREAD_GRAYSCALE)
    lines = cv2.HoughLinesP(closing_img, rho, theta, threshold, np.array([]),
                            min_line_length, max_line_gap)
    points = []
    if lines is not None:
        for line in lines:
            for x1, y1, x2, y2 in line:
                points.append(((x1 + 0.0, y1 + 0.0), (x2 + 0.0, y2 + 0.0)))
                cv2.line(line_image, (x1, y1), (x2, y2), (0, 255, 0), 5)
                cv2.waitKey(20)
    cv2.imshow('line image', line_image)
    lines_edges = cv2.addWeighted(edges, 1.2, line_image, 1, 0)
    print(lines_edges.shape)
    intersections = bot.isect_segments(points)
    print(intersections)
    for idx, inter in enumerate(intersections):
        a, b = inter
        match = 0
        for other_inter in intersections[idx:]:
            c, d = other_inter
            if abs(c - a) < 8 and abs(d - b) < 8:
                match = 1
                if other_inter in intersections:
                    intersections.remove(other_inter)
                    intersections[idx] = ((c + a) / 2, (d + b) / 2)

        if match == 0:
            intersections.remove(inter)

    for inter in intersections:
        a, b = inter
        for i in range(6):
            for j in range(6):
                lines_edges[int(b) + i, int(a) + j] = [0, 0, 255]

    cv2.imshow('line_intersections.png', lines_edges)
    cv2.imwrite('line_intersections.png', lines_edges)
    cv2.waitKey(0)
Example #2
0
def isect_segments(s):
    ret = poly_point_isect.isect_segments(s)
    return tuple(sorted(set(ret)))
def isect_segments(s):
    ret = poly_point_isect.isect_segments(s)
    return tuple(sorted(set(ret)))
k - Harris detector free parameter in the equation.
'''
#corners = cv2.cornerHarris(img, 4, 3, 0.04)
#corners = cv2.dilate(corners, None)

#img2 = cv2.cvtColor(final, cv2.COLOR_BGR2GRAY)
#img[corners > 0.01 * corners.max()]=[255, 0, 0]

#plt.subplot(2, 1, 2)
#plt.imshow(final, cmap = 'gray')
#plt.title('Canny Edge Detection')
#plt.xticks([])
#plt.yticks([])
#plt.show()
#cv2.waitKey(0)

#Drawing points
#print (points)
#cv2.waitKey(0)
intersections = bot.isect_segments(points)
#print (intersections)
#cv2.waitKey(0)

for inter in intersections:
    a, b = inter
    for i in range(5):
        for j in range(5):
            lines_edges[int(b) + i, int(a) + j] = [0, 0, 255]

cv2.imshow('lines_with_points', lines_edges)
cv2.waitKey(0)
Example #5
0
def polygon_count(A):
    # sort ends from left to right
    for i, a in enumerate(A):
        A[i] = (sorted(a, key=get_key))

    # get interesections
    isects = poly_point_isect.isect_segments(A)

    # sort isects
    isects = sorted(isects, key=get_key)

    # find associate interesections with lines
    passess = []
    for p in isects:
        l_passess = []
        for id, s in enumerate(A):
            if is_between(s[0], s[1], p):
                l_passess.append(id)
        a = np.asarray(A[l_passess[0]][0]) - np.asarray(p)
        b = np.asarray(A[l_passess[1]][0]) - np.asarray(p)
        ap = cart2pol(a[0], a[1])
        bp = cart2pol(b[0], b[1])

        if ap[1] > bp[1]:
            # if A[l_passess[0]][0][1] < A[l_passess[1]][0][1]:
            l_passess[0], l_passess[1] = l_passess[1], l_passess[0]

        passess.append(l_passess)

    K = len(isects)
    count = np.zeros([K + 1])
    sigma = np.zeros([len(A), len(A), K + 1])

    G = nx.DiGraph()

    Q = []
    for inter, pas, e in zip(isects, passess, range(0, len(passess))):

        # step a
        for ks in range(0, K + 1):
            if sigma[pas[0], pas[1], ks] > 0:
                count[ks] = count[ks] + sigma[pas[0], pas[1], ks]
                Q.append((pas[0], pas[1], ks))

        # step b
        sigma[pas[1], pas[0], 2] = 1
        # step c
        for u in range(0, len(A)):
            if is_below(A[u][0], A[u][1], inter) and u != pas[1]:
                for j in range(2, K + 1):
                    if sigma[u, pas[0], j] > 0:
                        sigma[u, pas[1],
                              j + 1] = sigma[u, pas[1],
                                             j + 1] + sigma[u, pas[0], j]
                        G.add_edge((u, pas[1], j + 1), (u, pas[0], j),
                                   weight=e)

        for l in range(0, len(A)):
            if is_above(A[l][0], A[l][1], inter) and l != pas[0]:
                for j in range(2, K + 1):
                    if sigma[pas[1], l, j] > 0:
                        sigma[pas[0], l,
                              j + 1] = sigma[pas[0], l, j + 1] + sigma[pas[1],
                                                                       l, j]
                        G.add_edge((pas[0], l, j + 1), (pas[1], l, j),
                                   weight=e)

    # report polygons
    sink_nodes = [
        node for node, outdegree in G.out_degree(G.nodes()) if outdegree == 0
    ]
    paths = []
    for q in Q:
        for path in nx.all_simple_paths(G, source=q, target=sink_nodes):
            path_p = []
            try:
                v = passess.index(list([q[0], q[1]]))
            except ValueError:
                v = passess.index(list([q[1], q[0]]))
            path_p.append(v)
            pw = len(passess)
            append = True
            for i in range(len(path) - 1):
                if pw > G[path[i]][path[i + 1]]['weight']:
                    pw = G[path[i]][path[i + 1]]['weight']
                    path_p.append(pw)
                else:
                    append = False
            if append:
                r = path[i + 1]
                try:
                    v = passess.index(list([r[0], r[1]]))
                except ValueError:
                    v = passess.index(list([r[1], r[0]]))
                path_p.append(v)
                paths.append(path_p)
    # sort vertices in polygon
    ps = []
    for p in paths:
        ps.append(sort_vertices(isects, p))

    return count, ps, isects, G, Q
Example #6
0
    def mouseDragEvent(self, ev):
        if ev.button() != QtCore.Qt.LeftButton:
            ev.ignore()
            return
        else:
            self.state_flag['isDrag'] = True
            print "start drag", self.state_flag['isDrag']
            if ev.isStart():
                self.track = []
            if self.state_flag['isPaint']:
                if ev.isStart():
                    print "start"
                    self.state_flag['isMoving'] = True
                ev.accept()
                print ev.pos()
                try:
                    self.image_item.draw_at(ev.pos())
                    self.track.append((ev.pos().x(), ev.pos().y()))
                    #self.sigDragTriggered.emit(pg.Point(ev.pos().y(),-ev.pos().x()))
                    #self.sigDragTriggered.emit(ev.pos())
                except ValueError as e:
                    pass
            else:
                ROI.mouseDragEvent(self, ev)

        if ev.isFinish():
            print "finish drag"
            self.state_flag['isDrag'] = False
            if self.state_flag['isMoving'] == True:
                print "end"
                self.track.append((ev.pos().x(), ev.pos().y()))
                try:
                    self.image_item.draw_at(ev.pos())
                except ValueError as e:
                    pass
                self.image_item.setImage(np.array(self.original_array,
                                                  copy=True),
                                         levels=[0, 255])
                #self.image_item.setImage(self.image_array)
                #self.sigDragTriggered.emit(pg.Point(ev.pos().y(),-ev.pos().x()))
                #self.sigDragTriggered.emit(ev.pos())
                #self.sigTrackCompleted.emit(self)
                slack = True
                self.track = [x[0] for x in groupby(self.track)]
                segments = []
                for i in range(len(self.track) - 1):
                    segments.append((self.track[i], self.track[i + 1]))
                try:
                    isect = poly_point_isect.isect_segments(
                        tuple(segments), True)
                except AssertionError as e:
                    ## there are some problems with the method
                    isect = []
                isect.sort(key=lambda k: k[1][1])
                print "track has", len(self.track), "points"
                ## allow drawing unclosed curve, so the instersection judgement is not needed
                '''
				if len(isect) > 0:
					first_isect = isect[0]
					print "first intersect: ", first_isect
					self.track = self.track[first_isect[1][0]+1 : first_isect[1][1]-1] + [first_isect[0]]
					print len(self.track)
					#self.curves.append(self.make_curve([[30,30],[50,5],[300,30],[400,100],[300,300],[200,400],[30,300]], 0.5, 1))
					#print self.track
					#self.track = [(124.79421229324313, 300.80197629011207), (134.39463578398144, 267.200494072528), (148.7952710200889, 233.59901185494397), (161.59583567440663, 203.1976708009393), (172.79632974693467, 187.1969649830421), (179.19661207409354, 179.19661207409354), (193.597247310201, 164.79597683798607), (217.59830603704674, 139.19484752935062), (241.5993647638925, 123.19414171145343), (264.00035290894857, 113.59371822071512), (288.00141163579434, 103.99329472997684), (308.8023291990607, 97.59301240281798), (328.0031761805373, 94.39287123923853), (350.40416432559334, 94.39287123923853), (372.8051524706494, 103.99329472997684), (385.6057171249671, 108.79350647534599), (393.60607003391567, 115.19378880250486), (406.40663468823345, 123.19414171145343), (414.406987597182, 131.19449462040205), (420.8072699243409, 143.99505927471978), (427.20755225149975, 155.19555334724777), (433.60783457865864, 171.19625916514497), (440.0081169058175, 191.99717672841126), (444.8083286511866, 214.39816487346735), (446.40839923297636, 223.99858836420566), (444.8083286511866, 243.19943534568222), (438.4080463240278, 265.6004234907383), (432.0077639968689, 283.2011998904252), (427.20755225149975, 291.20155279937376), (424.00741108792033, 292.8016233811635), (420.8072699243409, 296.0017645447429), (419.2071993425512, 297.60183512653265), (409.60677585181287, 304.0021174536915), (401.6064229428643, 308.80232919906064), (395.2061406157054, 312.0024703626401), (380.80550537959795, 320.0028232715887), (363.20472897991107, 328.00317618053725), (345.6039525802242, 336.0035290894859), (329.603246762327, 345.60395258022413), (323.20296443516816, 348.8040937438036), (315.2026115262195, 353.60430548917276), (312.0024703626401, 353.60430548917276), (304.00211745369154, 358.4045172345419), (296.0017645447429, 361.60465839812133), (284.8012704722149, 368.0049407252802), (278.40098814505603, 371.2050818888596), (268.8005646543177, 372.8051524706493), (262.4002823271589, 372.8051524706493), (254.39992941821023, 372.8051524706493), (239.99929418210277, 372.8051524706493), (220.7984472006262, 366.4048701434905), (209.59795312809817, 363.20472897991107), (206.39781196451875, 361.60465839812133), (201.5976002191496, 356.8044466527522), (193.597247310201, 352.004234907383), (185.5968944012524, 344.00388199843445), (180.79668265588325, 337.60359967127556), (172.79632974693467, 326.4031055987476), (164.79597683798607, 318.40275268979894), (163.19590625619637, 316.80268210800926), (153.59548276545806, 305.6021880354812), (147.1952004382992, 294.4016939629532), (140.7949181111403, 281.60112930863545), (132.358182316249, 274.328081209592)]
					self.curves.append(CurveObject(path=self.make_curve(self.track, self.curve_tense, 8), pen=QtGui.QPen(self.curve_color, self.curve_size, QtCore.Qt.SolidLine, QtCore.Qt.FlatCap, QtCore.Qt.MiterJoin)))
				'''
                #self.curves.append(CurveObject(path=self.make_curve(self.track, self.curve_tense, step='auto'), pen=QtGui.QPen(self.curve_color, self.curve_size, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin)))
                self.curves.append(
                    CurveObject(
                        self.make_curve(self.track,
                                        self.curve_tense,
                                        step='auto'),
                        QtGui.QPen(self.curve_color, self.curve_size,
                                   QtCore.Qt.SolidLine, QtCore.Qt.RoundCap,
                                   QtCore.Qt.RoundJoin), self.track,
                        self.curve_tense, self.curve_color, self.curve_size,
                        QtCore.Qt.SolidLine, QtCore.Qt.RoundCap,
                        QtCore.Qt.RoundJoin))
                self.update_curve()
                self.state_flag['isMoving'] = False
def getIntersections(data):
    isect = poly_point_isect.isect_segments(data)  #recibe tuplas (puntos)
    return isect  #regresa intersecciones