图像动态裁剪
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…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
