OpenCV学习笔记 | ROI区域选择提取 | Python

摘要

        ROI区域是指图像中我们感兴趣的特定区域,OpenCV提供了一些函数来选择和提取ROI区域,我们可以使用OpenCV的鼠标事件绑定函数,然后通过鼠标操作在图像上绘制一个矩形框,该矩形框即为ROI区域。本文将介绍代码的实现以及四个主要函数cv2.setMouseCallback、def select_roi(event, x, y, flags, param)、cv2.namedWindow、cv2.rectangle

目录

一、主要函数简介        

二、代码内容讲解

三、结果展示


原始图像素材

       


一、主要函数简介        

        cv2.setMouseCallback 是OpenCV中的一个函数,用于设置鼠标事件的回调函数。回调函数是一种被作为参数传递给其他函数的函数,用于在特定事件发生或条件满足时被调用。函数原型为:cv2.setMouseCallback(windowName, onMouse[, param]) 。其中,windowName 表示窗口的名称,可以是创建窗口时指定的名称;onMouse表示回调函数,用于处理鼠标事件;param 表示可选参数,传递给回调函数的额外参数。这里不设置额外参数。

        def select_roi(event, x, y, flags, param) 为定义的回调函数。其中,event 表示事件的类型,可以是鼠标的按下、释放、移动等事件;和 分别表示鼠标的x坐标和y坐标;flags 表示鼠标事件的标志,用于指示是单击、双击以及按下的是哪个按钮;param 表示回调函数的额外参数。这里不设置额外参数。

        cv2.namedWindow 用于创建一个显示窗口,创建后可以使用其他OpenCV的函数在窗口中显示图像或绘图。函数原型为:cv2.namedWindow(winname[, flags]) 。其中,winname 表示窗口名称,是一个字符串。每个窗口在OpenCV中都必须有一个唯一的名称;flags 表示可选参数,用于指定窗口的显示方式,可以是以下标志的组合:

        cv2.WINDOW_NORMAL窗口大小可调整。

        cv2.WINDOW_AUTOSIZE窗口大小自适应图像大小。

        cv2.rectangle 是OpenCV中用于在图像上绘制矩形的函数。

        函数原型为:cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) 。其中,img 表示要绘制矩形的图像;pt1 表示矩形的顶点坐标(左上角);pt2 表示矩形的顶点坐标(右下角);color 表示矩形的颜色,可以是BGR值的元组或整数;thickness 表示矩形边框的线宽,默认为1;lineType 表示线条的类型,默认为8连接线;shift 表示坐标点表示中的小数位数,默认为0。这里不设置线条类型,只设置线条宽度。

二、代码内容讲解

        首先,我们定义了一个名为 select_roi 的回调函数,用于处理鼠标事件。在鼠标左键按下时,它记录了矩形框的左上角坐标。在鼠标左键释放时,它记录了矩形框的右下角坐标。然后,它使用cv2.rectangle 函数在图像上绘制出选择的矩形框。drawing, top_left_pt, bottom_right_pt 都是用于处理鼠标事件的变量,用来记录鼠标交互的状态和位置信息。我们把回调函数传给cv2.setMouseCallback ,让它在 cv2.namedWindow 定义的窗口上进行操作。

def select_roi(event, x, y, flags, param):global drawing, top_left_pt, bottom_right_pt # 在函数内部使用这些变量时,引用或修改已经存在于全局作用域中的变量。if event == cv2.EVENT_LBUTTONDOWN: # 如果鼠标事件为左键按下drawing = True # 绘图状态开始top_left_pt = (x, y) # 将按下的坐标赋值elif event == cv2.EVENT_LBUTTONUP: # 如果鼠标事件为左键释放drawing = False # 绘图状态结束bottom_right_pt = (x, y) # 将抬起的坐标赋值cv2.rectangle(image, top_left_pt, bottom_right_pt, (0, 0, 255), 2) # 用红色,线宽为2的线绘图drawing = False #用于记录是否正在绘制矩形的状态,初始为Flase
top_left_pt, bottom_right_pt = (-1, -1), (-1, -1) # 矩形的左上角顶点坐标和矩形的右下角顶点坐标初始化cv2.namedWindow('ROI Selection') # 创建一个窗口
cv2.setMouseCallback('ROI Selection', select_roi) # 在创建的窗口中传入回调函数

       在主循环中,我们显示了图像,并通过cv2.waitKey来检测按键输入。按下’a’键时,程序退出循环,即通过使用选择的顶点坐标来提取ROI区域,并显示在一个名为’ROI’的新窗口中。在这里,通过索引图像的像素来提取ROI区域。

        cv2.waitKey(1)会暂停程序执行,等待用户按下键盘上的一个按键。函数会返回用户按下的键的ASCII码值(整数类型),如果在等待期间没有按键按下,返回值为-1。

if cv2.waitKey(1) == 27:  # 按下ESC键退出,执行下面的提取代码
        break

        此代码判断用户是否按下了 Esc键(ASCII码值为27)。如果用户按下了ESC键,条件判断结果为True,则执行break 语句,结束循环。

while True:cv2.imshow('ROI Selection', image)if cv2.waitKey(1) == 27:  # 按下ESC键退出,执行下面的提取代码break# 提取ROI区域
print("矩形左上角横坐标:",top_left_pt[0])
print("矩形左上角纵坐标:",top_left_pt[1])
print("矩形右下角横坐标:",bottom_right_pt[0])
print("矩形右下角纵坐标:",bottom_right_pt[1])
roi = image[top_left_pt[1]:bottom_right_pt[1], top_left_pt[0]:bottom_right_pt[0]] # 图像切片的第一个参数是高度,第二个参数是宽度,并且图像的最左上角坐标是(0,0)
cv_show('ROI',roi)

        需要注意的是图像的最左上角的坐标为(0,0),切片操作的第一个参数为图像高度,第二个参数才是图像的宽度。


三、结果展示

ROI区域提取结果图像

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/619.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue中如何进行游戏开发与游戏引擎集成?

Vue中如何进行游戏开发与游戏引擎集成? Vue.js是一款流行的JavaScript框架,它的MVVM模式和组件化开发思想非常适合构建Web应用程序。但是,如果我们想要开发Web游戏,Vue.js并不是最合适的选择。在本文中,我们将介绍如何…

edge自带断网游戏

在没有网络时你会不会很无聊?博主告诉你一个edge浏览器自带的断网小游戏,让你在断网时也能玩游戏! 网址: 打开edge://surf这个断网游戏网站即可游玩: 作弊码既隐藏模式: 输入microsoft(意思就…

Axure教程——图片轮播(纵向滚动)

本文介绍的时用Axure中的动态面板制作图片轮播之纵向滚动 一、预览效果 预览地址:https://c1s4i1.axshare.com 二、功能描述 图片纵向自动滚动播放 三、元件制作 拖入一个动态面板,命名为1,设置大小为375*155,并设置四个状态&…

Python对csv文件一键多值保存为json本地文件再读取加速效率(3)

最近发现做办公自动化表格匹配的时候还是csv格式的文件最快、效率是最高的 今天接到一个需求就是大致内容之这样的 1、给我一张表格直邮一列A列,内容是运单号 2、需要用相同的单号去另外一张表格匹配数据 3、其实就是Excel中的常见的vlookup 但是想要匹配的表格有几…

基于Python所写的Word助手设计

点击以下链接获取源码资源: https://download.csdn.net/download/qq_64505944/87959100?spm1001.2014.3001.5503 《Word助手》程序使用说明 在PyCharm中运行《Word助手》即可进入如图1所示的系统主界面。在该界面中,通过顶部的工具栏可以选择所要进行的…

Pytorch实现多GPU并行训练(DDP)

Pytorch实现并行训练通常有两个接口:DP(DataParallel)和DDP(DistributedDataParallel)。目前DP(DataParallel)已经被Pytorch官方deprecate掉了,原因有二:1,DP…

VisualStudio离线包制作

因为需要,需要制作VisualStudio离线包,之前尝试了很多的方案,均没有下载成功。今天偶然看到一个可行的方案,这里在这里分享下。 从微软官网下载VisualStudio离线包 1 下载安装文件 visualstudio官网 首先进入到官网中&#xff0…

最小二乘法的原理及实现

1.最小二乘法的原理及实现 笔记来源于《白话机器学习的数学》 1.1 最小二乘法的原理 预测一个变量 x x x与一个变量 y y y的关系 例如:广告费 x x x与点击量 y y y 用直线拟合数据 1.2 最小二乘法的实现 广告费x和点击量y,找到一条直线表达式&#x…

MySQL数据表查询

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:进入MySQL知识专…

每天一点Python——day43

#第四十三天字典的视图操作: ①keys()获取字典中所有的键 ②values()获取字典中所有的值 ③items()获取字典中所有的键值对#如图: #例:获取所有的键 a{哥哥:18,妹妹:16,姐姐:17}#字典创立 ba.keys()#获取后我们存在变量b中,右边的…

Vision Pro中VR游戏空间边界为3×3米圆形

6月25日青亭网报道,此前我们已经报道了苹果visionOS有三种应用类型:FullSpaces、Windows、Volume。其中FullSpaces是仅显示一款应用的类型,后两种为共享空间可多窗口、多应用显示。 在FullSpaces模式下,苹果的一份文档显示visionO…

Linux下 MHA故障切换 主从角色提升

目录 所有主机共同操作 manger操作 其他四台安装 搭建主从复制环境 nobe slave1 配置 slave2 slave3 配置 配置MHA环境 简述MHA: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由…