筛选图片,写JSON文件和复制
筛选图片,写JSON文件和复制
- 筛选图片,写JSON文件
- 筛选图片复制
筛选图片,写JSON文件
# coding: utf-8
from PIL import Image, ImageDraw, ImageFont
import os
import shutil
import cv2 as cv
import numpy as np
import jsondef zh_ch(string):return string.encode("gbk").decode('UTF-8', errors='ignore')def create_json(path):path_dict = {}path = path.split('\\')file_name = path[-1]return path_dict, file_namedef get_root(scr):scr = scr.split('\\')root_path = os.path.join(*scr[0:-1])file_name_1 = scr[-2]file_name_0 = scr[-1]return root_path, file_name_1, file_name_0def save_json(filename, dicts):filename = filename.replace(':', ':\\')with open(filename, 'w') as f:json_str = json.dumps(dicts)f.write(json_str)def image_add_text(img1, text, left, top, text_color, text_size):if isinstance(img1, np.ndarray):# 判断图片是否为ndarray格式,转为成PIL的格式的RGB图片image = Image.fromarray(cv.cvtColor(img1, cv.COLOR_BGR2RGB))draw = ImageDraw.Draw(image)# 创建一个可以在给定图像上绘图的对象font_style = ImageFont.truetype("font/simsun.ttc", text_size, encoding='utf-8')# 参数依次为 字体、字体大小、编码draw.text((left, top), text, text_color, font=font_style)# 参数依次为位置、文本、颜色、字体return cv.cvtColor(np.asarray(image), cv.COLOR_RGB2BGR)def redu(image, ratio):width = int(image.shape[1] * ratio)height = int(image.shape[0] * ratio)image = cv.resize(image, (width, height), interpolation=cv.INTER_AREA)return image
def bor_image(image, path, file_name):path = path.split('\\')if file_name[path[-1]] == 0:sen = '无缺陷'elif file_name[path[-1]] == 1:sen = '有缺陷'else:sen = '不确定'text = path[-1] + ' ' + sen +'\n上一张:w,下一张:s,退出:q\n无缺陷:Backspace,有缺陷:Enter,不确定:{'border_img = cv.copyMakeBorder(image, 70, 2, 2, 2, cv.BORDER_CONSTANT, value=[255, 255, 255])border_img = image_add_text(border_img, text, 0, 0, (255, 0, 0), 20)cv.imshow('image', border_img)def read_json(file_name):with open(file_name, 'rb') as f:data = json.load(f)return data
def press_key(path_lsit):# image = cv.imread(path, cv.IMREAD_GRAYSCALE)i = 0root_paths = []file_dict = {}while(0 <= i and i <= len(path_lsit)):print(path_lsit[i])if 'bmp' not in path_lsit[i]:i = i + 1continueroot_path, file_name_1, file_name_0 = get_root(path_lsit[i])print(root_path)if os.path.exists(os.path.join(root_path, 'kuaisu.json')):file_dict = read_json(os.path.join(root_path, 'kuaisu.json'))else:file_dict = {}image = cv.imdecode(np.fromfile(path_lsit[i], dtype=np.uint8), cv.IMREAD_COLOR) # 输入图片路径,当路径中有中文时需要采用该语句image = cv.transpose(image)print(file_dict)# 缩小图片image = redu(image, 0.55)if file_name_0 not in file_dict:file_dict[file_name_0] = 0 # 无缺陷print(file_dict)bor_image(image, path_lsit[i], file_dict)key = cv.waitKey(0)if key == 115:i = i + 1save_json(os.path.join(root_path, 'kuaisu.json'), file_dict)continueif key == 119:i = i - 1save_json(os.path.join(root_path, 'kuaisu.json'), file_dict)continueif key == 13 or key == 8 or key == 91:#enter/baskspace/{if key == 13:file_dict[file_name_0] = 1#有缺陷bor_image(image, path_lsit[i], file_dict)print(file_dict)elif key == 8:file_dict[file_name_0] = 0#无缺陷bor_image(image, path_lsit[i], file_dict)print(file_dict)else:file_dict[file_name_0] = 2#不确定bor_image(image, path_lsit[i], file_dict)print(file_dict)save_json(os.path.join(root_path, 'kuaisu.json'), file_dict)key = cv.waitKey(0)if key == 115:i = i + 1save_json(os.path.join(root_path, 'kuaisu.json'), file_dict)continueelif key == 119:i = i - 1save_json(os.path.join(root_path, 'kuaisu.json'), file_dict)continueif key == 113:save_json(os.path.join(root_path, 'kuaisu.json'), file_dict[file_name_1])cv.destroyAllWindows()breakif __name__ == '__main__':image_root_path = "E:\正在标注"path_list = []scr_path = []# save_path_name = 'H:ImageStore\\ti'for root, dirs, files in os.walk(image_root_path):for file in files:path = os.path.join(root, file)if 'bmp' in path:path_list.append(path)press_key(path_list)
筛选图片复制
# coding: utf-8
from PIL import Image, ImageDraw, ImageFont
import os
import shutil
import cv2 as cv
import numpy as np
import json# 保留无缺陷的图片def zh_ch(string):return string.encode("gbk").decode('UTF-8', errors='ignore')def create_json(path):path_dict = {}path = path.split('\\')file_name = path[-1]return path_dict, file_namedef get_root(scr):scr = scr.split('\\')root_path = os.path.join(*scr[0:-1])file_name_1 = scr[-2]file_name_0 = scr[-1]return root_path, file_name_1, file_name_0def save_json(filename, dicts):filename = filename.replace(':', ':\\')with open(filename, 'w') as f:json_str = json.dumps(dicts)f.write(json_str)def image_add_text(img1, text, left, top, text_color, text_size):if isinstance(img1, np.ndarray):# 判断图片是否为ndarray格式,转为成PIL的格式的RGB图片image = Image.fromarray(cv.cvtColor(img1, cv.COLOR_BGR2RGB))draw = ImageDraw.Draw(image)# 创建一个可以在给定图像上绘图的对象font_style = ImageFont.truetype("font/simsun.ttc", text_size, encoding='utf-8')# 参数依次为 字体、字体大小、编码draw.text((left, top), text, text_color, font=font_style)# 参数依次为位置、文本、颜色、字体return cv.cvtColor(np.asarray(image), cv.COLOR_RGB2BGR)def redu(image, ratio):width = int(image.shape[1] * ratio)height = int(image.shape[0] * ratio)image = cv.resize(image, (width, height), interpolation=cv.INTER_AREA)return image
def bor_image(image, path, file_name):path = path.split('\\')if file_name[path[-1]] == 0:sen = '无缺陷'elif file_name[path[-1]] == 1:sen = '有缺陷'else:sen = '不确定'text = path[-1] + ' ' + sen +'\n上一张:w,下一张:s,退出:q\n有缺陷:Enter'border_img = cv.copyMakeBorder(image, 70, 2, 2, 2, cv.BORDER_CONSTANT, value=[255, 255, 255])border_img = image_add_text(border_img, text, 0, 0, (255, 0, 0), 20)cv.imshow('image', border_img)def read_json(file_name):with open(file_name, 'rb') as f:data = json.load(f)return data
def press_key(path_lsit,save_path):# image = cv.imread(path, cv.IMREAD_GRAYSCALE)i = 0root_paths = []file_dict = {}while(0 <= i and i <= len(path_lsit)):print(path_lsit[i])if 'bmp' not in path_lsit[i]:i = i + 1continueroot_path, file_name_1, file_name_0 = get_root(path_lsit[i])print(root_path)if os.path.exists(os.path.join(root_path, 'kuaisu.json')):file_dict = read_json(os.path.join(root_path, 'kuaisu.json'))else:file_dict = {}image = cv.imdecode(np.fromfile(path_lsit[i], dtype=np.uint8), cv.IMREAD_COLOR) # 输入图片路径,当路径中有中文时需要采用该语句image = cv.transpose(image)print(file_dict)# 缩小图片image = redu(image, 0.55)if file_name_0 not in file_dict:file_dict[file_name_0] = 0 # 无缺陷print(file_dict)bor_image(image, path_lsit[i], file_dict)key = cv.waitKey(0)if key == 115:i = i + 1continueif key == 119:i = i - 1continueif key == 13 or key == 8 or key == 91:#enter/baskspace/{if key == 13:file_dict[file_name_0] = 1#有缺陷bor_image(image, path_lsit[i], file_dict)shutil.copy(path_lsit[i], save_path) # shutil.copy函数放入原文件的路径文件全名 然后放入目标文件夹key = cv.waitKey(0)if key == 32: # 空格#os.remove(save_path)my_list = path_lsit[i].split('\\')print(my_list[-1])os.remove(save_path+"\\"+my_list[-1])if key == 115:i = i + 1continueelif key == 119:i = i - 1continueif key == 113:cv.destroyAllWindows()breakif __name__ == '__main__':image_root_path = "D:\\Datasets\\defect2\\final9.4\\yes"path_list = []scr_path = []# save_path_name = 'H:ImageStore\\ti'for root, dirs, files in os.walk(image_root_path):for file in files:path = os.path.join(root, file)if 'bmp' in path:path_list.append(path)press_key(path_list,"E:\\Datasets\\defect2\\final9.4\\yes")相关文章:
筛选图片,写JSON文件和复制
筛选图片,写JSON文件和复制 筛选图片,写JSON文件筛选图片复制 筛选图片,写JSON文件 # coding: utf-8 from PIL import Image, ImageDraw, ImageFont import os import shutil import cv2 as cv import numpy as np import jsondef zh_ch(str…...
C++并发编程:构建线程安全队列(第二部分:细粒度锁)
C++并发编程:构建线程安全队列(第二部分:细粒度锁) 1. 引言 在多线程环境下,为了保证数据的一致性和正确性,需要使用同步原语来对共享数据的访问进行互斥和同步。std::queue作为一种先进先出(FIFO)的数据结构,它本身并不是线程安全的,同时访问它可能导致数据竞争和不一致的问…...
浅述C++内存管理——new与malloc的不同
前言 C相对于其他语言有一个重要的特点就是对于内存的管理,相比于C语言,C提供了新的关键字new来代替malloc的功能,其中有何不同,请看下文。 一、内存的构成 在我们日常编程过程中最常接触到的就是以下四个分区 以下将分别给出例…...
语言基础篇11——函数、函数参数类型、装饰器、生成器
函数 基本结构 def func_name(value):print(f"Hello {value}")return 0func_name("World")函数参数 参数默认值和五种参数类型 https://docs.python.org/3/glossary.html#term-parameter 参数默认值 带默认值的参数必须在参数列表右边 def func_nam…...
linux jar包class热部署 工具 arthas安装及使用
在不改变类、方法 的前提下,在方法中对业务逻辑做处理 或 打日志等情况下使用。 建议线上日志调试时使用: arthas安装 1. 下载文件 arthas-packaging-3.7.1-bin.zip https://arthas.aliyun.com 2. 服务器安装arthas 2.1 服务器指定目录下创建目录 c…...
Android studio 调整jar包顺序
第一步:编译jar包,放入lib路径下:如: 第二步:app 目录下build.gradle 中添加 compileOnly files(libs/classes.jar) 第三步:project目录下build.gradle 中添加 allprojects {gradle.projectsEvaluated {t…...
用Qt写的机器视觉绘图工具
一个用QtGraphicsView写的机器视觉绘图工具,支持直线查找,圆拟合,卡尺工具,圆环查找等。底部GraphicsScene可以实时显示相机图像,工具获取图像后通过算法处理图像。 Project是基于Qt的例程项目qdraw改的。...
Spring Boot 打包,将依赖全部打进去
一、背景 spring boot 2.4.4 项目,打包,将依赖全部打进去 二、在pom.xml中引入插件 在项目的 pom.xml 文件中,添加 Maven 插件 spring-boot-maven-plugin,示例如下: <build><plugins><!-- ...其他插件…...
SpringCloud入门实战(十五)分布式事务框架Seata简介
📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术…...
MySQL数据库 主从复制与读写分离
读写分离是什么 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 为什么要进行读写分离 因…...
Qt day2
目录 1.多态,虚函数,纯虚函数 1.多态性(Polymorphism): 2.虚函数(Virtual Function): 3.纯虚函数(Pure Virtual Function): 将引用作为函数参…...
JavaScript - 好玩的打字动画
效果预览: 🚀HTML版本 <!DOCTYPE html> <html> <head><title>打字动画示例</title><style>.typewriter {color: #000;overflow: hidden; /* 隐藏溢出的文本 */white-space: nowrap; /* 不换行 */border-right: .…...
rpm打包
文章目录 rpm打包 1. rpm打包步骤0)准备工作:安装打包工具rpm-build和rpmdevtools(1)在线安装(2)离线安装 1)创建初始化目录2)准备打包内容3)编写打包脚本 spec文件4&…...
匠心新品:大彩科技超薄7寸WIFI线控器发布,热泵、温控器、智能家电首选!
一、产品介绍 此次发布一款7寸高清全新外壳产品,让HMI人机界面家族再添一新成员。该产品相比其他外壳有以下5个大改动: 1 表面玻璃盖板使用2.5D立体结构; 2 液晶盖板采用一体黑设计,且液晶屏与触摸板是全贴合结构; …...
华为云云服务器评测|使用云耀云服务器L实例部署Portainer工具
华为云云服务器评测|使用云耀云服务器L实例部署Portainer工具 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点1.3 云耀云服务器L实例使用场景 二、本次实践介绍2.1 本次实践简介2.2 Portainer简介 三、购买云耀云服务器L实例3.1 登录…...
C++并发编程:构建线程安全队列(第一部分:粗粒度锁)
C并发编程:构建线程安全队列(第一部分:粗粒度锁) 引言 在多线程编程中,线程之间的数据共享和通信是一个非常重要的问题。在这篇博客中,我们将讨论如何用C实现一个基础但非常实用的线程安全队列。这个队列…...
C++设计模式-更新中
单例模式 这个类实现了单例模式。单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来获取该实例。 在 ConnectionManager 类中,它通过以下方式实现了单例模式: 构造函数 ConnectionManager() 被声明为…...
Hydra工具的使用
目录 Hydra初识 Hydra使用 hydra破解mysql 前言 不固定用户名密码爆破 hydra破解ssh 以用户名为密码登录 hydra破解rdp 将爆破密码的结果输出到文件中 Hydra初识 前言: hydra是一款开源的暴力破解工具,支持多种服务破解原理:使用户…...
Pytorch学习:卷积神经网络—nn.Conv2d、nn.MaxPool2d、nn.ReLU、nn.Linear和nn.Dropout
文章目录 1. torch.nn.Conv2d2. torch.nn.MaxPool2d3. torch.nn.ReLU4. torch.nn.Linear5. torch.nn.Dropout 卷积神经网络详解:csdn链接 其中包括对卷积操作中卷积核的计算、填充、步幅以及最大值池化的操作。 1. torch.nn.Conv2d 对由多个输入平面组成的输入信号…...
水果库存系统(SSM+Thymeleaf版)
不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。 文章目录 一、前言二、系统架构与需求分析1、技术栈1.1 后端1.2 前端 2、需求分析 三、设计…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
