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)
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)
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
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