c# opencv 轮廓检测_基于OpenCV的区域分割、轮廓检测和阈值处理

cd5bfe955a61602d097fab0c563692e8.gif

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

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

• 定义兴趣区

• 在ROI中检测轮廓

• 阈值检测轮廓轮廓线

什么是ROI?

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

我们如何定义ROI?

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

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

a1721dcf10472c2a9e717e023eb01e09.png

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

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

什么是轮廓?

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

如何在框架中找到轮廓?

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

什么是阈值?

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

462dc7d6f3f1ce30c297ae43a33e3e19.png

(这是RGB帧)

9ce7e7ff95bcf075f4f8f0ab35bec255.png

(这是二进制阈值帧)

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

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

a3098741bbf8fcbf0e81d9eb39611946.png

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

什么是图像MASK?

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

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

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

27a4e97f4209ef22f80bca61b9bd543d.png

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

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

import cv2import numpy as npimport copyimport mathx=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 captureddef 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 = 0        print ('Reset BackGround')    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

斑马888t打印机墨盒安装_硒鼓?墨盒?究竟哪个才是打印机的“灵魂伴侣”?...

硒鼓和墨盒是当代打印机完成打印必不可少的配件,在打印过程中,如果没有这两样,那么打印机将无法启动,打印不出任何东西。但同样作为可以让打印机成像的东西,这二者之间也有着很大的区别。而今天,墨弘办公耗…

当前不会命中断点_原神:体验服新角色胡桃,0命就能起飞,难道是策划良心发现了?...

枪开黄泉路,蝶引来世桥。——胡桃文/拾柒​导读:原神的玩家最喜欢调侃的一句话大概就是“蒙德人上人,璃月弟中弟”。其实也就是当前1.2版本,璃月基本上拿不出一个“挑大梁”的角色。而玩家的主要核心输出角或者辅助角色基本都是来…

计算机启动类型bios,UEFI还是Legacy BIOS?如何确定Windows启动类型

经常会有朋友在Q上询问关于系统方面的问题,多半都与安装方法有关,因此经常需要判断电脑上的Windows启动方式是什么,是UEFI还是BIOS呢?为了方便后来人查看,这里豆豆总结三个方法:最装X方法:在安装…

云耀云服务器性能怎么样,华为云测评:2CPU+4G内存+5M带宽的云耀云服务器HECS

最近入手了一台华为云的云耀云服务器!是一台经典的245配置!价格非常美丽(新用户有特价)!特此写一篇测评,这是第一篇针对国内云服务器的测评!云服务器测评内容全是博主亲测的,商家后来配置变更/网络变化&…

从714里连续减去6减几次得0_数学干货 | 小学数学1—6年级基础知识整理 ,预习复习都能用...

小学数学基础知识整理(一到六年级)小学一年级:初步认识加减法。学会基础加减。小学二年级:完善加减法,表内乘法,学会应用题,基础几何图形。小学三年级:学会万以内加减法,长度单位和质量单位&…

云信服务器代码,云信一键登录服务端API文档-一键登录-网易云信开发文档

一键登录 >服务端 API 文档一键登陆服务端API文档接口概述API调用说明本文档中,所有调用网易云信服务端接口的请求都需要按此规则校验。API checksum校验以下参数需要放在Http Request Header中参数参数说明AppKey开发者平台分配的appkeyNonce随机数(最大长度128…

c# 溢出抛异常_Rust竟然没有异常处理?

学习Rust最好的方法,就是和其他主流语言,比如Java、Python进行对比学习。不然怎么能get到它的特别呢?1. 主流模式:try-catch-finally基本上,当你学会了某种语言的try/catch,对这套机制的理解就能够迁移到其…

运营商 sni 服务器,什么是服务器名称指示(SNI)

在HTTPS 大热的今日,在过去的HTTP时代,解决基于名称的主机在同一IP地址上托管多个网站的问题并不难。当一个客户端请求某特定网站时,把请求的域名作为主机头(Host)放在HTTP Header中,服务器端知道应该把请求引向哪个域名&#xff…

水面反光如何拍摄_拍摄水面反射的创意

很多人都喜欢拍摄倒影,不同介质表面的倒影可以提供给我们各种各样不同的创意拍摄思路。但是从技术角度上来说,拍摄倒影其实一点都不简单,相比那些常规的拍摄内容,倒影显然需要一些技巧,像是对焦、取景、拍摄手法以及后…

电脑摄像头未能创建连接服务器,Win7中摄像头提示未能创建视频预览错误怎么办...

最近有不少用户在我们网站上提问说他们在打开摄像头的时候,就会遇到打开摄像头的时候提示“未能创建视频预览,请检查设备连接”的问题,这是怎么回事呢,出现这样的原因的话有可能是电脑中毒了或者某些相关的服务没有启动导致的&…

Ubuntu 常用命令之 date 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 date命令在Ubuntu系统中用于显示或设置系统的日期和时间。 date常见的参数 -d, --dateSTRING:显示STRING指定的时间,而不是当前时间。-u, --utc, --universal:显示或设置协调世界时间。-R, --…

局部配置和全局配置_06. 教你零基础搭建小程序(解读全局配置文件-tabBar字段)...

自从开始在知乎上发教程后,发现一个事情啊,大家对于我写的教程,都在偷偷地收藏~~但是,却没有银点赞~知乎这个平台吧,点赞的分量比收藏更大,这里也不是要赞(我知道自己还能做的更好)&…

mac系统在云服务器地址,mac如何登陆云服务器地址

mac如何登陆云服务器地址 内容精选换一换本章节指导用户获取云服务器的IP地址等网卡信息。进入弹性云服务器页面。进入云服务器详情页面。进入网卡详情页面。网卡详情页面进入虚拟IP详情页,即可根据云服务器网卡信息找到绑定的虚拟IP地址。本章节介绍如何使用弹性云…

时间转化_Excel常见时间日期函数全讲解,10个函数教你如何进行日期转化

在工作中我们经常会碰到一些需要转化或者计算时间日期的工作,这里就需要我们用到一些常见的Excel时间日期函数。今天我们就通过十个案例来教大家,如何在实际工作中对时间日期进行转化处理。函数一、显示当前日期函数TODAY()2018/10/10函数二、显示当前日…

回旋滚动_中频炉电动旋转轴承,管道回旋轴承,电炉旋转轴承

中频炉电动旋转轴承,管道回旋轴承,电炉旋转轴承,,管道旋转轴承自带双边法兰,在集尘罩管道做法兰和主管道的法兰连接,旋转轴承可以360度旋转,除尘器管道轴承可以同时承受较大的轴向、径向负荷和倾覆力矩。除尘器旋转轴承…

dao层如何调用对象_你的项目应该如何正确分层?

你好,欢迎收听极客视点。 说起应用分层,大部分人都会认为这不是很简单嘛,就Controller、Service、Mapper三层。但在“简单”背后,很多人并没有将各层级的职责划分清楚。比如在很多代码中,Controller比Service还多&…

mysql索引_MySQL索引介绍和实战

索引是什么MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构,索引的目的是提高查询效率,可以类比英语新华字典,根据目录定位词语如果没有目录呢&#xff0c…

mysql安装需要注意什么意思_mysql 安装过程及注意事项

1.1. 下载:我下载的是64位系统的zip包:下载zip的包:下载后解压:D:\软件安装包\mysql-5.7.20-winx641.2. 配置环境变量:变量名:MYSQL_HOME变量值:E:\mysql-5.7.20-winx64path里添加:%…

gitlab 端口_安装Gitlab-注意端口

文档本身并没有什么特殊,安装也很简单,只是修改端口这里如果有需要的可以看一下安装Gitlab[rootdeploy ~]# sudo yum -y install gitlab-ce默认端口是8080,避免冲突还是修改一下[rootlocalhost ~]# cat /etc/gitlab/gitlab.rb |grep 192.168.…

MySQL read-c_技术分享 | MySQL C API 参数 MYSQL_OPT_READ_TIMEOUT 的一些行为分析

作者:戴岳兵MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数。在 MySQL 的官方文档中,该参数的描述是这样的:MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt t…