我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

摘要

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

目录

一、主要函数简介        

二、代码内容讲解

三、结果展示


 

7108ea7e5af945fd840da6f3a17cb619.png

原始图像素材

       


一、主要函数简介        

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

        def select_roi(event, x, y, flags, param) 为定义的回调函数。其中,event 表示事件的类型,可以是鼠标的按下、释放、移动等事件;x 和 y 分别表示鼠标的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 #用于记录是否正在绘制矩形的状态,初始为Flasetop_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),切片操作的第一个参数为图像高度,第二个参数才是图像的宽度。


三、结果展示

fdade67651224edf900a30a8ddeda366.png

ROI区域提取结果图像

 

 

来源地址:https://blog.csdn.net/L040514/article/details/131437003

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python+OpenCV数字图像处理中如何进行ROI区域的提取

本篇文章给大家分享的是有关Python+OpenCV数字图像处理中如何进行ROI区域的提取,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、实现原理先通过cv.cvtColor
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录