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

news2024/12/24 11:34:08

摘要

        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.coloradmin.cn/o/697575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv编译

文章目录 一、编译前工作二、编译安装1、Windows2、Linux 一、编译前工作 进入下载页面https://github.com/opencv/opencv,下载指定.tar.gz源码包,例如:opencv-4.7.0.tar.gz。解压到指定目录。 二、编译安装 opencv构建时,需要…

使用docker搭建hadoop集群

1.下载安装docker 2.启动docker 3.配置docker镜像 4.获取hadoop镜像 5.拉取hadoop镜像 6.运行容器 7.进入容器 8.配置免密 9.格式化节点 10.启动节点 11.查看节点信息 (img-CBr9VbGk-1687962511910)] 11.查看节点信息

javascript原型、原型链、继承详解

一、原型和原型链的基本概念 在JavaScript中,每个对象都有一个原型对象(prototype)。原型对象就是一个普通的对象,在创建新对象时,可以将该对象作为新对象的原型。原型对象可以包含共享的属性和方法,这些属…

Appium自动化-ADB连接手机提示unauthorized

目录 开头: 问题: 调研: 重启大法 终极大法 总结: 开头: 当使用ADB(Android Debug Bridge)连接手机时,如果提示"unauthorized"(未授权)错误&a…

javaee HttpSessionListener监听器统计在线人数

先创建ServletContextListener 在全局对象application中设置count属性 package com.yyy.listener;import java.util.ArrayList;import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax…

易基因|表观遗传学与脑卒中:DNA甲基化的作用及衰老对血脑屏障修复的影响

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 脑卒中(俗称中风)是导致死亡和长期残疾的主要原因,尤其是对于老龄人来说。脑卒中的平均生存时间为6-7年,许多患者存在身体残疾和晚期认知功…

技术岗/算法岗面试如何准备?5000字长文、6个角度以2023秋招经历分享面试经验

技术岗/算法岗面试流程是什么样的?技术面都干什么?Coding 机试如何准备?技术面考察哪些知识,如何准备?项目八股如何准备?简历要注意什么?怎么做? 大家好,我是卷了又没卷…

uniapp 适配全面屏

1、manifest.json 文件修改 app-plus 下 添加 "safearea": {"background": "#00000000","bottom": {"offset": "auto"}},2、部分页面设置全屏(登录页面) methods: {//设置页面全屏onShow(…

SpringBoot(二)starter介绍

做Java后端的同学可能都知道,在SpringBoot诞生之前,还有传统的Spring。这种Spring项目想要运行,需要导入各种依赖,而且还要在 XML 配置文件中一顿配置,非常痛苦。但通过上篇博客我们可以看到,SpringBoot项目…

事务与隔离级别

事务四要素 原子性(Atomicity):要么全部完成,要么全部不完成;一致性(Consistency):一个事务单元需要提交之后才会被其他事务可见;隔离性(Isolation&#xff…

azure databricks因为notebook 日志打多或者打印图片太多,往下拉卡死怎么处理

1、同事碰到个问题,databricks 页面卡死不动了 2、我。。。。。。。。测试了下搞不定,找azure的工程师,特此笔记如下图 !](https://img-blog.csdnimg.cn/5db9756d0e224d15a9a607561b47591f.png)

怎样自定义starter模块和使用

一、 自定义Starter模块 在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的starter(起步依赖)。 1.1实例–阿里云OSS的配置 前言:我们在使用阿里云…

windows下MySQL 5.7.31的安装

文章目录 安装步骤检查是否安装成功配置环境变量 安装步骤 双击安装包mysql-installer-community-5.7.31.0.msi选择自定义安装“custom”,点击next “Developer Default”是开发者默认“Server only”仅作为服务器安装“Clientonly”仅作为客户端安装“Full”是完…

华为OD机试真题 Python 实现【红黑图】【2023Q1 200分】,附详细解题思路

一、题目描述 众所周知红黑树是一种平衡树,它最突出的特性就是不能有两个相邻的红色节点。 那我们定义一个红黑图,也就是一张无向图中,每个节点可能有红黑两种颜色,但我们必须保证没有两个相邻的红色节点。 现在给出一张未染色的…

晶振的作用,高速晶振优缺点

前言 (1)我们都知道晶振是一款MCU的心脏,因为长期用这种抽象的概念进行解释,导致很多人不知道这个心脏的实际作用。因此,我在这里详细的介绍一下晶振对于MCU的实际作用。 (2)接下来我将会在MCU处…

一零六一、Jupyter notebook文件默认路径修改方法

1 .打开 Anaconda Prompt,输入命令 jupyter notebook --generate-config 根据上面运行处的路径打开 C:\Users\WW.jupyter\jupyter_notebook_config.py文件,可以使用记事本打开。 2 .直接CtrlF 搜索 ,找到 #c.NotebookApp.notebook_dir ‘’…

Spring 2023面试题(2)--Spring mvc 运行流程

1. Spring MVC的运行流程主要包括以下步骤: 用户发送请求到前端控制器(DispatcherServlet)。前端控制器接收到请求后,初始化处理器映射器(HandlerMapping)和处理器适配器(HandlerAdapter&#…

Crypto(小学期培训)

你被骗了 url编码直接解 进入网站、找到时间 flag{2020-01-01 07:43:23} 梅开二度 凯撒密码 y和h相差17 三羊开泰 词频分析 这是??? 010编辑器打开 上面是密文 下面是密码表64个,想到base64 找到原来的数值 与之对应&a…

JVM GC ROOT分析与垃圾收集器原理分析(三)

目录 一、GC ROOT 1、虚拟机栈中的本地变量 2、static 成员 3、常量引用 4、本地方法栈中的变量 5、类加载器 6、线程 二、回收算法 1、标记和清除 2、复制算法 3、标记整理 三、垃圾收集器 1、新生代-复制算法 2、老年代-标记清除/整理 3、垃圾收集器分类 1、…

Python如何向一个空列表中append列表

最近在做回溯组合问题时–力扣链接,遇到了向一个空列表中append多个列表。 于是,我原来的代码是: def main(n,k):result []temp []def backtrack(n,k,startIndex):if(len(temp)k):result.append(temp)returnfor i in range(startIndex,n1)…