0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

我们如何定义ROI?

新机器视觉 来源:小白学视觉 作者:努比 2022-06-09 11:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

OpenCV是一个巨大的开源库,广泛用于计算机视觉人工智能和图像处理领域。它在现实世界中的典型应用是人脸识别,物体检测,人类活动识别,物体跟踪等。

现在,假设我们只需要从整个输入帧中检测到一个对象。因此,代替处理整个框架,如果可以在框架中定义一个子区域并将其视为要应用处理的新框架,该怎么办。我们要完成一下三个步骤:

定义兴趣区

在ROI中检测轮廓

阈值检测轮廓轮廓线

什么是ROI

简而言之,我们感兴趣的对象所在的帧内的子区域称为感兴趣区域(ROI)。

我们如何定义ROI?

在输入帧中定义ROI的过程称为ROI分割。

在“ ROI细分”中,(此处)我们选择框架中的特定区域,并以矩形方法提供其尺寸,以便它将在框架上绘制矩形的ROI。

1934a0e2-e731-11ec-ba43-dac502259ad0.png

(输出)蓝色矩形覆盖的区域是我们的投资回报率

现在,如果您也想绑定感兴趣的对象,那么我们可以通过在ROI中找到轮廓来实现。

什么是轮廓?

轮廓线是表示或说是限制对象形状的轮廓。

如何在框架中找到轮廓?

对我而言,在将ROI框架设为阈值后,找到轮廓效果最佳。因此,要找到轮廓,手上的问题是-

什么是阈值?

阈值不过是图像分割的一种简单形式。这是将灰度或rgb图像转换为二进制图像的过程。例如

198779c0-e731-11ec-ba43-dac502259ad0.png

(这是RGB帧)

19acae20-e731-11ec-ba43-dac502259ad0.png

(这是二进制阈值帧)

因此,在对rgb帧进行阈值处理后,程序很容易找到轮廓,因为由于ROI中感兴趣对象的颜色将是黑色(在简单的二进制脱粒中)或白色(在如上所述的反向二进制脱粒中),因此分割(将背景与前景即我们的对象分开)将很容易完成。

在对框架进行阈值处理并检测到轮廓之后,我们应用凸包技术对围绕对象点的紧密拟合凸边界进行设置。实施此步骤后,框架应如下所示-

19ce95f8-e731-11ec-ba43-dac502259ad0.png

我们可以做的另一件事是,我们可以遮盖ROI以仅显示被检测到的轮廓本身覆盖的对象。再次-

什么是图像MASK?

图像MASK是隐藏图像的某些部分并显示某些部分的过程。这是图像编辑的非破坏性过程。在大多数情况下,它使您可以在以后根据需要调整和调整遮罩。通常,它是一种有效且更具创意的图像处理方式。

因此,基本上在这里我们将掩盖ROI的背景。为此,首先我们将修复ROI的背景。然后,在固定背景之后,我们将从框架中减去背景,并用wewant背景(这里是一个简单的黑色框架)替换它。

实施上述技术,我们应该得到如下输出:

19f5abd4-e731-11ec-ba43-dac502259ad0.png

(背景被遮罩以仅捕获对象)

这是所说明技术的理想实现的完整代码。


import cv2import numpy as npimport copyimport math
x=0.5  # start point/total widthy=0.8  # start point/total widththreshold = 60  # BINARY thresholdblurValue = 7  # GaussianBlur parameterbgSubThreshold = 50learningRate = 0
# variablesisBgCaptured = 0   # whether the background captured
def removeBG(frame): #Subtracting the background    fgmask = bgModel.apply(frame,learningRate=learningRate)
    kernel = np.ones((3, 3), np.uint8)    fgmask = cv2.erode(fgmask, kernel, iterations=1)    res = cv2.bitwise_and(frame, frame, mask=fgmask)    return res
# Cameracamera = cv2.VideoCapture(0)camera.set(10,200)


while camera.isOpened():    ret, frame = camera.read()    frame = cv2.bilateralFilter(frame, 5, 50, 100)  # smoothening filter    frame = cv2.flip(frame, 1)  # flip the frame horizontally    cv2.rectangle(frame, (int(x * frame.shape[1]), 0),                 (frame.shape[1], int(y * frame.shape[0])), (255, 0, 0), 2) #drawing ROI    cv2.imshow('original', frame)
    #  Main operation    if isBgCaptured == 1:  # this part wont run until background captured        img = removeBG(frame)        img = img[0:int(y * frame.shape[0]),                    int(x * frame.shape[1]):frame.shape[1]]  # clip the ROI        cv2.imshow('mask', img)
        # convert the image into binary image        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)        blur = cv2.GaussianBlur(gray, (blurValue, blurValue), 0)        cv2.imshow('blur', blur)        ret, thresh = cv2.threshold(blur, threshold, 255, cv2.THRESH_BINARY) #thresholding the frame        cv2.imshow('ori', thresh)

        # get the coutours        thresh1 = copy.deepcopy(thresh)        contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #detecting contours        length = len(contours)        maxArea = -1        if length > 0:            for i in range(length):  # find the biggest contour (according to area)                temp = contours[i]                area = cv2.contourArea(temp)                if area > maxArea:                    maxArea = area                    ci = i
            res = contours[ci]            hull = cv2.convexHull(res) #applying convex hull technique            drawing = np.zeros(img.shape, np.uint8)            cv2.drawContours(drawing, [res], 0, (0, 255, 0), 2) #drawing contours             cv2.drawContours(drawing, [hull], 0, (0, 0, 255), 3) #drawing convex hull            cv2.imshow('output', drawing)
    # Keyboard OP    k = cv2.waitKey(10)    if k == 27:          camera.release()        cv2.destroyAllWindows()        break    elif k == ord('b'):  # press 'b' to capture the background        bgModel = cv2.createBackgroundSubtractorMOG2(0, bgSubThreshold)        isBgCaptured = 1        print( 'Background Captured')    elif k == ord('r'):  # press 'r' to reset the background        bgModel = None        isBgCaptured = 0print('ResetBackGround')

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 人脸识别
    +关注

    关注

    77

    文章

    4132

    浏览量

    88763
  • OpenCV
    +关注

    关注

    33

    文章

    652

    浏览量

    45092

原文标题:基于OpenCV的区域分割、轮廓检测和阈值处理

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    失调电压的定义、测量与校正办法

    失调电压的定义、测量与校正办法
    的头像 发表于 04-10 16:08 105次阅读
    失调电压的<b class='flag-5'>定义</b>、测量与校正办法

    MCUXpresso SDK创建自定义清单

    概述 MCUXpresso SDK 24.12 介绍塞德恩汉CED支持自定义清单,使开发人员能够精确定义其工作区中包含哪些组件、驱动程序、中间件和板支持包。此功能在极简主义、可重复性和 CI/CD
    发表于 04-07 07:11

    图像上两个多边形的ROI区域,如何获得这两个ROI区域重合部分的ROI

    labview中,图像上两个多边形的ROI区域,如何获得这两个ROI区域重合部分的ROI
    发表于 03-16 14:03

    工厂人员定位软件管理系统从部署实施流程、ROI分析到风险与避坑要点详解(二)

    本文详解工厂人员定位系统部署全流程,涵盖勘测、POC验证、分阶段实施及验收培训;结合ROI分析与风险规避要点,助力企业实现安全、高效、合规的人员管理智能化升级。
    的头像 发表于 01-14 17:33 217次阅读

    工厂人员定位工卡从部署实施、典型应用、成本与ROI分析等详解(二)

    本文详解工厂人员定位工卡的部署实施、典型应用与成本ROI。涵盖UWB/蓝牙/RFID融合技术的安装流程、化工等高危场景应用案例,实现精准定位、电子围栏报警、快速救援,提升安全与管理效率,并提供硬件、软件及文档交付清单,助力企业高效落地。
    的头像 发表于 12-24 16:27 1200次阅读

    结构体声明与定义

    符号整数表示 } 这样,我们就相当于描绘好了一个框架,以后要用的话直接定义一个这种类型的变量就好了。 2、定义 我们刚刚申请了一个名叫Info的结构体类型,那么理论上
    发表于 12-11 07:52

    【嘉楠堪智K230开发板试用体验】高校竞赛-2025电赛-E题

    (x, y, w, h, color=(255, 0, 0), thickness=2) ​ # 缩小 ROI,避免贴边 margin = 8 # 根据情况调 roi_x = max(x
    发表于 08-21 15:32

    找正方形的代码我把roi删除过后能识别到正方形,加上roi后就识别不出来,为什么?

    找正方形的代码我把roi删除过后能识别到正方形,加上roi后就识别不出来,更改roi为更大更稳定的范围也识别不到,麻烦解答一下,谢谢
    发表于 08-14 06:23

    程序总是报错Out of fast frame buffer stack memory,怎么解决?

    KeyButtonWIDTH, HEIGHT = 800, 480# 保持原分辨率key = KeyButton()roi1 = (200, 120, 450, 250)# 保持原ROIthreshold
    发表于 08-13 06:40

    【GM-3568JHF开发板免费体验】OpenCV 视频目标跟踪 ( CamShift)

    , y, width, height) x, y, w, h = 350, 250, 300, 300 track_window = (x, y, w, h) # 设置 ROI (Region
    发表于 08-09 13:19

    抖音电商API粉丝行为分析,精准营销ROI翻番!

    回报率(ROI)。本文将一步步解析如何通过API驱动的粉丝行为分析,让您的ROI轻松翻倍。 第一步:理解抖音电商API的核心功能 抖音电商API允许商家以编程方式访问平台数据,包括粉丝的互动、购买和偏好信息。关键数据点包括: 粉丝活跃
    的头像 发表于 08-01 14:39 1221次阅读
    抖音电商API粉丝行为分析,精准营销<b class='flag-5'>ROI</b>翻番!

    定义IO初始化结构体

    由上述IOPORT相关功能的枚举类型我们可以知道,在对IOPORT模块进行初始化时需要根据情况配置它们。因此我们定义一个IOPORT初始化的结构体类型IOPORT_Init_t,它的成员包括了由上述所有枚举类型所声明的变量,因此
    的头像 发表于 07-16 16:26 1573次阅读

    HarmonyOS应用自定义键盘解决方案

    定义键盘是一种替换系统默认键盘的解决方案,可实现键盘个性化交互。允许用户结合业务需求与操作习惯,对按键布局进行可视化重构、设置多功能组合键位,使输入更加便捷和舒适。在安全防护层面,自定义键盘可以
    的头像 发表于 06-05 14:19 2627次阅读

    低压差稳压器的基本定义和特性

    欢迎来到芝识课堂!从本文开始,我们要为您介绍在电源电路设计中非常重要,还经常露面的“大明星”——低压差稳压器。我们会介绍低压差稳压器的基本定义、内部原理、工作方式以及它们的电气特性。首先,我们
    的头像 发表于 06-05 11:46 2110次阅读
    低压差稳压器的基本<b class='flag-5'>定义</b>和特性

    基于LockAI视觉识别模块:C++使用图像的统计信息

    在图像处理中,统计信息可以帮助我们了解图像的特性,例如区域内的像素分布、颜色转换以及特定区域的分析。本文将介绍基于LockAI视觉识别模块如何提取兴趣区域(ROI)、转换颜色通道、计算均值和标准差
    发表于 05-08 10:31