c# opencv 轮廓检测_基于OpenCV的区域分割、轮廓检测和阈值处理
OpenCV是一个巨大的开源库,广泛用于计算机视觉,人工智能和图像处理领域。它在现实世界中的典型应用是人脸识别,物体检测,人类活动识别,物体跟踪等。
现在,假设我们只需要从整个输入帧中检测到一个对象。因此,代替处理整个框架,如果可以在框架中定义一个子区域并将其视为要应用处理的新框架,该怎么办。我们要完成一下三个步骤:
• 定义兴趣区
• 在ROI中检测轮廓
• 阈值检测轮廓轮廓线
什么是ROI?
简而言之,我们感兴趣的对象所在的帧内的子区域称为感兴趣区域(ROI)。
我们如何定义ROI?
在输入帧中定义ROI的过程称为ROI分割。
在“ ROI细分”中,(此处)我们选择框架中的特定区域,并以矩形方法提供其尺寸,以便它将在框架上绘制矩形的ROI。
(输出)蓝色矩形覆盖的区域是我们的投资回报率
现在,如果您也想绑定感兴趣的对象,那么我们可以通过在ROI中找到轮廓来实现。
什么是轮廓?
轮廓线是 表示或说是限制对象形状的轮廓。
如何在框架中找到轮廓?
对我而言,在将ROI框架设为阈值后,找到轮廓效果最佳。因此,要找到轮廓,手上的问题是-
什么是阈值?
阈值不过是图像分割的一种简单形式。这是将灰度或rgb图像转换为二进制图像的过程。例如
(这是RGB帧)
(这是二进制阈值帧)
因此,在对rgb帧进行阈值处理后,程序很容易找到轮廓,因为由于ROI中感兴趣对象的颜色将是黑色(在简单的二进制脱粒中)或白色(在如上所述的反向二进制脱粒中),因此分割(将背景与前景即我们的对象分开)将很容易完成。
在对框架进行阈值处理并检测到轮廓之后,我们应用凸包技术对围绕对象点的紧密拟合凸边界进行设置。实施此步骤后,框架应如下所示-
我们可以做的另一件事是,我们可以遮盖ROI以仅显示被检测到的轮廓本身覆盖的对象。再次-
什么是图像MASK?
图像MASK是隐藏图像的某些部分并显示某些部分的过程。这是图像编辑的非破坏性过程。在大多数情况下,它使您可以在以后根据需要调整和调整遮罩。通常,它是一种有效且更具创意的图像处理方式。
因此,基本上在这里我们将掩盖ROI的背景。为此,首先我们将修复ROI的背景。然后,在固定背景之后,我们将从框架中减去背景,并用wewant背景(这里是一个简单的黑色框架)替换它。
实施上述技术,我们应该得到如下输出:
(背景被遮罩以仅捕获对象)
这是所说明技术的理想实现的完整代码。
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')
c# opencv 轮廓检测_基于OpenCV的区域分割、轮廓检测和阈值处理相关推荐
- opencv 边缘平滑_基于OpenCV的车道检测实现(一)
无人驾驶的话题日趋起热,而车道线检测对于无人驾驶的路径规划来讲特别重要.要遵守交通规则,首先的要求便是对车道线检测,而且通过检测车道线可以进一步的检测地面指示标志.进行前碰撞预警策略设计等. 早早就对 ...
- opencv 轮廓放大_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...
title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...
- c++opencv汉字分割_基于OpenCV 的车牌识别
车牌识别是一种图像处理技术,用于识别不同车辆.这项技术被广泛用于各种安全检测中.现在让我一起基于OpenCV编写Python代码来完成这一任务. 车牌识别的相关步骤 1.车牌检测:第一步是从汽车上检测 ...
- java opencv bp网_基于Opencv自带BP网络的车标简易识别
记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1.准备工作 1.1 训练集和测试集准备 先将数据集手动划分成训练集和测试集,并分好类,比如第一类就放在文件夹名为0的文件夹下, ...
- opencv python考勤_基于opencv和dlib人脸识别的员工考勤系统
已打包生成可执行文件exe,可直接下载运行,exe文件及代码均已上传到我的github,点击传送门,打包的具体过程及教程可见pyinstaller简明教程 WorkAttendanceSystem 一 ...
- dlib疲劳检测_基于OpenCV的实时睡意检测系统
该系统可以检测一个人在开车时是否困倦,如果有的话,可以通过使用语音消息实时提醒他.该系统使用网络摄像头和电话摄像头进行实时数据传输. 研究目的 根据国家公路交通安全管理局的数据,每年均涉及疲劳驾驶事故 ...
- opencv 图片叠加_基于OpenCV的红绿灯识别代码解析
一堆废话 红绿灯分为导向灯和圆形灯.一般圆形灯在路口只有一盏灯,红灯亮时禁止直行和左转,可以右转弯.导向灯市带有箭头的,可以有两个或三个,分别指示不同方向的行车和停车.按指示的灯即可,没有右转向导向灯 ...
- opencv 处理黑夜_基于 opencv图像去噪
1. 实验步骤:先为灰度图像添加高斯噪声.胡椒噪声.盐噪声和椒盐噪声,再分别利用算术均值滤波器.几何均值滤波器.谐波和逆谐波均值滤波器进行图像去噪.模板大小为5*5. 核心代码如下: 添加各类噪声: ...
- python产品缺陷检测_基于图像处理的工业产品缺陷检测,基本操作,实现
随着机器学习的发展,对于工业产品的缺陷检测,深度网络模型检测缺陷的准确率远远高于传统图像处理算法.现在一般的做法是将传统图像技术作为预处理,或者将传统提取特征与网络深度特征相结合进一步提高准确率. 今 ...
最新文章
- 解读Go语言的2018:怎么就在中国火成这样了?
- 100行代码,使用 Pygame 制作一个贪吃蛇小游戏!
- .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)
- HDU 1518 Square
- boost::python::type_info相关的测试程序
- SQL Server---触发
- Ubuntu系统---以virtualenv方式安装Tensorflow-CPU
- SQLite基本语法
- Websocket判断逻辑Bug
- 分享8个超棒的免费高质量图标搜索引擎
- java多线程设计wait、notify、notifyall、synchronized的使用机制
- [java变量] - 字符串数组转long型数组
- Linux内核入门(三)—— C语言基本功
- 22条你不知道的微营销干货
- python按字节读文件-使用Python进行二进制文件读写(转)
- Python课设:中国五大城市PM2.5数据分析
- python熊猫弹幕_python奇闻杂技05 爬虫初步学习+jieba分词+词云库+哔哩哔哩弹幕爬取示例(数据分析pandas)...
- 数据结构 javascript 描述[Data-Structure described byJavaScript]
- 【做小游戏在Godot中遇到的问题第一篇】
- 3dsmax模型导出网页3D版gltf格式文件 #2021.6.25
热门文章
- 万豪数据泄漏门再敲警钟 酒店集团7步安全建议
- 网络虚拟化技术为双11提供灵动网络
- ffmpeg开发指南(使用 libavformat 和 libavcodec)
- 阿里达摩院青橙奖“硬核10人”出炉,钟南山寄语青年科学家
- 以“基”取胜:戴尔科技云平台 释放企业新动能
- 阿里云开放国内首个云端数据库测试平台,云已成为数据库新标准;华为5G随行WiFi发布;科大讯飞推出 AI 专用语音芯片系列……...
- 云在物联网中的惊人优势 | 技术头条
- 边缘计算精华问答 | 5G是否会“逼退”4G?
- OpenStack绝非昨日黄花 | 人物志
- java用for语句实现菱形_编写Java程序,应用for循环打印菱形、三角形