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

文章介绍了如何利用OpenCV中的cv2.setMouseCallback函数结合鼠标事件,定义select_roi回调函数来在图像上绘制矩形选择ROI区域。通过cv2.namedWindow创建显示窗口,cv2.rectangle绘制矩形,并在用户按下ESC键后提取选定的ROI并显示在新的窗口中。
摘要由CSDN通过智能技术生成

摘要

        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 #用于记录是否正在绘制矩形的状态,初始为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),切片操作的第一个参数为图像高度,第二个参数才是图像的宽度。


三、结果展示

fdade67651224edf900a30a8ddeda366.png

ROI区域提取结果图像

 

 

### 回答1: 要提取ROI区域,可以使用OpenCV的cv2.rectangle函数来绘制矩形框,然后使用numpy数组的切片操作来提取ROI区域。具体步骤如下: 1. 读入图像并显示 ```python import cv2 img = cv2.imread('image.jpg') cv2.imshow('image', img) cv2.waitKey() ``` 2. 绘制矩形框 ```python x, y, w, h = 100, 100, 200, 200 # 矩形框左上角坐标和宽高 cv2.rectangle(img, (x, y), (x+w, y+h), (, 255, ), 2) # 绘制矩形框 cv2.imshow('image', img) cv2.waitKey() ``` 3. 提取ROI区域 ```python roi = img[y:y+h, x:x+w] # 提取ROI区域 cv2.imshow('ROI', roi) cv2.waitKey() ``` 完整代码如下: ```python import cv2 img = cv2.imread('image.jpg') cv2.imshow('image', img) x, y, w, h = 100, 100, 200, 200 # 矩形框左上角坐标和宽高 cv2.rectangle(img, (x, y), (x+w, y+h), (, 255, ), 2) # 绘制矩形框 cv2.imshow('image', img) roi = img[y:y+h, x:x+w] # 提取ROI区域 cv2.imshow('ROI', roi) cv2.waitKey() cv2.destroyAllWindows() ``` ### 回答2: OpenCV是一个经常用来处理图像和视频的开源库。在OpenCV中,提取ROI区域是一个经常用到的技术。ROI区域指的是图像中指定的一个矩形区域,也被称为感兴趣区域(Region Of Interest)。 使用OpenCV Python提取ROI区域,主要采取以下几个步骤: 1. 读取图像:使用cv2.imread()函数读取图片,将其存储在一个变量中。 2. 提取ROI区域:使用Numpy数组的切片功能,根据自己需要提取图像中的ROI区域。 3. 显示图像:使用cv2.imshow()函数将提取到的图像显示到屏幕上。 4. 保存图像:使用cv2.imwrite()函数将提取到的图像保存在本地。 下面是更详细的步骤: 1. 读取图像: ```python import cv2 image = cv2.imread('image.jpg') ``` 2. 提取ROI区域提取ROI区域的语法为:image[y1:y2, x1:x2]。其中,y1表示矩形区域的左上角的y坐标,y2表示矩形区域的右下角的y坐标,x1表示矩形区域的左上角的x坐标,x2表示矩形区域的右下角的x坐标。需要注意的是,图像中的坐标系是从左上角开始的。 ```python roi = image[100:200, 100:200] ``` 3. 显示图像: 使用cv2.imshow()函数显示图片。 ```python cv2.imshow('ROI', roi) cv2.waitKey(0) # 等待用户按下任意键 ``` 4. 保存图像: 使用cv2.imwrite()函数保存图片。 ```python cv2.imwrite('roi.jpg', roi) ``` 通过以上几个步骤,就可以轻松地在OpenCV Python提取ROI区域。当然,还有很多细节需要注意,例如避免取到的坐标超过图片的范围等。但是只要掌握了这个基本的技术,OpenCV Python提取ROI区域就变得非常容易了。 ### 回答3: OpenCV是一款强大的计算机视觉库,它支持Python编程语言,可用于图像处理和计算机视觉应用程序的开发。OpenCV使用的主要数据结构是Numpy数组,可以方便地将图像读取为Numpy数组,进行数组操作后再保存为图像。 在图像处理中,ROI(Region of Interest,感兴趣区域)是指在图像中选出的一块区域,通常是因为该区域包含了想要获得的信息,这对于进一步的处理和分析是非常有用的。在OpenCV中,提取感兴趣区域的过程非常简单。 下面我们将介绍如何使用PythonOpenCV从一张图像中提取ROI区域。 1. 引入必要库 首先,需要在Python中引入必要的库: ```python import cv2 import numpy as np ``` 2. 读取图像 接下来,需要读取一张图像,我们可以使用OpenCV中的`cv2.imread()`函数来读取图像。 ```python img = cv2.imread("example.jpg") ``` 需要注意的是,读取的图像通常是BGR模式,因此在下一步中我们需要将其转换为灰度或RGB模式。 3. 提取ROI区域 提取ROI区域的过程就是在原始图像中选择一个矩形区域,可以使用OpenCV中的`cv2.rectangle()`函数来标记出想要提取区域,然后使用Numpy数组来提取区域。 ```python # 选择想要提取区域(x,y为左上角的坐标,w,h为宽和高) x, y, w, h = 100, 100, 200, 200 # 在原始图像中标记ROI区域 cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) # 提取ROI区域 roi = img[y:y + h, x:x + w] ``` 在这个例子中,我们选择以(100,100)为左上角的坐标,宽和高都为200的正方形区域。使用`cv2.rectangle()`函数在原始图像中标记这个区域,然后使用Numpy数组来提取区域。 4. 显示结果 最后,可以使用OpenCV中的`cv2.imshow()`函数将原始图像和提取ROI区域显示出来。 ```python # 显示原始图像和提取ROI区域 cv2.imshow("Original Image", img) cv2.imshow("ROI Image", roi) cv2.waitKey(0) ``` 使用`cv2.imshow()`函数可以将原始图像和提取ROI区域都显示出来,`cv2.waitKey(0)`函数则等待按下任意键后关闭窗口。 综上所述,可以看出使用PythonOpenCV提取ROI区域非常简单,只需要几行代码即可实现。这将为计算机视觉应用程序的开发带来极大的便利。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值