OpenCV立体图像深度图Depth Map基础

目录
  • 目标
  • 基础
  • 代码

目标

在本节中,将学习

  • 根据立体图像创建深度图

基础

在上一节中,看到了对极约束和其他相关术语等基本概念。如果有两个场景相同的图像,则可以通过直观的方式从中获取深度信息。下面是一张图片和一些简单的数学公式证明了这种想法。

上图包含等效三角形。编写它们的等式将产生以下结果:

xxx和x′x'x′是图像平面中与场景点3D相对应的点与其相机中心之间的距离。BBB是两个摄像机之间的距离(已知),fff是摄像机的焦距(已知)。简而言之,上述方程式表示场景中某个点的深度与相应图像点及其相机中心的距离差成反比。因此,利用此信息,可以得出图像中所有像素的深度。

因此,可以在两个图像之间先找到对应的匹配项。一旦找到匹配项,就能获得深度(disparity)。

代码

下面的代码片段显示创建视差图的简单过程。

import cv2
import numpy as np
from matplotlib import pyplot as plt
imgL = cv2.imread('tsukuba_l.png', 0)
imgR = cv2.imread('tsukuba_r.png', 0)
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(imgL, imgR)
plt.subplot(131)
plt.imshow(imgL, 'gray')
plt.title('imgL')
plt.xticks([])
plt.yticks([])
plt.subplot(132)
plt.imshow(imgR, 'gray')
plt.title('imgR')
plt.xticks([])
plt.yticks([])
plt.subplot(133)
plt.imshow(disparity, 'gray')
plt.title('disparity')
plt.xticks([])
plt.yticks([])
plt.show()

下面的图像包含原始图像(左)及其视差图(右)。如图所见,结果受到高度噪声的污染。通过

调整numDisparitiesblockSize的值,可以获得更好的结果。

当熟悉StereoBM后,可以微调一些参数以获得更好、更平滑的结果。部分参数如下所示:

texture_threshold:过滤出没有足够纹理的区域以获得可靠匹配的区域

Speckle range 和 size:基于块的匹配器通常会在对象边界附近产生“斑点”,其中匹配窗口捕获一侧的前景和在另一场景中的背景,在此场景中,匹配器还在桌子上找到的小片虚假匹配。要摆脱这些问题,可以使用speckle_sizespeckle_range参数来控制后处理的深度图像。speckle_size是视差斑点下的像素数,speckle_range控制必须被视为相同斑点的一部分最近距离

Number of disparities:滑动窗口的像素数。越大表明可见深度的范围就越大,但是需要更多的计算代价,最大视差值与最小视差值之差, 窗口大小必须是16的整数倍,int 型

min_disparity:从开始搜索的左像素的x位置开始的偏移量

uniqueness_ratio:另一个后过滤步骤。如果最佳匹配视差不足够好于搜索范围中的所有其他视差,则将像素滤出。如果texture_threshold和斑点过滤仍在通过虚假匹配,则可以尝试进行调整

prefilter_size和prefilter_cap:预过滤阶段,可标准化图像亮度并增强纹理,以准备块匹配。通常,不需要调整这些参数

附加资源

docs.opencv.org/4.x/dd/d53/…

Ros stereo img processing wiki page

StereoBM

以上就是OpenCV立体图像深度图Depth Map基础的详细内容,更多关于OpenCV立体图像深度图的资料请关注我们其它相关文章!

(0)

相关推荐

  • OpenCV特征匹配和单应性矩阵查找对象详解

    目录 目标 基础 实现 附加资源 目标 在本章中,将学习 将从Calib3D模块中混淆特征匹配和找到(单应性矩阵)homography,以查找复杂图像中的已知对象. 基础 在之前的内容中,使用了一个query image,在其中找到了一些特征点,拍摄了另一张train image,也在该图像中找到了特征,找到了其中最好的匹配.简而言之,在另一张杂乱的图像中找到了物体某些部分的位置.该信息足以准确地在train image上找到对象. 为此,可以使用calib3d模块的函数,即cv2.findHo

  • OpenCV 光流Optical Flow示例

    目录 目标 光流 OpenCV 中的 Lucas-Kanade 光流 OpenCV 中的密集光流 目标 在本章中,将学习: 使用 Lucas-Kanade 方法理解光流的概念及其估计 使用cv2.calcOpticalFlowPyrLK()等函数来跟踪视频中的特征点 使用cv2.calcOpticalFlowFarneback()方法创建一个密集的光流场 光流 光流是由物体或相机的运动引起的图像物体在两个连续帧之间的明显运动的模式.它是二维向量场,其中每个向量都是一个位移向量,显示点从第一帧到第

  • 基于Opencv图像识别实现答题卡识别示例详解

    目录 1. 项目分析 2.项目实验 3.项目结果 总结 在观看唐宇迪老师图像处理的课程中,其中有一个答题卡识别的小项目,在此结合自己理解做一个简单的总结. 1. 项目分析 首先在拿到项目时候,分析项目目的是什么,要达到什么样的目标,有哪些需要注意的事项,同时构思实验的大体流程. 图1. 答题卡测试图像 比如在答题卡识别的项目中,针对测试图片如图1 ,首先应当实现的功能是: 能够捕获答题卡中的每个填涂选项. 将获取的填涂选项与正确选项做对比计算其答题正确率. 2.项目实验 在对测试图像进行形态学操

  • OpenCV使用KNN完成OCR手写体识别

    目录 目标 手写数字的OCR 也可以用来预测单个数字 英文字母的OCR 目标 在本章中,将学习 使用kNN来构建基本的OCR应用程 使用OpenCV自带的数字和字母数据集 手写数字的OCR 目标是构建一个可以读取手写数字的应用程序.为此,需要一些 train_data 和test_data .OpenCV git项目中有一个图片 digits.png (opencv/samples/data/ 中),其中包含 5000 个手写数字(每个数字500个),每个数字都是尺寸大小为 20x20 的图像.

  • OpenCV目标检测Meanshif和Camshift算法解析

    目录 学习目标 Meanshift OpenCV中的Meanshift Camshift OpenCV中的Camshift 附加资源 学习目标 在本章中,将学习用于跟踪视频中对象的Meanshift和Camshift算法 Meanshift Meanshift背后的原理很简单,假设有点的集合(它可以是像素分布,例如直方图反投影). 给定一个小窗口(可能是一个圆形),必须将该窗口移动到最大像素密度(或最大点数)的区域.如下图所示: 初始窗口以蓝色圆圈显示,名称为“C1”.其原始中心以蓝色矩形标记,

  • OpenCV之理解KNN邻近算法k-Nearest Neighbour

    目录 目标 理论 OpenCV中的kNN 目标 在本章中,将理解 k最近邻(kNN)算法的概念 理论 kNN是可用于监督学习的最简单的分类算法之一.这个想法是在特征空间中搜索测试数据的最近邻.用下面的图片来研究它. 在图像中,有两个族类,蓝色正方形和红色三角形.称每一种为类(Class).他们的房屋显示在他们的城镇地图中,我们称之为特征空间( Feature Space). (可以将特征空间视为投影所有数据的空间.例如,考虑一个2D坐标空间.每个数据都有两个特征,x和y坐标.可以在2D坐标空间中

  • python OpenCV实现图像特征匹配示例详解

    目录 目标 Brute-Force匹配器的基础 使用ORB描述符进行Brute-Force匹配 什么是Matcher对象? 带有SIFT描述符和比例测试的Brute-Force匹配 基于匹配器的FLANN 目标 在本章中,将学习: 如何将一个图像中的特征与其他图像进行匹配 在OpenCV中使用Brute-Force匹配器和FLANN匹配器 Brute-Force匹配器的基础 暴力匹配器很简单.它使用第一组中一个特征的描述符,并使用一些距离计算将其与第二组中的所有其他特征匹配.并返回最接近的一个.

  • OpenCV实现图像细化算法

    目录 1.基础概念 2.细化过程 3.代码实现 4.实验结果 1.基础概念 图像细化(Image Thinning),一般指二值图像的骨架化(Image Skeletonization)的一种操作运算.细化是将图像的线条从多像素宽度减少到单位像素宽度过程的简称,一些文章经常将细化结果描述为“骨架化”.“中轴转换”和“对称轴转换”. 细化技术的一个主要应用领域是位图矢量化的预处理阶段,相关研究表明,利用细化技术生成的位图的骨架质量受到多种因素的影响,其中包括图像自身的噪声.线条粗细不均匀.端点的确

  • openCV提取图像中的矩形区域

    改编自详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)原文是c++版,我改成了python版,供大家参考学习. 主要思想:边缘检测->轮廓检测->找出最大的面积的轮廓->找出顶点->投影变换 import numpy as np import cv2 # 这个成功的扣下了ppt白板 srcPic = cv2.imread('2345.jpg') length=srcPic.shape[0] depth=srcPic.shape[1] polyPic = srcPic shr

  • Python OpenCV 基于图像边缘提取的轮廓发现函数

    基础知识铺垫 在图像中,轮廓可以简单的理解为连接具有相同颜色的所有连续点(边界)的曲线,轮廓可用于形状分析和对象检测.识别等领域. 轮廓发现的原理:先通过阈值分割提取目标物体,再通过边缘检测提取目标物体轮廓. 一个轮廓就是一系列的点(像素),这些点构成了一个有序的点集合. 使用 cv2.findContours 函数可以用来检测图像的边缘. 函数原型说明 contours, hierarchy = cv2.findContours(image, mode, method[, contours[,

  • 如何利用Opencv实现图像的加密解密

    目录 1.基础:基于异或操作实现图像加密解密 Opencv-python代码实现 效果展示: 2.进阶:基于混沌序列构成异或模板实现图像加密解密 结果展示: 总结 1.基础:基于异或操作实现图像加密解密 一般情况下,图像的加密和解密过程是通过按位异或运算实现的.将原始图像与密钥图像进行按位异或,可以实现加密,将加密后的图像与密钥图像再进行按位异或可以实现解密过程. Opencv-python代码实现 import cv2 import numpy as np demo = cv2.imread(

  • Python OpenCV实现图像模板匹配详解

    目录 1.什么是模板匹配及模板匹配方法matchTemplate() 介绍 素材准备 2.单模板匹配 2.1 单目标匹配 2.2 多目标匹配 3.多模板匹配 1.什么是模板匹配及模板匹配方法matchTemplate() 介绍 提供一个模板图像,一个目标图像,且满足模板图像是目标图像的一部分,从目标图像中寻找特定的模板图像的过程,即为模板匹配.OpenCV提供了matchTemplate()方法帮助我们实现模板匹配. 该方法语法如下: cv2.matchTemplate(image, templ

  • OpenCV实现图像背景虚化效果原理详解

    目录 0 写在前面 1 小孔成像 2 光学成像 3 虚化效果 4 代码实战 0 写在前面 相信用过相机的同学都知道虚化特效,这是一种使焦点聚集在拍摄主题上,让背景变得朦胧的效果,例如本文最后实现的背景虚化效果 相机虚化特效背后的原理是什么?和计算机视觉有什么关系?本文带你研究这些问题. 1 小孔成像 小学我们就知道,没有光就不存在图像,为了产生图像,场景必须有一个或多个.直接或间接的光源. 如图所示,光照主要分为三类: 散射 直接光照 漫反射 在获得光源后,将产生从物体到检测平面的光线. 由于从

  • Python+OpenCV手势检测与识别Mediapipe基础篇

    目录 前言 项目效果图 认识Mediapipe 项目环境 代码 核心代码 视频帧率计算 完整代码 项目输出 结语 前言 本篇文章适合刚入门OpenCV的同学们.文章将介绍如何使用Python利用OpenCV图像捕捉,配合强大的Mediapipe库来实现手势检测与识别:本系列后续还会继续更新Mediapipe手势的各种衍生项目,还请多多关注! 项目效果图 视频捕捉帧数稳定在(25-30) 认识Mediapipe 项目的实现,核心是强大的Mediapipe ,它是google的一个开源项目: 功能

  • python opencv实现图像边缘检测

    本文利用python opencv进行图像的边缘检测,一般要经过如下几个步骤: 1.去噪 如cv2.GaussianBlur()等函数: 2.计算图像梯度 图像梯度表达的是各个像素点之间,像素值大小的变化幅度大小,变化较大,则可以认为是出于边缘位置,最多可简化为如下形式: 3.非极大值抑制 在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点.对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的.如下图所示: 4.滞后阈值 现在要确定那些边界才是真正的

  • Python Opencv实现图像轮廓识别功能

    本文实例为大家分享了python opencv识别图像轮廓的具体代码,供大家参考,具体内容如下 要求:用矩形或者圆形框住图片中的云朵(不要求全部框出) 轮廓检测 Opencv-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓. import cv2 img = cv2.imread('cloud.jpg') # 灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.th

  • java通过jni调用opencv处理图像的方法

    1. 建立java文件 public class getImageFeature { static{ System.loadLibrary("getImageFeatureDll"); } public native int getImageFeatureByName(String filename); public native int getImageFeatureByMemory(); public static void main(String[] args) { getIma

随机推荐