openCV 3计算机视觉 Python语言实现 笔记 第4章 深度估计与分割

简介: openCV 3计算机视觉 Python语言实现 笔记 第4章 深度估计与分割

第4章 深度估计与分割

使用深度摄像头的数据来识别前景区域和背景区域。

4.1 创建模块

cameo中的捕获和处理摄像头的代码可以重用,所以讲这部分代码分离放在depth.py中。4.2 捕获深度摄像头的帧

深度相关通道的概念

深度图:灰度图像;每个像素值都是摄像头到物体表面之间距离的估计值。

点云图:彩色图像;每种颜色对应一个(x、y、z)维度空间。

视差图:灰度图像;每个像素值代表物体表面的立体视差。(立体视差:同一场景在不同视角下感觉不同。针对两个物体之间任一相互对应的两个像素点,可以度量这些像素点之间的距离,这个度量度量就是立体视差。离摄像头近的立体视差小,远的大。因此近距离的物体在视差图中会更明亮)。

有效深度掩模:表明一个给定的像素的深度信息是否有效(有效非0,无效为0)。比如,如果深度摄像头依赖红外闪光灯,那么灯光被遮挡处就无效。

4.3 从视差图得到掩模


4.4 对复制操作执行掩模


4.5 用普通摄像头进行深度估计

4.6 使用分水岭和GrabCut算法进行物体分割

GrabCut算法实现步骤:

1.定义矩形:在图片中定义含有物体的矩形。

2.定义背景:矩形外的被自动认为是背景。

3.区别前景和背景

4.建模,标记未定义像素:用高斯混合模型对背景和前景建模,并将未定义的像素标记为可能的前景或背景。

5.相邻边:每一个像素都被看作通过虚拟边和周围像素相连接,每条边都有一个属于前景或背景的概率,概率基于它与周围像素颜色上的相似性。

6.连接像素:每一个像素会与一个前景或背景节点相连接。

7.节点连接后,若节点之间的边属于不同终端,则会切断他们之间的边,这就能将图像各部分分割出来。


实例:

import numpy as np

import cv2

from matplotlib import  pyplot as plt

#加载图像

img = cv2.imread('statue_small.jpg')

#创建同形状的掩模

mask = np.zeros(img.shape[:2],np.uint8)

#创建以0填充的前景和背景模型

bgdModel = np.zeros((1,65),np.float64)

fgdModel = np.zeros((1,65),np.float64)

rect = (100,50,421,378)

cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,

           cv2.GC_INIT_WITH_RECT)

#将掩模值为0和2的转换成0,过滤掉0值像素

mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')

img = img*mask2[:,:,np.newaxis]

#显示图片

plt.subplot(121), plt.imshow(img)

plt.title('grabcut'), plt.xticks([]),plt.yticks([])

plt.subplot(122),plt.imshow(cv2.cvtColor(cv2.imread('statue_small.jpg'),

                                        cv2.COLOR_BGR2RGB))

plt.title('original'), plt.xticks([]),plt.yticks([])

plt.show()








4.6.2 使用分水岭算法进行图像分割

分水岭算法:

把图像中低密度(变化少)的区域想象成山谷,高密度的区域想象成山峰。

开始向山谷中注入水,直到不同山谷中的水开始汇聚。

为了阻止不同山谷的水汇聚,可以设置一些栅栏,最后得到的栅栏就是图像分割。


import numpy as np

import cv2

from matplotlib import  pyplot as plt

#加载图片,转换为灰度图片

img = cv2.imread("lion.jpg")

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#为图像设置一个阈值,这个操作将图像分为两部分:黑色部分和白色部分

ret, thresh = cv2.threshold(

   gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

#通过morphologyEx变换来去除噪声数据。这是一种对图像进行膨胀之后再进行腐蚀的操作,它可以提取图像特征

kernel = np.ones((3,3),np.uint8)

opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2)

#通过morphologyEx变换之后的图像进行膨胀,得到背景区域

sure_bg = cv2.dilate(opening,kernel,iterations=3)

#通过distanceTransform获取前景区域

dist_transfrom = cv2.distanceTransform(opening,cv2.DIST_L2,5)



ret,sure_fg  =  cv2.threshold(dist_transfrom,0.7*dist_transfrom.max(),255,0)

#找到前景和背景重合部分

sure_fg = np.uint8(sure_fg)

unkown = cv2.subtract(sure_bg,sure_fg)

#

ret,markers = cv2.connectedComponents(sure_fg)

#在背景区域加1,将unkown区域设置为0

markers = markers+1

markers[unkown==255] = 0

#让水漫起来将栅栏绘成红色

markers = cv2.watershed(img,markers)

img[markers==-1] = [255,0,0]

plt.imshow(img)

plt.show()


相关文章
|
13天前
|
人工智能 测试技术 API
AI计算机视觉笔记二十 九:yolov10竹签模型,自动数竹签
本文介绍了如何在AutoDL平台上搭建YOLOv10环境并进行竹签检测与计数。首先从官网下载YOLOv10源码并创建虚拟环境,安装依赖库。接着通过官方模型测试环境是否正常工作。然后下载自定义数据集并配置`mycoco128.yaml`文件,使用`yolo detect train`命令或Python代码进行训练。最后,通过命令行或API调用测试训练结果,并展示竹签计数功能。如需转载,请注明原文出处。
|
13天前
|
JSON 人工智能 数据格式
AI计算机视觉笔记二十六:YOLOV8自训练关键点检测
本文档详细记录了使用YOLOv8训练关键点检测模型的过程。首先通过清华源安装YOLOv8,并验证安装。接着通过示例权重文件与测试图片`bus.jpg`演示预测流程。为准备训练数据,文档介绍了如何使用`labelme`标注工具进行关键点标注,并提供了一个Python脚本`labelme2yolo.py`将标注结果从JSON格式转换为YOLO所需的TXT格式。随后,通过Jupyter Notebook可视化标注结果确保准确性。最后,文档展示了如何组织数据集目录结构,并提供了训练与测试代码示例,包括配置文件`smoke.yaml`及训练脚本`train.py`,帮助读者完成自定义模型的训练与评估。
|
13天前
|
机器学习/深度学习 人工智能 PyTorch
AI计算机视觉笔记三十二:LPRNet车牌识别
LPRNet是一种基于Pytorch的高性能、轻量级车牌识别框架,适用于中国及其他国家的车牌识别。该网络无需对字符进行预分割,采用端到端的轻量化设计,结合了squeezenet和inception的思想。其创新点在于去除了RNN,仅使用CNN与CTC Loss,并通过特定的卷积模块提取上下文信息。环境配置包括使用CPU开发板和Autodl训练环境。训练和测试过程需搭建虚拟环境并安装相关依赖,执行训练和测试脚本时可能遇到若干错误,需相应调整代码以确保正确运行。使用官方模型可获得较高的识别准确率,自行训练时建议增加训练轮数以提升效果。
|
13天前
|
人工智能 开发工具 计算机视觉
AI计算机视觉笔记三十:yolov8_obb旋转框训练
本文介绍了如何使用AUTODL环境搭建YOLOv8-obb的训练流程。首先创建虚拟环境并激活,然后通过指定清华源安装ultralytics库。接着下载YOLOv8源码,并使用指定命令开始训练,过程中可能会下载yolov8n.pt文件。训练完成后,可使用相应命令进行预测测试。
|
13天前
|
人工智能 并行计算 测试技术
AI计算机视觉笔记三十一:基于UNetMultiLane的多车道线等识别
该项目基于开源数据集 VIL100 实现了 UNetMultiLane,用于多车道线及车道线类型的识别。数据集中标注了六个车道的车道线及其类型。项目详细记录了从环境搭建到模型训练与测试的全过程,并提供了在 CPU 上进行训练和 ONNX 转换的代码示例。训练过程约需 4 小时完成 50 个 epoch。此外,还实现了视频检测功能,可在视频中实时识别车道线及其类型。
|
13天前
|
传感器 人工智能 算法
AI计算机视觉笔记二十七:YOLOV8实现目标追踪
本文介绍了使用YOLOv8实现人员检测与追踪的方法。通过为每个人员分配唯一ID,实现持续追踪,并可统计人数,适用于小区或办公楼出入管理。首先解释了目标检测与追踪的区别,接着详细描述了使用匈牙利算法和卡尔曼滤波实现目标关联的过程。文章提供了基于IOU实现追踪的具体步骤,包括环境搭建、模型加载及追踪逻辑实现。通过示例代码展示了如何使用YOLOv8进行实时视频处理,并实现人员追踪功能。测试结果显示,该方法在实际场景中具有较好的应用潜力。
|
13天前
|
人工智能 测试技术 PyTorch
AI计算机视觉笔记二十四:YOLOP 训练+测试+模型评估
本文介绍了通过正点原子的ATK-3568了解并实现YOLOP(You Only Look Once for Panoptic Driving Perception)的过程,包括训练、测试、转换为ONNX格式及在ONNX Runtime上的部署。YOLOP由华中科技大学团队于2021年发布,可在Jetson TX2上达到23FPS,实现了目标检测、可行驶区域分割和车道线检测的多任务学习。文章详细记录了环境搭建、训练数据准备、模型转换和测试等步骤,并解决了ONNX转换过程中的问题。
|
13天前
|
机器学习/深度学习 人工智能 测试技术
AI计算机视觉笔记二十五:ResNet50训练部署教程
该项目旨在训练ResNet50模型并将其部署到RK3568开发板上。首先介绍了ResNet50网络,该网络由何恺明等人于2015年提出,解决了传统卷积神经网络中的退化问题。项目使用车辆分类数据集进行训练,并提供了数据集下载链接。环境搭建部分详细描述了虚拟环境的创建和所需库的安装。训练过程中,通过`train.py`脚本进行了15轮训练,并可视化了训练和测试结果。最后,项目提供了将模型转换为ONNX和PT格式的方法,以便在RK3568上部署。
|
13天前
|
人工智能 监控 算法
AI计算机视觉笔记二十 八:基于YOLOv8实例分割的DeepSORT多目标跟踪
本文介绍了YOLOv8实例分割与DeepSORT视觉跟踪算法的结合应用,通过YOLOv8进行目标检测分割,并利用DeepSORT实现特征跟踪,在复杂环境中保持目标跟踪的准确性与稳定性。该技术广泛应用于安全监控、无人驾驶等领域。文章提供了环境搭建、代码下载及测试步骤,并附有详细代码示例。
|
13天前
|
机器学习/深度学习 人工智能 计算机视觉
AI计算机视觉笔记二十三:PP-Humanseg训练及onnxruntime部署
本文介绍了如何训练并使用PaddleSeg的人像分割模型PP-HumanSeg,将其导出为ONNX格式,并使用onnxruntime进行部署。首先在AutoDL服务器上搭建环境并安装所需库,接着下载数据与模型,完成模型训练、评估和预测。最后,通过paddle2onnx工具将模型转换为ONNX格式,并编写预测脚本验证转换后的模型效果。此过程适用于希望在不同平台上部署人像分割应用的开发者。