【利用OpenCV-Python在图像中选择ROI区域并提取ROI坐标信息】

【利用OpenCV-Python在图像中选择ROI区域并提取ROI坐标信息】

文前白话

  • 在图像中选定ROI区域进行进一步的功能开发,就需要提取到相应的ROI区域坐标,对于多边形ROI区域划定与坐标信息提取,主要利用鼠标交互进行绘制,详细代码如下:
  • 提示:要注意坐标信息与图像实际大小的关系,特别是应用在视频流的ROI区域坐标提取。

代码:


import cv2
import numpy as np
import joblib   # pip install joblib

# 声明鼠标点击函数,从图像中选入ROI的系列点
def draw_roi(event, x, y, flags, param):
    img2 = img.copy()
    
    if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击,选择点
        pts.append((x, y))
    if event == cv2.EVENT_RBUTTONDOWN:  # 右键点击,取消最近一次选择的点
        pts.pop()
    if event == cv2.EVENT_MBUTTONDOWN:  # 中键绘制轮廓
        mask = np.zeros(img.shape, np.uint8)
        points = np.array(pts, np.int32)
        points = points.reshape((-1, 1, 2))
        
        # 选择多边形
        mask = cv2.polylines(mask, [points], True, (255, 255, 255), 2)
        mask2 = cv2.fillPoly(mask.copy(), [points], (255, 255, 255))  # 用于求 ROI
        mask3 = cv2.fillPoly(mask.copy(), [points], (0, 255, 0))      # 用于 显示在桌面的图像
        show_image = cv2.addWeighted(src1=img, alpha=0.8, src2=mask3, beta=0.2, gamma=0)
        cv2.imshow("mask", mask2)
        cv2.imshow("show_img", show_image)
        ROI = cv2.bitwise_and(mask2, img)
        cv2.imshow("ROI", ROI)
        cv2.waitKey(0)
        
    if len(pts) > 0:
        # 将pts中的最后一点画出来
        cv2.circle(img2, pts[-1], 3, (0, 0, 255), -1)
    if len(pts) > 1:
        # 画线
        for i in range(len(pts) - 1):
            cv2.circle(img2, pts[i], 5, (0, 0, 255), -1)  # x ,y 为鼠标点击地方的坐标
            cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 0), thickness=2)
    cv2.imshow('image', img2)
    
# 创建图像坐标参数
pts = []  # 用于存放点坐标
path = "./20.jpg" #读入图片路径

#为了使ROI与实际的点的坐标一致,需要将图片resize成目标大小
# 若是在视频中画ROI,则需要匹配单帧中的实际大小
img_org = cv2.imread(path)
print('img_org.size:',img_org.shape)  # 打印原始帧图像的通道信息
img=cv2.resize(img_org,(1920,1080))
print('img.size:',img.shape)
# 将图像窗口与鼠标回调函数绑定
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_roi)
print("[INFO] 单击左键:选择点,单击右键:删除上一次选择的点,单击中键:确定ROI区域")
print("[INFO] 按‘S’确定选择区域并保存")
print("[INFO] 按 ESC 退出")

#退出与保存
while True:
    key = cv2.waitKey(1) & 0xFF
    if key == 27:
        break
    if key == ord("s"):
        saved_data = {"ROI": pts}
        joblib.dump(value=saved_data, filename="config.pkl") # .pkl 为二进制文件
        print("[INFO] ROI坐标已保存到本地.")
        break
cv2.destroyAllWindows()

#加载保存好的 .pkl 二进制文件中提取的roi坐标
def Load_Model(filepath):
    img = cv2.imread(path)   
    model = joblib.load(filepath)
    print(type(model))
    print(model)  # 打印坐标点的信息
    return model
Load_Model('config.pkl')

效果:

在这里插入图片描述

在这里插入图片描述

补充:

  • 对于区域获得的坐标点,利用 y= kx+b 进行线性拟合,以任意一点在区分区域内或者区域外。

# # 将ROI提取出的坐标进行拟合: y = kx + b 
def line(name,x1,y1,x2,y2):
    k=(y1-y2)/(x1-x2)
    b=y1-((y1-y2)/(x1-x2))*x1
    # print('L%s:y=%.2f*x+%.2f'%(name,k,b))
    print(name,k,b)
line('ab',740, 321,1185, 333)  

  • 8
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答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区域非常简单,只需要几行代码即可实现。这将为计算机视觉应用程序的开发带来极大的便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值