基于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 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 = 0 print ('Reset BackGround')
(0)

相关推荐

  • (11条消息) opencv学习笔记十四:使用cv2.findContours()和cv2.drawContours()实现轮廓检测

    一.cv2.findContours()函数 contours, hierarchy=cv2.findContours(image, mode, method[, contours[, hierarc ...

  • OpenCV之七段数码管识别(含代码)

    OpenCV之七段数码管识别(含代码)

  • 【OpenCV读取标记点坐标】管道测速

    文章目录 一.项目简介 二.思考步骤 1. 图像二值化 2. 滤波去噪 3. Canny算法检测边缘 4. 查找轮廓并计算 5. 绘制轮廓并表示质心 三.测试结果 四.工程代码 一.项目简介 昨天一个 ...

  • opencv---cv2.drawContours() 轮廓绘制

    opencv---cv2.drawContours() 轮廓绘制 咸蛋黄 咸蛋黄 我就是我 ,不一样的蛋黄 我是咸蛋黄,我为自己带盐 cv2.drawContours() cv2.drawContou ...

  • OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标

    OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标 1.寻找轮廓 声明:在寻找图像轮廓之前需要对图像进行阈值分割或者Canny.拉普拉斯等边缘检测算子处理. 寻找轮廓的算子: findContours( ...

  • CV:cv2实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型

    CV:cv2实现检测几何形状并进行识别.输出周长.面积.颜色.形状类型 输出结果 实现代码 # -*- coding: utf-8 -*- #OpenCV实现检测几何形状并进行识别.输出周长.面积.颜 ...

  • OpenCV探索之路(十一):轮廓查找和多边形包围轮廓

    Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...

  • 基于OpenCV实战:车牌检测

    重磅干货,第一时间送达 拥有思维导图或流程将引导我们朝着探索和寻找实现目标的正确道路的方向发展.如果要给我一张图片,我们如何找到车牌并提取文字? 一般思维步骤: 识别输入数据是图像. 扫描图像以查看由 ...

  • 基于OpenCV的面部关键点检测实战

    重磅干货,第一时间送达 这篇文章概述了用于构建面部关键点检测模型的技术,这些技术是Udacity的AI Nanodegree程序的一部分. 概述 在Udacity的AIND的最终项目中,目标是创建一个 ...

  • 基于OpenCV的路面质量检测

    重磅干货,第一时间送达 路面分类 01.RTK数据集 02.路面类型分类 训练数据文件夹结构 classes = os.listdir('training_data')num_classes = le ...

  • 基于OpenCV的实时睡意检测系统

    重磅干货,第一时间送达 该系统可以检测一个人在开车时是否困倦,如果有的话,可以通过使用语音消息实时提醒他.该系统使用网络摄像头和电话摄像头进行实时数据传输. 01.研究目的 根据国家公路交通安全管理局 ...

  • MaskRCNN 基于OpenCV DNN的目标检测与实例分割

    原文:MaskRCNN 基于OpenCV DNN的目标检测与实例分割 - AIUAI 这里主要记录基于 OpenCV 4.x DNN 模块和 TensorFlow MaskRCNN 开源模型的目标检测 ...

  • 基于OpenCV的实战:轮廓检测(附代码解析)

    重磅干货,第一时间送达 利用轮廓检测物体可以看到物体的各种颜色,在这种情况下放置在静态和动态物体上.如果是统计图像,则需要将图像加载到程序中,然后使用OpenCV库,以便跟踪对象. 每当在框架中检测到 ...

  • 基于OpenCV实战:绘制图像轮廓(附代码)

    重磅干货,第一时间送达 山区和地形图中海拔高的区域划出的线称为地形轮廓,它们提供了地形的高程图.这些线条可以手动绘制,也可以由计算机生成.在本文中,我们将看到如何使用OpenCV在简单图像上绘制轮廓线 ...

  • 基于OpenCV实战:动态物体检测

    重磅干货,第一时间送达 最近,闭路电视安全系统运行着多种算法来确保安全,例如面部识别,物体检测,盗窃检测,火灾警报等.我们在运动检测的基础上实现了许多算法,因为在空闲帧上运行所有这些进程没有任何意义. ...

  • 基于OpenCV的视障人士实时目标检测

    重磅干货,第一时间送达 一.概述 计算机视觉领域一直是一个活跃的研究领域,在本文中,我们让设备实时与其应用程序(对象检测)相结合并运行. 二.硬件 设备:程序将在其上运行,由于该设备将安装在手杖上,并 ...