def compute_target_size_from_aspect(chip_list, target_height=256): r""" Args: chip_list (list): target_height (int): Returns: ?: data CommandLine: python -m ibeis_cnn.ibsplugin --test-compute_target_size_from_aspect Example: >>> # DISABLE_DOCTEST >>> from ibeis_cnn.ibsplugin import * # NOQA >>> import ibeis >>> # build test data >>> ibs = ibeis.opendb('testdb1') >>> (aid1_list, aid2_list) = get_identify_training_aid_pairs(ibs) >>> # execute function >>> chip_list = ibs.get_annot_chips(ut.unique_ordered2(aid1_list + aid2_list)) >>> target_height = 256 >>> target_size = compute_target_size_from_aspect(chip_list, target_height) >>> # verify results >>> result = str(target_size) >>> print(result) (381, 256) """ import vtool as vt sizes1 = np.array([vt.get_size(chip1) for chip1 in chip_list]) ar1_list = sizes1.T[0] / sizes1.T[1] ave_ar = ar1_list.mean() target_size = (int(np.round(ave_ar * target_height)), target_height) return target_size
def dummy_preproc_chip(depc, annot_rowid_list, config=None): """ TODO: Infer properties from docstr? Args: depc (dtool.DependencyCache): annot_rowid_list (list): list of annot rowids config (dict): config dictionary Returns: tuple : ((int, int), ('extern', vt.imread)) """ if config is None: config = {} # Demonstates using asobject to get input to function as a dictionary # of properties #for annot in annot_list: #print('[preproc] Computing chips of aid=%r' % (aid,)) print('[preproc] Computing chips') for aid in annot_rowid_list: #aid = annot['aid'] #chip_fpath = annot['gpath'] chip_fpath = gpath_list[aid] #w, h = vt.image.open_image_size(chip_fpath) chip = vt.imread(chip_fpath) size = vt.get_size(chip) #size = (w, h) #print('* chip_fpath = %r' % (chip_fpath,)) #print('* size = %r' % (size,)) #yield size, chip_fpath yield size, chip
def dummy_preproc_chip(depc, annot_rowid_list, config=None): """ TODO: Infer properties from docstr? Args: depc (dtool.DependencyCache): annot_rowid_list (list): list of annot rowids config (dict): config dictionary Returns: tuple : ((int, int), ('extern', vt.imread)) """ if config is None: config = {} # Demonstates using asobject to get input to function as a dictionary # of properties #for annot in annot_list: #print('[preproc] Computing chips of aid=%r' % (aid,)) print('[preproc] Computing chips') for aid in annot_rowid_list: #aid = annot['aid'] #chip_fpath = annot['gpath'] chip_fpath = gpath_list[aid] #w, h = vt.image.open_image_size(chip_fpath) chip = vt.imread(chip_fpath) size = vt.get_size(chip) #size = (w, h) print('Dummpy preproc chip yeilds') print('* chip_fpath = %r' % (chip_fpath, )) print('* size = %r' % (size, )) #yield size, chip_fpath yield size, chip
def get_blended_chip(chip1, chip2, M): """ warps chip1 into chip2 space """ wh2 = vt.get_size(chip2) chip1_Mt = vt.warpHomog(chip1, M, wh2) chip2_blendM = vt.blend_images(chip1_Mt, chip2) return chip2_blendM
def dummy_manual_chipmask(depc, parent_rowids, config=None): import vtool as vt from plottool import interact_impaint mask_dpath = join(depc.cache_dpath, 'ManualChipMask') ut.ensuredir(mask_dpath) if config is None: config = {} print('Requesting user defined chip mask') for rowid in parent_rowids: img = vt.imread(gpath_list[rowid]) mask = interact_impaint.impaint_mask2(img) mask_fpath = join(mask_dpath, 'mask%d.png' % (rowid, )) vt.imwrite(mask_fpath, mask) w, h = vt.get_size(mask) yield (w, h), mask_fpath
def dummy_manual_chipmask(depc, parent_rowids, config=None): import vtool as vt from plottool import interact_impaint mask_dpath = ut.unixjoin(depc.cache_dpath, 'ManualChipMask') ut.ensuredir(mask_dpath) if config is None: config = {} print('Requesting user defined chip mask') for rowid in parent_rowids: img = vt.imread(gpath_list[rowid]) mask = interact_impaint.impaint_mask2(img) mask_fpath = ut.unixjoin(mask_dpath, 'mask%d.png' % (rowid,)) vt.imwrite(mask_fpath, mask) w, h = vt.get_size(mask) yield (w, h), mask_fpath
def makewarp(imgBGR): # hack a projection matrix using dummy homogrpahy imgBGRA = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2BGRA) imgBGRA[:, :, 3] = .87 * 255 # hack alpha imgBGRA = vt.pad_image(imgBGRA, 2, value=[0, 0, 255, 255]) size = np.array(vt.get_size(imgBGRA)) pts1 = np.array([(0, 0), (0, 1), (1, 1), (1, 0)]) * size x_adjust = .15 y_adjust = .5 pts2 = np.array([(x_adjust, 0), (0, 1 - y_adjust), (1, 1 - y_adjust), (1 - x_adjust, 0)]) * size H = cv2.findHomography(pts1, pts2)[0] dsize = np.array(vt.bbox_from_verts(pts2)[2:4]).astype(np.int) warpkw = dict(flags=cv2.INTER_LANCZOS4, borderMode=cv2.BORDER_CONSTANT) imgBGRA_warped = cv2.warpPerspective(imgBGRA, H, tuple(dsize), **warpkw) return imgBGRA_warped
def nosql_draw2(check_func, match): from matplotlib.backends.backend_agg import FigureCanvas try: from matplotlib.backends.backend_agg import Figure except ImportError: from matplotlib.figure import Figure was_interactive = mpl.is_interactive() if was_interactive: mpl.interactive(False) # fnum = 32 fig = Figure() canvas = FigureCanvas(fig) # NOQA # fig.clf() ax = fig.add_subplot(1, 1, 1) if check_func is not None and check_func(): return ax, xywh1, xywh2 = match.show(ax=ax) if check_func is not None and check_func(): return savekw = { # 'dpi' : 60, 'dpi': 80, } axes_extents = pt.extract_axes_extents(fig) # assert len(axes_extents) == 1, 'more than one axes' extent = axes_extents[0] with io.BytesIO() as stream: # This call takes 23% - 15% of the time depending on settings fig.savefig(stream, bbox_inches=extent, **savekw) stream.seek(0) data = np.fromstring(stream.getvalue(), dtype=np.uint8) if check_func is not None and check_func(): return pt.plt.close(fig) image = cv2.imdecode(data, 1) thumbsize = 221 max_dsize = (thumbsize, thumbsize) dsize, sx, sy = vt.resized_clamped_thumb_dims( vt.get_size(image), max_dsize) if check_func is not None and check_func(): return image = vt.resize(image, dsize) vt.imwrite(fpath, image) if check_func is not None and check_func(): return
def compute_tips(depc, chip_rowids, config=None): manual_extract = config['manual_extract'] chips = depc.get_native('chip', chip_rowids, 'img') for chip in chips: seed = (chip).sum() perb = ((seed % 1000) / 1000) * .25 w, h = vt.get_size(chip) if manual_extract: # Make noticable difference between config outputs lpb = np.ceil(w * perb) npb = np.ceil(h * perb) rpb = -np.ceil(w * perb) else: lpb = np.ceil(w * perb / 2) npb = -np.ceil(h * perb) rpb = -np.ceil(w * perb) wh = np.array([w, h], dtype=np.int32)[None, :] rel_base = np.array([[.0, .5], [.5, .5], [1., .5]]) offset = np.array([[lpb, 0], [0, npb], [rpb, 0]]) tip = np.round((wh * rel_base)) + offset left, notch, right = tip yield left, notch, right
def show_sv(chip1, chip2, kpts1, kpts2, fm, homog_tup=None, aff_tup=None, mx=None, show_assign=True, show_lines=True, show_kpts=True, show_aff=None, fnum=1, refine_method=None, **kwargs): """ Visualizes spatial verification CommandLine: python -m vtool.spatial_verification --test-spatially_verify_kpts --show """ import vtool as vt # import wbia.plottool as pt # GEt Matching chips kpts1_m = kpts1[fm.T[0]] kpts2_m = kpts2[fm.T[1]] wh2 = vt.get_size(chip2) # # Get Affine Chips, Keypoints, Inliers if show_aff is None: show_aff_ = aff_tup is not None else: show_aff_ = show_aff if show_aff_: (aff_inliers, Aff) = aff_tup chip1_At = vt.warpAffine(chip1, Aff, wh2) # kpts1_mAt = ktool.transform_kpts(kpts1_m, Aff) chip2_blendA = vt.blend_images(chip1_At, chip2) # # Get Homog Chips, Keypoints, Inliers show_homog = homog_tup is not None if show_homog: (hom_inliers, H) = homog_tup # kpts1_mHt = ktool.transform_kpts(kpts1_m, H) chip1_Ht = vt.warpHomog(chip1, H, wh2) chip2_blendH = vt.blend_images(chip1_Ht, chip2) # # Drawing settings nRows = (show_assign) + (show_aff_) + (show_homog) nCols1 = (show_assign) + (show_aff_) + (show_homog) nCols2 = 2 pnum1_ = df2.get_pnum_func(nRows, nCols1) pnum2_ = df2.get_pnum_func(nRows, nCols2) # in_kwargs = dict(rect=True, ell_alpha=.7, eig=False, ori=True, pts=True) # out_kwargs = dict(rect=False, ell_alpha=.3, eig=False) in_kwargs = dict(rect=False, ell_alpha=0.7, eig=False, ori=False, pts=False) out_kwargs = dict(rect=False, ell_alpha=0.7, eig=False, ori=False) def _draw_kpts(*args, **kwargs): if not show_kpts: return df2.draw_kpts2(*args, **kwargs) def draw_inlier_kpts(kpts_m, inliers, color, H=None): _draw_kpts(kpts_m[inliers], color=color, H=H, **in_kwargs) if mx is not None: _draw_kpts(kpts_m[mx:(mx + 1)], color=color, ell_linewidth=3, H=H, **in_kwargs) def _draw_matches(px, title, inliers): dmkwargs = dict( fs=None, title=title, all_kpts=False, draw_lines=True, docla=True, draw_border=True, fnum=fnum, pnum=pnum1_(px), colors=df2.ORANGE, ) __fm = np.vstack((inliers, inliers)).T df2.show_chipmatch2(chip1, chip2, kpts1_m, kpts2_m, __fm, **dmkwargs) return px + 1 from wbia.plottool import color_funcs colors = df2.distinct_colors(2, brightness=0.95) color1, color2 = colors[0], colors[1] color1_dark = color_funcs.darken_rgb(color1, 0.2) color2_dark = color_funcs.darken_rgb(color2, 0.2) def _draw_chip(px, title, chip, inliers, kpts1_m, kpts2_m, H1=None): if isinstance(px, tuple): pnum = px df2.imshow(chip, title=title, fnum=fnum, pnum=pnum) px = pnum[2] else: df2.imshow(chip, title=title, fnum=fnum, pnum=pnum2_(px)) if kpts1_m is not None: _draw_kpts(kpts1_m, color=color1_dark, H=H1, **out_kwargs) draw_inlier_kpts(kpts1_m, inliers, color1, H=H1) if kpts2_m is not None: _draw_kpts(kpts2_m, color=color2_dark, **out_kwargs) draw_inlier_kpts(kpts2_m, inliers, color2) if kpts2_m is not None and kpts1_m is not None and show_lines: __fm = np.vstack((inliers, inliers)).T df2.draw_lines2( kpts1_m, kpts2_m, __fm, color_list=[custom_constants.ORANGE], lw=2, line_alpha=1, H1=H1, ) return px + 1 # # Begin the drawing df2.figure(fnum=fnum, pnum=(nRows, nCols1, 1), docla=True, doclf=True) px = 0 if show_assign: # Draw the Assigned -> Affine -> Homography matches px = _draw_matches(px, '%d Assigned matches ' % len(fm), np.arange(len(fm))) if show_aff_: px = _draw_matches(px, '%d Initial inliers ' % len(aff_inliers), aff_inliers) if show_homog: if refine_method is None: refine_method = '' if len(refine_method) > 0: refine_method_ = '(%s) ' % (refine_method, ) else: refine_method_ = '' px = _draw_matches( px, '%d Refined %sinliers' % (len(hom_inliers), refine_method_), hom_inliers, ) # # Draw the Affine Transformations px = nCols2 * show_assign # if show_aff_ or show_homog: if show_aff_: # px = _draw_chip(px, 'Source', chip1, aff_inliers, kpts1_m, None) # px = _draw_chip(px, 'Dest', chip2, aff_inliers, None, kpts2_m) px = _draw_chip(px, 'Initial Warped', chip1_At, aff_inliers, kpts1_m, None, H1=Aff) px = _draw_chip(px, 'Initial Blend', chip2_blendA, aff_inliers, kpts1_m, kpts2_m, H1=Aff) # px = _draw_chip(px, 'Affine', chip1_At, aff_inliers, kpts1_mAt, None) # px = _draw_chip(px, 'Aff Blend', chip2_blendA, aff_inliers, kpts1_mAt, kpts2_m) pass # # Draw the Homography Transformation if show_homog: # px = _draw_chip(px, 'Source', chip1, hom_inliers, kpts1_m, None) # px = _draw_chip(px, 'Dest', chip2, hom_inliers, None, kpts2_m) # px = _draw_chip(px, 'Homog', chip1_Ht, hom_inliers, kpts1_mHt, None) # px = _draw_chip(px, 'Homog Blend', chip2_blendH, hom_inliers, kpts1_mHt, kpts2_m) px = _draw_chip(px, 'Refined Warped', chip1_Ht, hom_inliers, kpts1_m, None, H1=H) px = _draw_chip(px, 'Refined Blend', chip2_blendH, hom_inliers, kpts1_m, kpts2_m, H1=H)
def test_mser(): import cv2 import vtool as vt import plottool as pt import numpy as np pt.qt4ensure() class Keypoints(ut.NiceRepr): """ Convinence class for dealing with keypoints """ def __init__(self, kparr, info=None): self.kparr = kparr if info is None: info = {} self.info = info def add_info(self, key, val): self.info[key] = val def __nice__(self): return ' ' + str(len(self.kparr)) @property def scale(self): return vt.get_scales(self.kparr) @property def eccentricity(self): return vt.get_kpts_eccentricity(self.kparr) def compress(self, flags, inplace=False): subarr = self.kparr.compress(flags, axis=0) info = { key: ut.compress(val, flags) for key, val in self.info.items() } return Keypoints(subarr, info) img_fpath = ut.grab_test_imgpath( ut.get_argval('--fname', default='zebra.png')) imgBGR = vt.imread(img_fpath) imgGray = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2GRAY) # http://docs.opencv.org/master/d3/d28/classcv_1_1MSER.html#gsc.tab=0 # http://stackoverflow.com/questions/17647500/exact-meaning-of-the-parameters-given-to-initialize-mser-in-opencv-2-4-x factory = cv2.MSER_create img_area = np.product(np.array(vt.get_size(imgGray))) _max_area = (img_area // 10) _delta = 8 _min_diversity = .5 extractor = factory(_delta=_delta, _max_area=_max_area, _min_diversity=_min_diversity) # bboxes are x,y,w,h regions, bboxes = extractor.detectRegions(imgGray) # ellipse definition from [Fitzgibbon95] # http://www.bmva.org/bmvc/1995/bmvc-95-050.pdf p518 # ell = [c_x, c_y, R_x, R_y, theta] # (cx, cy) = conic center # Rx and Ry = conic radii # theta is the counterclockwise angle fitz_ellipses = [cv2.fitEllipse(mser) for mser in regions] # http://answers.opencv.org/question/19015/how-to-use-mser-in-python/ #hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions] #hull_ells = [cv2.fitEllipse(hull[:, 0]) for hull in hulls] invVR_mats = [] for ell in fitz_ellipses: ((cx, cy), (dx, dy), degrees) = ell theta = np.radians(degrees) # opencv lives in radians # Convert diameter to radians rx = dx / 2 ry = dy / 2 S = vt.scale_mat3x3(rx, ry) T = vt.translation_mat3x3(cx, cy) R = vt.rotation_mat3x3(theta) invVR = T.dot(R.dot(S)) invVR_mats.append(invVR) invVR_mats = np.array(invVR_mats) #_oris = vt.get_invVR_mats_oris(invVR_mats) kpts2_ = vt.flatten_invV_mats_to_kpts(invVR_mats) self = Keypoints(kpts2_) self.add_info('regions', regions) flags = (self.eccentricity < .9) #flags = self.scale < np.mean(self.scale) #flags = self.scale < np.median(self.scale) self = self.compress(flags) import plottool as pt #pt.interact_keypoints.ishow_keypoints(imgBGR, self.kparr, None, ell_alpha=.4, color='distinct', fnum=2) #import plottool as pt vis = imgBGR.copy() for region in self.info['regions']: vis[region.T[1], region.T[0], :] = 0 #regions, bbox = mser.detectRegions(gray) #hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in self.info['regions']] #cv2.polylines(vis, hulls, 1, (0, 255, 0)) #for region in self.info['regions']: # ell = cv2.fitEllipse(region) # cv2.ellipse(vis, ell, (255)) pt.interact_keypoints.ishow_keypoints(vis, self.kparr, None, ell_alpha=.4, color='distinct', fnum=2) #pt.imshow(vis, fnum=2) pt.update() #extractor = extract_factory['DAISY']() #desc_type_to_dtype = { # cv2.CV_8U: np.uint8, # cv2.CV_8s: np.uint, #} #def alloc_desc(extractor): # desc_type = extractor.descriptorType() # desc_size = extractor.descriptorSize() # dtype = desc_type_to_dtype[desc_type] # shape = (len(cv2_kpts), desc_size) # desc = np.empty(shape, dtype=dtype) # return desc #ut.search_module(cv2, 'array', recursive=True) #ut.search_module(cv2, 'freak', recursive=True) #ut.search_module(cv2, 'out', recursive=True) #cv2_kpts = cv2_kpts[0:2] #for key, factory in just_desc_factory_.items(): # extractor = factory() # desc = alloc_desc(extractor) # desc = extractor.compute(imgGray, cv2_kpts) # feats[key] = (desc,) # #extractor.compute(imgGray, cv2_kpts, desc) # pass #kpts = np.array(list(map(from_cv2_kpts, cv2_kpts))) #orb = cv2.ORB() #kp1, des1 = orb.detectAndCompute(imgGray, None) #blober = cv2.SimpleBlobDetector_create() #haris_kpts = cv2.cornerHarris(imgGray, 2, 3, 0.04) #[name for name in dir(cv2) if 'mat' in name.lower()] #[name for name in dir(cv2.xfeatures2d) if 'desc' in name.lower()] #[name for name in dir(cv2) if 'detect' in name.lower()] #[name for name in dir(cv2) if 'extract' in name.lower()] #[name for name in dir(cv2) if 'ellip' in name.lower()] #sift = cv2.xfeatures2d.SIFT_create() #cv2_kpts = sift.detect(imgGray) #desc = sift.compute(imgGray, cv2_kpts)[1] #freak = cv2.xfeatures2d.FREAK_create() #cv2_kpts = freak.detect(imgGray) #desc = freak.compute(imgGray, cv2_kpts)[1] pass
def compute_chip(depc, aids, config=None): for aid in aids: chip = fontdemo.get_text_test_img(str(aid)) size = vt.get_size(chip) yield size, chip
def test_mser(): import cv2 import vtool as vt import plottool as pt import numpy as np pt.qt4ensure() class Keypoints(ut.NiceRepr): """ Convinence class for dealing with keypoints """ def __init__(self, kparr, info=None): self.kparr = kparr if info is None: info = {} self.info = info def add_info(self, key, val): self.info[key] = val def __nice__(self): return ' ' + str(len(self.kparr)) @property def scale(self): return vt.get_scales(self.kparr) @property def eccentricity(self): return vt.get_kpts_eccentricity(self.kparr) def compress(self, flags, inplace=False): subarr = self.kparr.compress(flags, axis=0) info = {key: ut.compress(val, flags) for key, val in self.info.items()} return Keypoints(subarr, info) img_fpath = ut.grab_test_imgpath(ut.get_argval('--fname', default='zebra.png')) imgBGR = vt.imread(img_fpath) imgGray = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2GRAY) # http://docs.opencv.org/master/d3/d28/classcv_1_1MSER.html#gsc.tab=0 # http://stackoverflow.com/questions/17647500/exact-meaning-of-the-parameters-given-to-initialize-mser-in-opencv-2-4-x factory = cv2.MSER_create img_area = np.product(np.array(vt.get_size(imgGray))) _max_area = (img_area // 10) _delta = 8 _min_diversity = .5 extractor = factory(_delta=_delta, _max_area=_max_area, _min_diversity=_min_diversity) # bboxes are x,y,w,h regions, bboxes = extractor.detectRegions(imgGray) # ellipse definition from [Fitzgibbon95] # http://www.bmva.org/bmvc/1995/bmvc-95-050.pdf p518 # ell = [c_x, c_y, R_x, R_y, theta] # (cx, cy) = conic center # Rx and Ry = conic radii # theta is the counterclockwise angle fitz_ellipses = [cv2.fitEllipse(mser) for mser in regions] # http://answers.opencv.org/question/19015/how-to-use-mser-in-python/ #hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions] #hull_ells = [cv2.fitEllipse(hull[:, 0]) for hull in hulls] invVR_mats = [] for ell in fitz_ellipses: ((cx, cy), (dx, dy), degrees) = ell theta = np.radians(degrees) # opencv lives in radians # Convert diameter to radians rx = dx / 2 ry = dy / 2 S = vt.scale_mat3x3(rx, ry) T = vt.translation_mat3x3(cx, cy) R = vt.rotation_mat3x3(theta) invVR = T.dot(R.dot(S)) invVR_mats.append(invVR) invVR_mats = np.array(invVR_mats) #_oris = vt.get_invVR_mats_oris(invVR_mats) kpts2_ = vt.flatten_invV_mats_to_kpts(invVR_mats) self = Keypoints(kpts2_) self.add_info('regions', regions) flags = (self.eccentricity < .9) #flags = self.scale < np.mean(self.scale) #flags = self.scale < np.median(self.scale) self = self.compress(flags) import plottool as pt #pt.interact_keypoints.ishow_keypoints(imgBGR, self.kparr, None, ell_alpha=.4, color='distinct', fnum=2) #import plottool as pt vis = imgBGR.copy() for region in self.info['regions']: vis[region.T[1], region.T[0], :] = 0 #regions, bbox = mser.detectRegions(gray) #hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in self.info['regions']] #cv2.polylines(vis, hulls, 1, (0, 255, 0)) #for region in self.info['regions']: # ell = cv2.fitEllipse(region) # cv2.ellipse(vis, ell, (255)) pt.interact_keypoints.ishow_keypoints(vis, self.kparr, None, ell_alpha=.4, color='distinct', fnum=2) #pt.imshow(vis, fnum=2) pt.update() #extractor = extract_factory['DAISY']() #desc_type_to_dtype = { # cv2.CV_8U: np.uint8, # cv2.CV_8s: np.uint, #} #def alloc_desc(extractor): # desc_type = extractor.descriptorType() # desc_size = extractor.descriptorSize() # dtype = desc_type_to_dtype[desc_type] # shape = (len(cv2_kpts), desc_size) # desc = np.empty(shape, dtype=dtype) # return desc #ut.search_module(cv2, 'array', recursive=True) #ut.search_module(cv2, 'freak', recursive=True) #ut.search_module(cv2, 'out', recursive=True) #cv2_kpts = cv2_kpts[0:2] #for key, factory in just_desc_factory_.items(): # extractor = factory() # desc = alloc_desc(extractor) # desc = extractor.compute(imgGray, cv2_kpts) # feats[key] = (desc,) # #extractor.compute(imgGray, cv2_kpts, desc) # pass #kpts = np.array(list(map(from_cv2_kpts, cv2_kpts))) #orb = cv2.ORB() #kp1, des1 = orb.detectAndCompute(imgGray, None) #blober = cv2.SimpleBlobDetector_create() #haris_kpts = cv2.cornerHarris(imgGray, 2, 3, 0.04) #[name for name in dir(cv2) if 'mat' in name.lower()] #[name for name in dir(cv2.xfeatures2d) if 'desc' in name.lower()] #[name for name in dir(cv2) if 'detect' in name.lower()] #[name for name in dir(cv2) if 'extract' in name.lower()] #[name for name in dir(cv2) if 'ellip' in name.lower()] #sift = cv2.xfeatures2d.SIFT_create() #cv2_kpts = sift.detect(imgGray) #desc = sift.compute(imgGray, cv2_kpts)[1] #freak = cv2.xfeatures2d.FREAK_create() #cv2_kpts = freak.detect(imgGray) #desc = freak.compute(imgGray, cv2_kpts)[1] pass
def nosql_draw(check_func, rchip1_fpath, rchip2_fpath, kpts1, kpts2): # This gets executed in the child thread and does drawing async style #from matplotlib.backends.backend_pdf import FigureCanvasPdf as FigureCanvas #from matplotlib.backends.backend_pdf import Figure #from matplotlib.backends.backend_svg import FigureCanvas #from matplotlib.backends.backend_svg import Figure from matplotlib.backends.backend_agg import FigureCanvas try: from matplotlib.backends.backend_agg import Figure except ImportError: from matplotlib.figure import Figure kpts1_ = vt.offset_kpts(kpts1, (0, 0), (resize_factor, resize_factor)) kpts2_ = vt.offset_kpts(kpts2, (0, 0), (resize_factor, resize_factor)) #from matplotlib.figure import Figure if check_func is not None and check_func(): return rchip1 = vt.imread(rchip1_fpath) rchip1 = vt.resize_image_by_scale(rchip1, resize_factor) if check_func is not None and check_func(): return rchip2 = vt.imread(rchip2_fpath) rchip2 = vt.resize_image_by_scale(rchip2, resize_factor) if check_func is not None and check_func(): return try: idx = cm.daid2_idx[daid] fm = cm.fm_list[idx] fsv = None if cm.fsv_list is None else cm.fsv_list[idx] fs = None if fsv is None else fsv.prod(axis=1) except KeyError: fm = [] fs = None fsv = None maxnum = 200 if fs is not None and len(fs) > maxnum: # HACK TO ONLY SHOW TOP MATCHES sortx = fs.argsort()[::-1] fm = fm.take(sortx[:maxnum], axis=0) fs = fs.take(sortx[:maxnum], axis=0) was_interactive = mpl.is_interactive() if was_interactive: mpl.interactive(False) #fnum = 32 fig = Figure() canvas = FigureCanvas(fig) # NOQA #fig.clf() ax = fig.add_subplot(1, 1, 1) if check_func is not None and check_func(): return #fig = pt.plt.figure(fnum) #H1 = np.eye(3) #H2 = np.eye(3) #H1[0, 0] = .5 #H1[1, 1] = .5 #H2[0, 0] = .5 #H2[1, 1] = .5 ax, xywh1, xywh2 = pt.show_chipmatch2(rchip1, rchip2, kpts1_, kpts2_, fm, fs=fs, colorbar_=False, ax=ax) if check_func is not None and check_func(): return savekw = { # 'dpi' : 60, 'dpi' : 80, } axes_extents = pt.extract_axes_extents(fig) #assert len(axes_extents) == 1, 'more than one axes' extent = axes_extents[0] with io.BytesIO() as stream: # This call takes 23% - 15% of the time depending on settings fig.savefig(stream, bbox_inches=extent, **savekw) stream.seek(0) data = np.fromstring(stream.getvalue(), dtype=np.uint8) if check_func is not None and check_func(): return pt.plt.close(fig) image = cv2.imdecode(data, 1) thumbsize = 221 max_dsize = (thumbsize, thumbsize) dsize, sx, sy = vt.resized_clamped_thumb_dims(vt.get_size(image), max_dsize) if check_func is not None and check_func(): return image = vt.resize(image, dsize) vt.imwrite(fpath, image) if check_func is not None and check_func(): return
def netx_draw_images_at_positions(img_list, pos_list, size_list, color_list, framewidth_list): """ Overlays images on a networkx graph References: https://gist.github.com/shobhit/3236373 http://matplotlib.org/examples/pylab_examples/demo_annotation_box.html http://stackoverflow.com/questions/11487797/mpl-overlay-small-image http://matplotlib.org/api/text_api.html http://matplotlib.org/api/offsetbox_api.html TODO: look into DraggableAnnotation """ #print('[viz_graph] drawing %d images' % len(img_list)) # Thumb stackartist import plottool as pt #ax = pt.gca() # Ensure all images have been read img_list_ = [vt.convert_colorspace(vt.imread(img), 'RGB') if isinstance(img, six.string_types) else img for img in img_list] size_list_ = [vt.get_size(img) if size is None else size for size, img in zip(size_list, img_list)] as_offset_image = False if as_offset_image: offset_img_list = [] artist_list = [] # THIS DOES NOT DO WHAT I WANT # Scales the image with data coords from matplotlib.offsetbox import OffsetImage, AnnotationBbox bboxkw = dict( xycoords='data', boxcoords='offset points', #boxcoords='data', pad=0.25, # frameon=False, bboxprops=dict(fc="cyan"), # arrowprops=dict(arrowstyle="->")) ) for pos, img, framewidth in zip(pos_list, img_list_, framewidth_list): offset_img = OffsetImage(img, zoom=.4) bboxkw['frameon'] = framewidth > 0 artist = AnnotationBbox(offset_img, pos, xybox=(-0., 0.), **bboxkw) offset_img_list.append(offset_img) artist_list.append(artist) else: # THIS DOES EXACTLY WHAT I WANT # Ties the image to data coords #for pos, img, size, color, framewidth in zip(pos_list, img_list_, # size_list_, color_list, # framewidth_list): for pos, img, size in zip(pos_list, img_list_, size_list_): bbox = vt.bbox_from_center_wh(pos, size) extent = vt.extent_from_bbox(bbox) pt.plt.imshow(img, extent=extent) imgdat = { #'offset_img_list': offset_img_list, #'artist_list': artist_list, } return imgdat
def show_name_matches( ibs, qaid, name_daid_list, name_fm_list, name_fs_list, name_H1_list, name_featflag_list, qreq_=None, **kwargs ): """ Called from chip_match.py Args: ibs (IBEISController): wbia controller object qaid (int): query annotation id name_daid_list (list): name_fm_list (list): name_fs_list (list): name_H1_list (list): name_featflag_list (list): qreq_ (QueryRequest): query request object with hyper-parameters(default = None) Kwargs: draw_fmatches, name_rank, fnum, pnum, colorbar_, nonvote_mode, fastmode, show_matches, fs, fm_norm, lbl1, lbl2, rect, draw_border, cmap, H1, H2, scale_factor1, scale_factor2, draw_pts, draw_ell, draw_lines, show_nMatches, all_kpts, in_image, show_query, draw_lbl, name_annot_scores, score, rawscore, aid2_raw_rank, show_name, show_nid, show_aid, show_annot_score, show_truth, name_score, show_name_score, show_name_rank, show_timedelta CommandLine: python -m wbia.viz.viz_matches --exec-show_name_matches python -m wbia.viz.viz_matches --test-show_name_matches --show Example: >>> # DISABLE_DOCTEST >>> from wbia.viz.viz_matches import * # NOQA >>> from wbia.algo.hots import chip_match >>> from wbia.algo.hots import name_scoring >>> import vtool as vt >>> from wbia.algo.hots import _pipeline_helpers as plh # NOQA >>> import numpy as np >>> func = chip_match.ChipMatch.show_single_namematch >>> sourcecode = ut.get_func_sourcecode(func, stripdef=True, stripret=True, >>> strip_docstr=True) >>> setup = ut.regex_replace('viz_matches.show_name_matches', '#', sourcecode) >>> homog = False >>> print(ut.indent(setup, '>>> ')) >>> ibs, qreq_, cm_list = plh.testdata_post_sver('PZ_MTEST', qaid_list=[1]) >>> cm = cm_list[0] >>> cm.score_name_nsum(qreq_) >>> dnid = ibs.get_annot_nids(cm.qaid) >>> # +--- COPIED SECTION >>> locals_ = locals() >>> var_list = ut.exec_func_src( >>> func, locals_=locals_, >>> sentinal='name_annot_scores = cm.annot_score_list.take(sorted_groupxs') >>> exec(ut.execstr_dict(var_list)) >>> # L___ COPIED SECTION >>> kwargs = {} >>> show_name_matches(ibs, qaid, name_daid_list, name_fm_list, >>> name_fs_list, name_h1_list, name_featflag_list, >>> qreq_=qreq_, **kwargs) >>> ut.quit_if_noshow() >>> ut.show_if_requested() """ # logger.info("SHOW NAME MATCHES") # logger.info(ut.repr2(kwargs, nl=True)) # from wbia import constants as const from wbia import tag_funcs draw_fmatches = kwargs.pop('draw_fmatches', True) rchip1, kpts1 = get_query_annot_pair_info(ibs, qaid, qreq_, draw_fmatches) rchip2_list, kpts2_list = get_data_annot_pair_info( ibs, name_daid_list, qreq_, draw_fmatches ) heatmask = kwargs.pop('heatmask', False) if heatmask: from vtool.coverage_kpts import make_kpts_heatmask import numpy as np import vtool as vt wh1 = vt.get_size(rchip1) fx1 = np.unique(np.hstack([fm.T[0] for fm in name_fm_list])) heatmask1 = make_kpts_heatmask(kpts1[fx1], wh1) rchip1 = vt.overlay_alpha_images(heatmask1, rchip1) # Hack cast back to uint8 rchip1 = (rchip1 * 255).astype(np.uint8) rchip2_list_ = rchip2_list rchip2_list = [] for rchip2, kpts2, fm in zip(rchip2_list_, kpts2_list, name_fm_list): fx2 = fm.T[1] wh2 = vt.get_size(rchip2) heatmask2 = make_kpts_heatmask(kpts2[fx2], wh2) rchip2 = vt.overlay_alpha_images(heatmask2, rchip2) # Hack cast back to uint8 rchip2 = (rchip2 * 255).astype(np.uint8) rchip2_list.append(rchip2) # fm_list = name_fm_list fs_list = name_fs_list featflag_list = name_featflag_list offset_list, sf_list, bbox_list = show_multichip_match( rchip1, rchip2_list, kpts1, kpts2_list, fm_list, fs_list, featflag_list, **kwargs ) aid_list = [qaid] + name_daid_list annotate_matches3( ibs, aid_list, bbox_list, offset_list, name_fm_list, name_fs_list, qreq_=None, **kwargs ) ax = pt.gca() title = vh.get_query_text(ibs, None, name_daid_list, False, qaid=qaid, **kwargs) pt.set_title(title, ax) # Case tags annotmatch_rowid_list = ibs.get_annotmatch_rowid_from_superkey( [qaid] * len(name_daid_list), name_daid_list ) annotmatch_rowid_list = ut.filter_Nones(annotmatch_rowid_list) tags_list = ibs.get_annotmatch_case_tags(annotmatch_rowid_list) if not ut.get_argflag('--show'): # False: tags_list = tag_funcs.consolodate_annotmatch_tags(tags_list) tag_list = ut.unique_ordered(ut.flatten(tags_list)) name_rank = kwargs.get('name_rank', None) truth = get_multitruth(ibs, aid_list) xlabel = {1: 'Correct ID', 0: 'Incorrect ID', 2: 'Unknown ID'}[truth] if False: if name_rank is None: xlabel = {1: 'Genuine', 0: 'Imposter', 2: 'Unknown'}[truth] # xlabel = {1: 'True', 0: 'False', 2: 'Unknown'}[truth] else: if name_rank == 0: xlabel = {1: 'True Positive', 0: 'False Positive', 2: 'Unknown'}[truth] else: xlabel = {1: 'False Negative', 0: 'True Negative', 2: 'Unknown'}[truth] if len(tag_list) > 0: xlabel += '\n' + ', '.join(tag_list) noshow_truth = ut.get_argflag('--noshow_truth') if not noshow_truth: pt.set_xlabel(xlabel) return ax
def show_sv(chip1, chip2, kpts1, kpts2, fm, homog_tup=None, aff_tup=None, mx=None, show_assign=True, show_lines=True, show_kpts=True, show_aff=None, fnum=1, refine_method=None, **kwargs): """ Visualizes spatial verification CommandLine: python -m vtool.spatial_verification --test-spatially_verify_kpts --show """ #import plottool as pt # GEt Matching chips kpts1_m = kpts1[fm.T[0]] kpts2_m = kpts2[fm.T[1]] wh2 = vt.get_size(chip2) # # Get Affine Chips, Keypoints, Inliers if show_aff is None: show_aff_ = aff_tup is not None else: show_aff_ = show_aff if show_aff_: (aff_inliers, Aff) = aff_tup chip1_At = vt.warpAffine(chip1, Aff, wh2) #kpts1_mAt = ktool.transform_kpts(kpts1_m, Aff) chip2_blendA = vt.blend_images(chip1_At, chip2) # # Get Homog Chips, Keypoints, Inliers show_homog = homog_tup is not None if show_homog: (hom_inliers, H) = homog_tup #kpts1_mHt = ktool.transform_kpts(kpts1_m, H) chip1_Ht = vt.warpHomog(chip1, H, wh2) chip2_blendH = vt.blend_images(chip1_Ht, chip2) # # Drawing settings nRows = (show_assign) + (show_aff_) + (show_homog) nCols1 = (show_assign) + (show_aff_) + (show_homog) nCols2 = 2 pnum1_ = df2.get_pnum_func(nRows, nCols1) pnum2_ = df2.get_pnum_func(nRows, nCols2) #in_kwargs = dict(rect=True, ell_alpha=.7, eig=False, ori=True, pts=True) #out_kwargs = dict(rect=False, ell_alpha=.3, eig=False) in_kwargs = dict(rect=False, ell_alpha=.7, eig=False, ori=False, pts=False) out_kwargs = dict(rect=False, ell_alpha=.7, eig=False, ori=False) def _draw_kpts(*args, **kwargs): if not show_kpts: return df2.draw_kpts2(*args, **kwargs) def draw_inlier_kpts(kpts_m, inliers, color, H=None): _draw_kpts(kpts_m[inliers], color=color, H=H, **in_kwargs) if mx is not None: _draw_kpts(kpts_m[mx:(mx + 1)], color=color, ell_linewidth=3, H=H, **in_kwargs) def _draw_matches(px, title, inliers): dmkwargs = dict(fs=None, title=title, all_kpts=False, draw_lines=True, docla=True, draw_border=True, fnum=fnum, pnum=pnum1_(px), colors=df2.ORANGE) __fm = np.vstack((inliers, inliers)).T df2.show_chipmatch2(chip1, chip2, kpts1_m, kpts2_m, __fm, **dmkwargs) return px + 1 from plottool import color_funcs colors = df2.distinct_colors(2, brightness=.95) color1, color2 = colors[0], colors[1] color1_dark = color_funcs.darken_rgb(color1, .2) color2_dark = color_funcs.darken_rgb(color2, .2) def _draw_chip(px, title, chip, inliers, kpts1_m, kpts2_m, H1=None): if isinstance(px, tuple): pnum = px df2.imshow(chip, title=title, fnum=fnum, pnum=pnum) px = pnum[2] else: df2.imshow(chip, title=title, fnum=fnum, pnum=pnum2_(px)) if kpts1_m is not None: _draw_kpts(kpts1_m, color=color1_dark, H=H1, **out_kwargs) draw_inlier_kpts(kpts1_m, inliers, color1, H=H1) if kpts2_m is not None: _draw_kpts(kpts2_m, color=color2_dark, **out_kwargs) draw_inlier_kpts(kpts2_m, inliers, color2) if kpts2_m is not None and kpts1_m is not None and show_lines: __fm = np.vstack((inliers, inliers)).T df2.draw_lines2(kpts1_m, kpts2_m, __fm, color_list=[custom_constants.ORANGE], lw=2, line_alpha=1, H1=H1) return px + 1 # # Begin the drawing df2.figure(fnum=fnum, pnum=(nRows, nCols1, 1), docla=True, doclf=True) px = 0 if show_assign: # Draw the Assigned -> Affine -> Homography matches px = _draw_matches(px, '%d Assigned matches ' % len(fm), np.arange(len(fm))) if show_aff_: px = _draw_matches(px, '%d Initial inliers ' % len(aff_inliers), aff_inliers) if show_homog: if refine_method is None: refine_method = '' if len(refine_method) > 0: refine_method_ = '(%s) ' % (refine_method,) else: refine_method_ = '' px = _draw_matches( px, '%d Refined %sinliers' % (len(hom_inliers), refine_method_), hom_inliers) # # Draw the Affine Transformations px = nCols2 * show_assign #if show_aff_ or show_homog: if show_aff_: #px = _draw_chip(px, 'Source', chip1, aff_inliers, kpts1_m, None) #px = _draw_chip(px, 'Dest', chip2, aff_inliers, None, kpts2_m) px = _draw_chip(px, 'Initial Warped', chip1_At, aff_inliers, kpts1_m, None, H1=Aff) px = _draw_chip(px, 'Initial Blend', chip2_blendA, aff_inliers, kpts1_m, kpts2_m, H1=Aff) #px = _draw_chip(px, 'Affine', chip1_At, aff_inliers, kpts1_mAt, None) #px = _draw_chip(px, 'Aff Blend', chip2_blendA, aff_inliers, kpts1_mAt, kpts2_m) pass # # Draw the Homography Transformation if show_homog: #px = _draw_chip(px, 'Source', chip1, hom_inliers, kpts1_m, None) #px = _draw_chip(px, 'Dest', chip2, hom_inliers, None, kpts2_m) #px = _draw_chip(px, 'Homog', chip1_Ht, hom_inliers, kpts1_mHt, None) #px = _draw_chip(px, 'Homog Blend', chip2_blendH, hom_inliers, kpts1_mHt, kpts2_m) px = _draw_chip(px, 'Refined Warped', chip1_Ht, hom_inliers, kpts1_m, None, H1=H) px = _draw_chip(px, 'Refined Blend', chip2_blendH, hom_inliers, kpts1_m, kpts2_m, H1=H)