def onmouse(event, x, y, flags, param): cur_vis = vis if flags & cv2.EVENT_FLAG_LBUTTON: cur_vis = vis0.copy() r = 8 m = (anorm(np.array(p1) - (x, y)) < r) | (anorm(np.array(p2) - (x, y)) < r) idxs = np.where(m)[0] kp1s, kp2s = [], [] for i in idxs: (x1, y1), (x2, y2) = p1[i], p2[i] col = (red, green)[status[i]] cv2.line(cur_vis, (x1, y1), (x2, y2), col) kp1, kp2 = kp_pairs[i] kp1s.append(kp1) kp2s.append(kp2) cur_vis = cv2.drawKeypoints(cur_vis, kp1s, None, flags=4, color=kp_color) cur_vis[:, w1:] = cv2.drawKeypoints(cur_vis[:, w1:], kp2s, None, flags=4, color=kp_color) cv2.imshow(win, cur_vis) ''' b_channel, g_channel, r_channel = cv2.split(cur_vis) alpha_channel = np.ones((cur_vis.shape[0], cur_vis.shape[1]),dtype=np.uint8) #creating a dummy alpha channel image. alpha_channel.fill(255) img_RGBA = cv2.merge((b_channel, g_channel, r_channel, alpha_channel)) ''' send1.send('image', cur_vis)
def onmouse(event, x, y, flags, param): cur_vis = vis if flags & cv2.EVENT_FLAG_LBUTTON: cur_vis = vis0.copy() r = 8 m = (anorm(np.array(p1) - (x, y)) < r) | (anorm(np.array(p2) - (x, y)) < r) idxs = np.where(m)[0] kp1s, kp2s = [], [] for i in idxs: (x1, y1), (x2, y2) = p1[i], p2[i] col = (red, green)[status[i]] cv2.line(cur_vis, (x1, y1), (x2, y2), col) kp1, kp2 = kp_pairs[i] kp1s.append(kp1) kp2s.append(kp2) cur_vis = cv2.drawKeypoints(cur_vis, kp1s, None, flags=4, color=kp_color) cur_vis[:, w1:] = cv2.drawKeypoints(cur_vis[:, w1:], kp2s, None, flags=4, color=kp_color) cv2.imshow(win, cur_vis)
def onmouse(event, x, y, flags, param): #cur_vis = vis if flags & cv2.EVENT_FLAG_LBUTTON: vis = vis0.copy() r = 8 m = (anorm(p1 - (x, y)) < r) | (anorm(p2 - (x, y)) < r) idxs = np.where(m)[0] for i in idxs: status[i] = not status[i] draw_keypoints(vis) cv2.imshow(win, vis) if flags & cv2.EVENT_RBUTTONDOWN: vis = vis0.copy() r = 8 m = (anorm(p1 - (x, y)) < r) | (anorm(p2 - (x, y)) < r) idxs = np.where(m)[0] kp1s, kp2s = [], [] for i in idxs: (x1, y1), (x2, y2) = p1[i], p2[i] col = (red, green)[status[i]] cv2.line(vis, (x1, y1), (x2, y2), col) kp1, kp2 = kp_pairs[i] kp1s.append(kp1) kp2s.append(kp2) vis = cv2.drawKeypoints(vis, kp1s, flags=4, color=kp_color) vis[:,w1:] = cv2.drawKeypoints(vis[:,w1:], kp2s, flags=4, color=kp_color) cv2.imshow(win, vis)
def onmouse(event, x, y, flags, param): if event & cv2.EVENT_LBUTTONDOWN: vis = vis0.copy() r = 8 m = (anorm(p1 - (x, y)) < r) | (anorm(p2 - (x, y)) < r) idxs = np.where(m)[0] for i in idxs: status[i] = not status[i] draw_keypoints(vis) cv2.imshow(win, vis) # what is this supposed to do? Currently it's broken. if event & cv2.EVENT_RBUTTONDOWN: vis = vis0.copy() r = 8 m = (anorm(p1 - (x, y)) < r) | (anorm(p2 - (x, y)) < r) idxs = np.where(m)[0] kp1s, kp2s = [], [] for i in idxs: (x1, y1), (x2, y2) = p1[i], p2[i] col = (red, green)[status[i]] cv2.line(vis, (x1, y1), (x2, y2), col) kp1, kp2 = kp_pairs[i] kp1s.append(kp1) kp2s.append(kp2) vis = cv2.drawKeypoints(vis, kp1s, flags=4, color=kp_color) vis[:, w1:] = cv2.drawKeypoints(vis[:, w1:], kp2s, flags=4, color=kp_color) cv2.imshow(win, vis)
def onmouse(event, x, y, flags, param): cur_vis = vis if flags & cv2.EVENT_FLAG_LBUTTON: cur_vis = vis0.copy() r = 8 m = (anorm(np.array(p1) - (x, y)) < r) | (anorm(np.array(p2) - (x, y)) < r) idxs = np.where(m)[0] kp1s, kp2s = [], [] for i in idxs: (x1, y1), (x2, y2) = p1[i], p2[i] col = (red, green)[status[i]] cv2.line(cur_vis, (x1, y1), (x2, y2), col) kp1, kp2 = kp_pairs[i] kp1s.append(kp1) kp2s.append(kp2) cur_vis = cv2.drawKeypoints(cur_vis, kp1s, None, flags=4, color=kp_color) cur_vis[:,w1:] = cv2.drawKeypoints(cur_vis[:,w1:], kp2s, None, flags=4, color=kp_color) cv2.imshow(win, cur_vis) ''' b_channel, g_channel, r_channel = cv2.split(cur_vis) alpha_channel = np.ones((cur_vis.shape[0], cur_vis.shape[1]),dtype=np.uint8) #creating a dummy alpha channel image. alpha_channel.fill(255) img_RGBA = cv2.merge((b_channel, g_channel, r_channel, alpha_channel)) ''' send1.send('image', cur_vis)
def match(self, desc1, desc2): res = [] for i in xrange(len(desc1)): dist = anorm( desc2 - desc1[i] ) n1, n2 = dist.argsort()[:2] r = dist[n1] / dist[n2] res.append((i, n1, r)) return res
def onmouse(event, x, y, flags, param): cur_vis = vis if flags & cv.EVENT_FLAG_LBUTTON: cur_vis = vis0.copy() r = 8 m = (anorm(np.array(p1) - (x, y)) < r) | (anorm(np.array(p2) - (x, y)) < r) idxs = np.where(m)[0] kp1s, kp2s = [], [] for i in idxs: (x1, y1), (x2, y2) = p1[i], p2[i] col = (red, green)[status[i][0]] cv.line(cur_vis, (x1, y1), (x2, y2), col) kp1, kp2 = kp_pairs[i] kp1s.append(kp1) kp2s.append(kp2) cur_vis = cv.drawKeypoints(cur_vis, kp1s, None, flags = 4, color = kp_color) cur_vis[: , w1: ] = cv.drawKeypoints(cur_vis[: , w1: ], kp2s, None, flags = 4, color = kp_color) cv.imshow(win, cur_vis) cv.setMouseCallback(win, onmouse) return vis if __name__ == '__main__': print(__doc__) import sys, getopt opts, args = getopt.getopt(sys.argv[1: ], '', ['feature=']) opts = dict(opts) feature_name = opts.get('--feature', 'brisk') try: fn1, fn2 = args except: fn1 = '../data/box.png' fn2 = '../data/box_in_scene.png' img1 = cv.imread(fn1, 0) img2 = cv.imread(fn2, 0) detector, matcher = init_feature(feature_name) if img1 is None: print('Failed to load fn1:', fn1) sys.exit(1) if img2 is None: print('Failed to load fn2:', fn2) sys.exit(1) if detector is None: print('unknown feature:', feature_name) sys.exit(1) print('using', feature_name) kp1, desc1 = detector.detectAndCompute(img1, None) kp2, desc2 = detector.detectAndCompute(img2, None) print('img1 - %d features, img2 - %d features' % (len(kp1), len(kp2))) def match_and_draw(win): print('matching...') raw_matches = matcher.knnMatch(desc1, trainDescriptors = desc2, k = 2) #2 p1, p2, kp_pairs = filter_matches(kp1, kp2, raw_matches) if len(p1) >= 4: H, status = cv.findHomography(p1, p2, cv.RANSAC, 5.0) print('%d / %d inliers/matched' % (np.sum(status), len(status))) else : H, status = None, None print('%d matches found, not enough for homography estimation' % len(p1)) _vis = explore_match(win, img1, img2, kp_pairs, status, H) match_and_draw('find_obj') cv.waitKey()
def match(desc1, desc2, r_threshold = 0.75): res = [] for i in xrange(len(desc1)): dist = anorm( desc2 - desc1[i] ) n1, n2 = dist.argsort()[:2] r = dist[n1] / dist[n2] if r < r_threshold: res.append((i, n1)) return np.array(res)
def match_bruteforce(desc1, desc2, r_threshold = 0.75): res = [] for i in xrange(len(desc1)): dist = anorm( desc2 - desc1[i] ) n1, n2 = dist.argsort()[:2] r = dist[n1] / dist[n2] if r < r_threshold: res.append((i, n1)) return np.array(res)
def onmouse_wait(self, event, x, y, flags): if event == cv.CV_EVENT_LBUTTONDOWN: d = anorm(self.markers - (x, y)) if d.min() > 8: return self.drag_mark_idx = d.argmin() self.mouse_state = self.onmouse_drag if event == cv.CV_EVENT_RBUTTONDOWN: self.markers[:] = self.markers0 self.update()
def onmouse(event, x, y, flags, param): cur_vis = vis if flags & cv2.EVENT_FLAG_LBUTTON: cur_vis = vis0.copy() r = 8 m = (anorm(np.array(p1) - (x, y)) < r) | (anorm(np.array(p2) - (x, y)) < r) idxs = np.where(m)[0] kp1s, kp2s = [], [] for i in idxs: (x1, y1), (x2, y2) = p1[i], p2[i] col = (red, green)[status[i]] cv2.line(cur_vis, (x1, y1), (x2, y2), col) kp1, kp2 = kp_pairs[i] kp1s.append(kp1) kp2s.append(kp2) cur_vis = cv2.drawKeypoints(cur_vis, kp1s, None, flags=4, color=kp_color) cur_vis[:,w1:] = cv2.drawKeypoints(cur_vis[:,w1:], kp2s, None, flags=4, color=kp_color) cv2.imshow(win, cur_vis)
green = (0, 255, 0) red = (0, 0, 255) kp_color = (51, 103, 236) for (x1, y1), (x2, y2), inlier in zip(p1, p2, status): if inlier: col = green cv.circle(vis, (x1, y1), 2, col, -1) cv.circle(vis, (x2, y2), 2, col, -1) else : col = red r = 2 thickness = 3 cv.line(vis, (x1 - r, y1 - r), (x1 + r, y1 + r), col, thickness) cv.line(vis, (x1 - r, y1 + r), (x1 + r, y1 - r), col, thickness) cv.line(vis, (x2 - r, y2 - r), (x2 + r, y2 + r), col, thickness) cv.line(vis, (x2 - r, y2 + r), (x2 + r, y2 - r), col, thickness) vis0 = vis.copy() for (x1, y1), (x2, y2), inlier in zip(p1, p2, status): if inlier: cv.line(vis, (x1, y1), (x2, y2), green) cv.imshow(win, vis) def onmouse(event, x, y, flags, param): cur_vis = vis if flags & cv.EVENT_FLAG_LBUTTON: cur_vis = vis0.copy() r = 8 m = (anorm(np.array(p1) - (x, y)) < r) | (anorm(np.array(p2) - (x, y)) < r) idxs = np.where(m)[0] kp1s, kp2s = [], [] for i in idxs: (x1, y1), (x2, y2) = p1[i], p2[i] col = (red, green)[status[i][0]] cv.line(cur_vis, (x1, y1), (x2, y2), col) kp1, kp2 = kp_pairs[i] kp1s.append(kp1) kp2s.append(kp2) cur_vis = cv.drawKeypoints(cur_vis, kp1s, None, flags = 4, color = kp_color) cur_vis[: , w1: ] = cv.drawKeypoints(cur_vis[: , w1: ], kp2s, None, flags = 4, color = kp_color) cv.imshow(win, cur_vis) cv.setMouseCallback(win, onmouse) return vis if __name__ == '__main__': print(__doc__) import sys, getopt opts, args = getopt.getopt(sys.argv[1: ], '', ['feature=']) opts = dict(opts) feature_name = opts.get('--feature', 'brisk') try: fn1, fn2 = args except: fn1 = '../data/box.png' fn2 = '../data/box_in_scene.png'
cv.CvtColor(frame, gray, cv.CV_BGR2GRAY) tracks = [ [p] for p in detect(gray) ] pnum = [] while True: prev_gray = cv.CloneMat(gray) cv.CvtColor(frame, gray, cv.CV_BGR2GRAY) rs = random.rand(len(tracks)) tracks = [tr for tr, r in zip(tracks, rs) if len(tr) < life or r < 0.5] p0 = [tr[-1] for tr in tracks] p1 = track(prev_gray, gray, p0) p0r = track(gray, prev_gray, p1) good = (anorm(array(p0)-p0r) < 1.0) if len(p1) > 0: new_tracks = [] for tr, p, good_flag in zip(tracks, p1, good): if good_flag: tr.append(p) new_tracks.append(tr) tracks = new_tracks cv.Set(mask, 255) for x, y in int32(p1): cv.Circle(mask, (x, y), 5, 0, -1) tracks.extend( [ [p] for p in detect(gray, mask) ] ) vis = cv.CloneImage(frame)#gray2bgr(gray)