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

这篇具有很好参考价值的文章主要介绍了OpenCV学习笔记 | ROI区域选择提取 | Python。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要

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

目录

一、主要函数简介        

二、代码内容讲解

三、结果展示


 文章来源地址https://www.toymoban.com/news/detail-726272.html

roi区域,opencv,学习,笔记,python,人工智能

原始图像素材

       


一、主要函数简介        

        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 #用于记录是否正在绘制矩形的状态,初始为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区域,opencv,学习,笔记,python,人工智能

ROI区域提取结果图像

 

 

到了这里,关于OpenCV学习笔记 | ROI区域选择提取 | Python的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV学习(五)——图像基本操作(访问图像像素值、图像属性、感兴趣区域ROI和图像边框)

    访问像素值并修改 访问图像属性 设置感兴趣区域(ROI) 分割和合并图像 5.1 访问像素值并修改 访问像素值 修改像素值 简单访问每个像素值并修改比较缓慢,一般不使用。 Numpy数组方法 array.item() 和 array.itemset() 被认为更好,但是它们始终返回标量。 更好的像素访问和编辑方

    2024年02月06日
    浏览(90)
  • Opencv 如何获取roi区域

    关于图片处理,经常遇到的一个问题是如何获取roi区域(说白了就是抠图),并对roi区域赋值,比如说赋值成黑色。 首先,关于如何获取roi区域,opencv的Mat类中提供了两种方法。代码如下: 上述两种获取roi的方式是通过重载()运算符实现的,根据上面的描述可以看到通过上面

    2024年02月09日
    浏览(44)
  • OpenCV(十四):ROI区域截取

    在OpenCV中,你可以使用Rect对象或cv::Range来截取图像的感兴趣区域(Region of Interest,ROI)。 方法一:使用Rect对象截取图像 Rect_(_Tp _x, _Tp _y, _Tp _width,_Tp _height) Tp:数据类型,C++模板特性,可以用int、double、float等替换。 _x:矩形区域左上角第一个像素的x坐标,也就是第一个像素

    2024年02月10日
    浏览(38)
  • opencv-07-感兴趣区域(ROI)

    在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区 域(Region of Interest,ROI)。在设定感兴趣区域 ROI 后,就可以对该区域进行整体操作。 以下是一些 的例子: 目标检测和跟踪 :在计算机视觉中,目标检测和跟踪是常见的任务。通过使用

    2024年02月16日
    浏览(49)
  • opencv基础-07-感兴趣区域(ROI)

    在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区 域(Region of Interest,ROI)。在设定感兴趣区域 ROI 后,就可以对该区域进行整体操作。 以下是一些 的例子: 目标检测和跟踪 :在计算机视觉中,目标检测和跟踪是常见的任务。通过使用

    2024年02月13日
    浏览(39)
  • OpenCV截取ROI区域——多种形状(圆形)

    背景:在做一个中国象棋机器人的项目,项目中需要识别象棋棋子上的汉字,计划采用CNN的方式实现这一功能。在制作CNN训练的数据集的时候,需要一个截取象棋中心文字的问题。当我们定位到一个象棋的位置之后,我首先将包裹象棋的一个50*50的矩形取阈截取出来,但是,

    2024年02月16日
    浏览(49)
  • opencv-20 深入理解HSV 色彩空间(通过指定,标记颜色等来拓展ROI区域)

    RGB 色彩空间是一种被广泛接受的色彩空间,但是该色彩空间过于抽象,我们不能够直接通过其值感知具体的色彩。 我们更习惯使用直观的方式来感知颜色,HSV 色彩空间提供了这样 的方式。 通过 HSV色彩空间,我们能够更加方便地通过色调、饱和度和亮度来感知颜色。 其实,

    2024年02月15日
    浏览(49)
  • 用迅为RK3568开发板使用OpenCV处理图像颜色通道提取ROI

    本小节代码在配套资料“iTOP-3568 开发板\\03_【iTOP-RK3568 开发板】指南教程 \\04_OpenCV 开发配套资料\\07”目录下,如下图所示: 在计算机的色彩图像中存有三个通道,即 BGR 通道,根据三个颜色通道的亮度值来显示出不同的颜色,通过 imread()函数读取图像文件之后,图像信息会保

    2024年02月10日
    浏览(40)
  • c++ OpenCV——提取图像的局部区域

    有时候整幅图像需要采取局部,如何进行采取呢。方案如下: 确定裁剪区域的大下 将原图copy一份,原图备用,防止损坏 将copy的图进行裁剪 原图: copy图及需要裁剪的部分: 裁剪图:

    2024年02月09日
    浏览(44)
  • 学习笔记:Opencv实现图像特征提取算法SIFT

    2023.8.19 为了在暑假内实现深度学习的进阶学习,特意学习一下传统算法,分享学习心得,记录学习日常 SIFT的百科: SIFT = Scale Invariant Feature Transform, 尺度不变特征转换 全网最详细SIFT算法原理实现_ssift算法_Tc.小浩的博客-CSDN博客 在环境配置中要配置opencv: pip install opencv-c

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包