图像动态裁剪
1. 背景
以两级级联模型为例,第一级目标检测模型用于检测人员,第二级目标检测模型用于检测手机、对讲机等。然后实际数据采集过程中,手机、对讲机这些设备并不在人员的一级检测框内,使得二级模型训练的样本较少。
二级目标检测模型训练阶段,在数据采样时不能仅仅只将一级目标检测框裁剪得到的图像作为输入,还需要动态的裁剪原图,使得手机、对讲机这些设备包含进来,减少背景的干扰。
上面三幅图分别是原图、一级目标检测框区域、训练时想要的目标区域(需要将其他的手机也要揽括进来)。
基本思路:基于opencv的鼠标事件,对显示的原图画矩形框得到感兴趣区域,并将其保存下来。
2. OpenCV鼠标事件
2.1 设置鼠标事件
setMouseCallback(const String & winname, #要设置鼠标事件的窗口名MouseCallback onMouse, #回调函数,当指定窗口产生鼠标事件时,调用的函数名void* userdata = 0) #传递给回调函数的可选参数
2.2 回调函数原型
void MouseCallback(int event, #鼠标基础事件int x, int y, #鼠标在x轴y轴方向上的坐标值,窗口左上角为原点(0,0)int flags, #flags的值代表鼠标拖拽事件和Ctrl、Shift、Alt按键事件的代号void *userdata) #用户数据
2.3 鼠标事件
2.3.1 event基本事件
这个对应对调函数的第一个参数event,当鼠标执行相应的动作,event会变成相应的值。
enum
{CV_EVENT_MOUSEMOVE =0, //鼠标移动CV_EVENT_LBUTTONDOWN =1, //按下左键CV_EVENT_RBUTTONDOWN =2, //按下右键CV_EVENT_MBUTTONDOWN =3, //按下中键CV_EVENT_LBUTTONUP =4, //放开左键CV_EVENT_RBUTTONUP =5, //放开右键CV_EVENT_MBUTTONUP =6, //放开中键CV_EVENT_LBUTTONDBLCLK =7, //左键双击CV_EVENT_RBUTTONDBLCLK =8, //右键双击CV_EVENT_MBUTTONDBLCLK =9, //中键双击CV_EVENT_MOUSEWHEEL =10, //滚轮滚动CV_EVENT_MOUSEHWHEEL =11 //横向滚轮滚动
};
2.3.2 flag拖拽事件
这个对应回调函数的第四个参数,当存在鼠标拖拽或者于CTRL、shift、ALT相结合拖拽时,flag变成对应的值。
enum
{CV_EVENT_FLAG_LBUTTON =1, //左键拖拽CV_EVENT_FLAG_RBUTTON =2, //右键拖拽CV_EVENT_FLAG_MBUTTON =4, //中键拖拽CV_EVENT_FLAG_CTRLKEY =8, //按住CTRL拖拽CV_EVENT_FLAG_SHIFTKEY =16, //按住Shift拖拽CV_EVENT_FLAG_ALTKEY =32 //按住ALT拖拽
};
在这里插入代码片
3. 动态裁剪图像
具体的实现代码如下:
import cv2
import osROOT = "data7" # 原图路径img_cnt = 0def mouse_callback(event, x, y, flags, param):global img_data, point1, point2,g_rect, img_cntimg2 = img_data.copy()if event == cv2.EVENT_LBUTTONDOWN: # 左键点击,则在原图打点print("1-EVENT_LBUTTONDOWN")point1 = (x, y)cv2.circle(img2, point1, 10, (0, 255, 0), 5)cv2.imshow('image', img2)elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON): # 按住左键拖曳,画框print("2-EVENT_FLAG_LBUTTON")cv2.rectangle(img2, point1, (x, y), (255, 0, 0), thickness=2)cv2.imshow('image', img2)elif event == cv2.EVENT_LBUTTONUP: # 左键释放,显示print("3-EVENT_LBUTTONUP")point2 = (x, y)cv2.rectangle(img2, point1, point2, (0, 0, 255), thickness=2)cv2.imshow('image', img2)if point1!=point2:min_x = int(min(point1[0], point2[0]))min_y = int(min(point1[1], point2[1]))width = int(abs(point1[0] - point2[0]))height = int(abs(point1[1] - point2[1]))g_rect=[min_x,min_y,width,height]cut_img = img_data[min_y:min_y + height, min_x:min_x + width] # 从原图上裁剪cv2.imwrite("crop_img_{}.jpg".format(img_cnt), cut_img) # 图像文件保存print("save image.")img_cnt += 1if __name__ == "__main__":img_lists = os.listdir(ROOT)cv2.namedWindow("image")cv2.setMouseCallback("image", mouse_callback)for img in img_lists:img_path = os.path.join(ROOT, img)if os.path.exists(img_path):print("file existed.")img_data = cv2.imread(img_path)cv2.imshow("image", img_data)k = cv2.waitKey(0)if k == ord('q'):breakcv2.destroyAllWindows()
大致的步骤如下:
- 新建窗口,设置回调函数;
- 读取并显示原始图像数据;
- 捕获左键点击、左键拖拽、左键释放的鼠标事件,进行区域目标框绘制;
- 并将区域目标保存下来;
4. 总结
本文主要介绍了针对两级模型级联情况下,二级目标检测算法训练时样本少时一种解决方案,通过上述脚本可以可视化人为的裁剪区域并保存增加训练样本,减少背景干扰。
相关文章:

图像动态裁剪
1. 背景 以两级级联模型为例,第一级目标检测模型用于检测人员,第二级目标检测模型用于检测手机、对讲机等。然后实际数据采集过程中,手机、对讲机这些设备并不在人员的一级检测框内,使得二级模型训练的样本较少。 二级目标检测模…...

Thematica: 炫彩主题与黑暗奇观的Vue3之旅
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、介绍1.1 博客主题和目的1.2 Vue 3简介二、炫彩主题2.1 准备工作2.2 安装必要依赖2.3 创建Vue项目2.4 设置全局样式...

平凡的Python为什么能一跃成为世界排名第一的语言
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 作者:大周|慕课网讲师 一、前言 本文将结合个人经历为各位同学客观的分析是否有学习Python的必要、Python适合谁学、为什么…...

Wijmo 2023 v1 Crack
改进了 FlexGrid,支持 React 18 严格模式和可访问性。 5月 15, 2023 - 10:51 新版本 特征 改进了对 React 18 的支持 - 添加了对 React 18 严格模式的支持,可帮助开发人员在开发过程中查找常见错误。辅助功能改进 - 以下是此版本中…...
万物互联时代的边缘计算安全需求与挑战
随着物联网技术的快速发展,越来越多的设备和应用程序开始互联,这不仅提高了我们的生活质量,也带来了很多新的安全威胁。边缘计算作为连接数据和应用程序的关键环节,在万物互联的时代变得尤为重要。本文将讨论万物互联背景下的边缘…...
函数序列与函数项级数
文章目录 函数序列与函数项级数函数序列函数项级数Weierstrass M 判别法 函数序列与函数项级数 函数序列 点态收敛:设 f n ( x ) : [ a , b ] → R f_n(x):\,[a,\,b]\to\bold{R} fn(x):[a,b]→R 是定义在区间 [ a , b ] [a,\,b] [a,b] 上的函数序列࿱…...

UML时序图详解
上篇文章,介绍了UML状态图,并通过visio绘制一个全自动洗衣机的UML状态图实例进行讲解。 本篇,来继续介绍UML中的另一种图——时序图。 1 时序图简介 时序图(Sequence Diagram),也叫顺序图,或序列图,是一…...

Centos7.6部署postgresql15主从
目录 安装pg15(master和standby)主数据库配置(master)初始化数据库创建归档日志目录设置数据库访问权限修改数据库配置文件开启数据库 从数据库配置(standby)同步主库的数据文件创建文件standby.signal启动从数据库 主从状态验证master上验证standby上验…...

【ThinkPHP6系列学习-2】多应用模式配置
这里写一写TP6下配置多应用。因为TP6和TP5有所差异,TP6默认是单应用模式(单模块),而我们实际项目中往往是多应用的(多个模块),所以在利用TP6是就需要进行配置,开启多应用模式。 目录…...

Linux内核oops panic简析
源码基于:Linux 5.4 0. 前言 内核异常的级别大致分为三个:BUG、oops、panic。 BUG 是指那些不符合内核的正常设计,但内核能够检测出来并且对系统运行不会产生影响的问题,比如在原子上下文中休眠,在内核中用 BUG 标识。…...

Spark大数据处理讲课笔记4.8 Spark SQL典型案例
文章目录 零、本讲学习目标一、使用Spark SQL实现词频统计(一)数据源 - words.txt(二)创建Maven项目(三)添加依赖和构建插件(四)修改源目录名称(五)创建日志属…...

WhatsApp Business 多人使用终极指南
今时今日,几乎每个人的手机上都安装了 WhatsApp,不少电商更会依赖 WhatsApp作为和客户沟通的主要渠道。但对有一定规模的店铺来说,WhatsApp绑定一个号码和设备的设定实在很不方便。如何才能用WhatsApp Business批量处理客户查询呢?…...
布局和视图的常用属性
0、用户界面由布局和GUI组件组成 之前的项目中都是使用线性布局LinearLayout,LinearLayout将视图显示在一行或一列中。其使用方法如下所示: <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width…...

解说天下之操作系统
解说天下之操作系统 本文由桌案drawon (https://www.drawon.cn),云晶(https://www.yunjingxz.com)创始人根据多年从业经验, 从操作系统的起源,应用分类, 设计分类,以及资源使用角度对操作系统进…...
Pruning 系列 (八)layer常用简枝(torch)方法
环境 python 3.9numpy 1.24.1pytorch 2.0.0+cu117一、prune.random_unstructured pytorch:文档地址 用法: torch.nn.utils.prune.random_unstructured(module, name, amount) 参数: module(torch.nn.Module) -包含要修剪的张量的模块 name(str) -module 中的参数名称,将…...

Gigabyte Z490 Vision D i9-10900k电脑 Hackintosh 黑苹果efi引导文件
原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔) 硬件型号驱动情况 主板Gigabyte Z490 Vision D 处理器Intel i9-10900k已驱动 内存64GB G.Skill Trident Z 3600Mhz CL18已驱动 硬盘西数 WDS250G3X0C-00SJG0 ( SN750) …...

UWB智慧工厂人员定位系统源码,人员在岗监控、车辆实时轨迹监控源码
近年来人员定位系统在工业领域的发展势头迅猛,工业识别与定位成为促进制造业数字化的关键技术。通过实时定位可以判断所有的人、物、车的位置。实时定位系统要适用于复杂工业环境,单一技术是很难实现的,需要融合多种不同的定位技术࿰…...
从认识元注解到使用元注解
前言:注解是Java语言中的一种特殊语法,它可以为代码提供更加灵活的元数据信息,方便代码的处理和使用。而元注解则是用于定义注解的注解,它可以为注解提供更多的元数据信息和特性。本文将介绍如何自定义元注解,包括认识…...

【C++从0到王者】第六站:类和对象(下)
文章目录 一、再谈构造函数1.构造函数体赋值2.初始化列表1>初始化列表的使用2>初始化列表的注意事项 3.explicit关键词 二、static成员1.如何统计当前程序中变量的个数2.static的特性3.从1加到n4.设计一个类,只能在栈或者堆上开辟空间 三、友元1.友元函数2.友…...

AJax和Axios的讲解
目录 Ajax Ajax基本介绍 同步异步 原生Ajax 原生的Ajax使用方式 Axios 基本介绍 Axios的基本使用 发送 get 请求 发送 post 请求 Axios快速入门 请求方法的别名 练习 Ajax Ajax基本介绍 Ajax: 全称Asynchronous JavaScript And XML,异步的JavaScript和XML…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...