opencv基础-07-感兴趣区域(ROI)

ROI在计算机视觉任务中广泛应用,如目标检测、图像分割、物体识别和图像增强。OpenCV的ROI功能允许选择图像的特定区域进行处理,提高效率和准确性。例如,可以使用ROI进行目标检测,只处理与ROI重叠的目标,或者在图像增强时只针对选定区域。
摘要由CSDN通过智能技术生成

在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区
域(Region of Interest,ROI)。在设定感兴趣区域 ROI 后,就可以对该区域进行整体操作。

以下是一些

OpenCV ROI应用场景

的例子:

目标检测和跟踪:在计算机视觉中,目标检测和跟踪是常见的任务。通过使用ROI功能,可以选择感兴趣的区域,并在该区域上应用特定的目标检测和跟踪算法,从而提高处理速度和准确性。

图像分割:ROI可以用于图像分割任务,将图像分成不同的区域或对象。通过选择感兴趣的区域,可以将处理集中在关键区域,提高图像分割的效果。

物体识别和分类:在物体识别和分类任务中,ROI可以用于选择物体所在的区域,并对该区域进行特征提取和分类。通过选择感兴趣的区域,可以减少计算量并提高识别和分类的准确性。

图像增强:ROI功能可以用于局部图像增强。通过选择感兴趣的区域,可以对该区域应用各种图像增强技术,如对比度增强、锐化等,从而改善图像的可视化效果。

视频处理:在视频处理中,ROI功能可以用于选择视频帧中的感兴趣区域,并在该区域上应用各种处理算法,如运动检测、背景建模等。这有助于提高视频处理的效率和准确性。

总之,OpenCV的ROI功能在计算机视觉中有广泛的应用,可以用于目标检测、图像分割、物体识别、图像增强和视频处理等任务。通过选择感兴趣的区域,可以提高处理效率并获得更好的处理结果。

简单示例操作熟悉ROI
将一个感兴趣区域 A 赋值给变量 B 后,可以将该变量 B 赋值给另外一个区域 C,从而达到在区域 C 内复制区域 A 的目的。

例如,在图 2-16 中,假设当前图像的名称为 img,图中的数字分别表示行号和列号。那么,
图像中的黑色 ROI 可以表示为 img[200:400, 200:400]。

在这里插入图片描述
我们来看下[200:400, 200:400]这个数值的含义:

img[200:400, 200:400]表示选择图像img中行索引(y轴)在200到400之间、列索引(x轴)在200到400之间的区域作为ROI。该操作将返回一个新的图像,该图像仅包含原图像在指定区域内的像素值

示例:读取一张图片,打印原图及roi 区域图

import cv2
import numpy as np
a=cv2.imread("2.png",cv2.IMREAD_UNCHANGED)

face=a[220:400,250:350]
cv2.imshow("original",a)
cv2.imshow("face",face)
cv2.waitKey()
cv2.destroyAllWindows()

运行效果:

在这里插入图片描述
示例2:
将一幅图像内的 ROI 复制到另一幅图像内。

import cv2
import numpy as np


a=cv2.imread("222.jpg",cv2.IMREAD_UNCHANGED)

b=cv2.imread("740.jpg",cv2.IMREAD_UNCHANGED)

print("a.shape=",a.shape)
print("b.shape=",b.shape)

cv2.imshow("people",a)
cv2.imshow("number",b)

#从第一张图片中截取人脸
face=a[220:400,250:350]
#将人脸放到第二张图片中,覆盖掉数字
b[160:340,200:300]=face
#显示结果
cv2.imshow("result",b)

cv2.waitKey()
cv2.destroyAllWindows()

运行效果:

在这里插入图片描述

在目标检测任务中,如果只想检测ROI区域内的目标,可以按照以下步骤进行操作:

使用目标检测算法(如YOLO、SSD、Faster R-CNN等)对整个图像进行目标检测。这将产生检测框(bounding box)和相应的目标类别。

对于每个检测到的目标,判断其检测框是否与ROI区域有重叠(交集)。可以使用交并比(Intersection over Union,IoU)等指标进行判断。

如果目标的检测框与ROI区域有重叠,将其保留;如果没有重叠,可以将其忽略或排除。

对于保留下来的目标,可以进行后续的处理和分析,如目标跟踪、目标分类、目标姿态估计等。

请注意,上述步骤中的目标检测算法需要在整个图像上运行,以确保检测到所有的目标。然后,通过与ROI区域的重叠判断来决定是否保留目标。这种方法可以有效地筛选出ROI区域内的目标,并提高目标检测的效率。

下面是一个简单的示例代码,展示如何使用OpenCV进行目标检测,并只检测ROI区域内的目标

import cv2

# 读取图像
image = cv2.imread('image.jpg')

# 定义ROI区域的坐标范围
roi_x, roi_y, roi_w, roi_h = 200, 200, 200, 200

# 加载目标检测器(这里以Haar级联分类器为例)
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 在整个图像上运行目标检测
objects = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 遍历检测到的目标
for (x, y, w, h) in objects:
    # 判断目标是否在ROI区域内
    if x >= roi_x and y >= roi_y and x + w <= roi_x + roi_w and y + h <= roi_y + roi_h:
        # 在图像中绘制目标框
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 显示带有目标框的图像
cv2.imshow('Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
def state_deflection_angle(roi_blobs_result): ''' 说明:偏转状态值返回 ''' # ROI区域权重值 #ROIS_WEIGHT = [1, 1, 1, 1] ROIS_WEIGHT = [1, 0, 0, 1] state_crossing = False deflection_angle = 0 down_center = 0 center_num = 0 # 偏转值计算,ROI中心区域X值 centroid_sum = roi_blobs_result['up']['cx']*ROIS_WEIGHT[0] + roi_blobs_result['middle_up']['cx']*ROIS_WEIGHT[1] \ + roi_blobs_result['middle_down']['cx']*ROIS_WEIGHT[2] + roi_blobs_result['down']['cx']*ROIS_WEIGHT[3] if roi_blobs_result['up']['blob_flag']: center_num += ROIS_WEIGHT[0] if roi_blobs_result['middle_up']['blob_flag']: center_num += ROIS_WEIGHT[1] if roi_blobs_result['middle_down']['blob_flag']: center_num += ROIS_WEIGHT[2] if roi_blobs_result['down']['blob_flag']: center_num += ROIS_WEIGHT[3] center_pos = centroid_sum / (ROIS_WEIGHT[0]+ROIS_WEIGHT[1]+ROIS_WEIGHT[2]+ROIS_WEIGHT[3]) deflection_angle = (IMG_WIDTH/2)- center_pos # 判断两侧ROI区域检测到黑色线 if roi_blobs_result['left']['blob_flag'] and roi_blobs_result['right']['blob_flag']: # 判断两侧ROI区域检测到黑色线处于图像下方1/3处 if roi_blobs_result['left']['cy'] <= ((IMG_HEIGHT/3)) and roi_blobs_result['right']['cy'] <= ((IMG_HEIGHT/3)): # 当最下方ROI区域的黑线宽度大于140像素(检测到路口) if roi_blobs_result['down']['w'] > 235: state_crossing = True #elif roi_blobs_result['up']['blob_flag']: #state_crossing = True return down_center, state_crossing, deflection_angle 详细剖析里面的值都是怎么计算的
07-11
这段代码是一个函数 `state_deflection_angle`,用于计算偏转状态值和偏转角度。 让我们逐行解析代码中的计算过程: 1. 定义了一个权重列表 `ROIS_WEIGHT`,用于确定不同ROI区域的权重值。 2. 初始化变量 `state_crossing` 为 False,表示没有检测到路口;初始化变量 `deflection_angle` 为 0,表示偏转角度为 0;初始化变量 `down_center` 为 0,表示下方ROI区域的中心位置初始值为 0;初始化变量 `center_num` 为 0,表示有效ROI区域的数量。 3. 计算偏转值,根据每个ROI区域的中心位置和权重值,计算所有有效ROI区域的中心位置的加权平均值。这里使用了 `roi_blobs_result` 字典中不同ROI区域的中心位置属性(如 `'up'`、`'middle_up'` 等)和权重值。 4. 根据每个ROI区域是否检测到黑色线,更新有效ROI区域的数量 `center_num`。 5. 计算下方ROI区域的中心位置 `down_center`,即 `roi_blobs_result['down']['cx']`。 6. 计算偏转角度 `deflection_angle`,根据图像宽度和中心位置的差值计算得出。 7. 判断两侧ROI区域是否都检测到黑色线,并且这些线都位于图像下方的1/3位置。如果满足条件,再判断下方ROI区域检测到的黑线宽度是否大于235像素,如果是,则将 `state_crossing` 设置为 True,表示检测到路口。 8. 最后,函数返回 `down_center`、`state_crossing` 和 `deflection_angle` 这三个值。 总结起来,这段代码通过对不同ROI区域的中心位置进行加权平均,计算出偏转角度。然后根据特定条件判断是否检测到路口,并返回相关的状态值和角度值。注意,其中涉及到的具体数值和条件可能需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海聊智造

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值