def update_loclabel_img(self, loclabel, img, *, if_exists='update'): """ 添加一张图片数据 :param if_exists: update,更新 skip,跳过,不更新 """ loc, label = os.path.split(loclabel) h, w = img.shape[:2] # 1 如果loc图片不存在,则新建一个jpg图片 update = True if loc not in self.data or not self.data[loc]: imfile = xlcv.write(img, File(loc, self.root, suffix='.jpg')) self.imfiles[loc] = imfile shape = LabelmeDict.gen_shape(label, [[0, 0], [w, h]]) self.data[loc][label] = self.parse_shape(shape) # 2 不存在的标签,则在最后一行新建一张图 elif label not in self.data[loc]: image = xlcv.read(self.imfiles[loc]) height, width = image.shape[:2] assert width == w # 先按行拼接,以后有时间可以扩展更灵活的拼接操作 # 拼接,并重新存储为图片 image = np.concatenate([image, img]) xlcv.write(image, self.imfiles[loc]) shape = LabelmeDict.gen_shape(label, [[0, height], [width, height + h]]) self.data[loc][label] = self.parse_shape(shape) # 3 已有的图,则进行替换 elif if_exists == 'update': image = xlcv.read(self.imfiles[loc]) [x1, y1, x2, y2] = self.data[loc][label]['ltrb'] image[y1:y2, x1:x2] = img xlcv.write(image, self.imfiles[loc]) else: update = False if update: # 需要实时保存到文件中 self.write(loc)
def __init__(self, winname=None, *, imgproc=None, img=None, flags=1, verbose=0, delay=100): """ Args: winname: 窗口名可以不输入,可以从func获取,或者有默认窗口名 imgproc: 有时候明确要对指定的函数进行可视化分析 img: 图片可以不输入,可以内置一个图片 flags: 0 窗口可以调节大小,1 窗口按照图片大小固定 verbose: 0 静默模式,1 显示每次运行时间,2 显示每次运行时间及参数值 delay: 有时候改动滑动条,并不想立即生效,可以设置延时,这里单位是ms 即如果delay时间段内已经有执行过回调函数,会避免重复执行 """ if winname is None: if imgproc: winname = imgproc.__name__ else: winname = 'TrackbarTool' if img is None: img = np.zeros([500, 100, 3], dtype='uint8') else: img = xlcv.read(img) self.winname = winname self.img = img cv2.namedWindow(winname, flags) cv2.imshow(winname, self.img) self.imgproc = imgproc self.trackbar_names = {} self.verbose = verbose self.delay = delay self.last_run_time = 0
def get_img_buffer(cls, in_, *, rgba2rgb=False): """ 获取in_代表的图片的二进制数据 :param in_: 可以是本地文件,也可以是图片url地址,也可以是Image对象 注意这个函数,输入是url,也会获取重置图片数据上传 如果为了效率明确只传url,可以用aip.AipOcr原生的相关url函数 :return: 返回图片文件二进制值的buffer """ # 1 取不同来源的数据 if is_url(in_): im = xlcv.read_from_url(in_) else: im = xlcv.read(in_) # 2 特定的格式转换 if rgba2rgb: im = cv2.cvtColor(im, cv2.COLOR_BGRA2BGR) buffer = xlcv.to_buffer(im) return buffer
def test_adaptiveThreshold(img=None): """ 滑动条工具使用方法的示例 """ # 1 图片可以传入路径,这里做一个随机图片 if img is None: img = np.random.randint(0, 255, [500, 200], dtype='uint8') else: img = xlcv.read(img, 0) # 确保是单通道灰度图 # 2 指定要分析的函数 t = TrackbarTool(imgproc=cv2.adaptiveThreshold, img=img, verbose=2, delay=100) t.create_trackbar('maxValue', 255, 255) # 添加滑动条:名称,最大值,默认值 # 创建滑动条过程中,可能会报错,因为参数还不全,指定的imgproc还无法运行,可以先不用管 t.create_trackbar('adaptiveMethod', 10, 0) t.create_trackbar('thresholdType', 10, 1) t.create_trackbar('blockSize', 100, 11) t.create_trackbar('C', 20, 3) # t.imshow(img2) # 临时显式其他图片处理效果。如果需要持久修改,可以更改self.img的值 cv2.waitKey()
def __init__(self, root): """ data:dict key: 相对路径/图片stem (这一节称为loc) label名称:对应属性dict1 (跟loc拼在一起,称为loclabel) label2:dict2 """ self.root = Dir(root) self.data = defaultdict(dict) self.imfiles = {} for file in self.root.select_files('**/*.json'): lmdict = file.read() imfile = file.with_name(lmdict['imagePath']) img = xlcv.read(imfile) loc = file.relpath(self.root).replace('\\', '/')[:-5] self.imfiles[loc] = imfile for shape in lmdict['shapes']: attrs = self.parse_shape(shape, img) self.data[loc][attrs['label']] = attrs