OpenCV Tutorials 27 – 核级几何和立体图像深度图

核级几许和立体图画深度图

一、核级几许

本末节中咱们主要学习多视角几许学根底以及什么是对极、对极线、对极约束等。

1. 根底概念

当咱们运用针孔相机拍照图画时,咱们会丢失一个重要信息,即图画的深度。 或者图工龄越长退休金越多吗像中的算法导论每个点间隔windows怎样激活相机有多远,由于矩阵的乘法运算它是 3D 到 2D 的转windows7旗舰版换。 因而,咱们是否矩阵的乘法运算能够运用这些相机找到深度信息是一个重要的问windows许可证行将过期怎样办题。 答案是运用不止一台相机httpwatch。 咱们的眼睛以相似的方式作业,咱们运用两个相机算法设计与分析(两只眼睛),这被称为http://192.168.1.1登录立体视觉宫颈癌。 那么让咱们看看OpenCV在这个领域供给了什么。

(Gary Bradsky 的《Le工商银行arning OpenCV》在这个领域有许多材料。)

在进入深算法导论度图画之前,Windows让咱们首要了解多视图几许中的windows怎么激活一些根本概念。 在本httpclient节中,咱们将处理对极几许。 请拜见下图,该图显示了运用两个http 404摄像头拍照同一场景图画的根本设置。

OpenCV Tutorials 27 - 核级几许和立体图画深度图

假如咱们只运用左边相机,咱们将无法在图画中找到与点 x 对windows7怎么重装系统应的 3D 点,由于 OX 线上的每个点都投影矩阵游戏到图画平面上的同一点。但也要考虑正确的图画。现在 OX 线上的不同点投影到右平面中的不同点 (x’)。因而,通工资超过5000怎样扣税过这两http://192.168.1.1登录张图画,咱们能够对正确的 3D 点进行三角丈量。这http://192.168.1.1登录是整枸杞个想法。

OX 上不同点的投影在右平面上构成矩阵的秩矩阵游戏一条线(线 l’)。咱们称矩阵它为对应于点 x 的外延线。矩阵这意味着,要找到正确图矩阵的乘法运算画上的点 x,沿着这条线查找。它应该在这条线上的某个当地(这样想,要在其他图画中找到匹配点,您无需查找整个图画,只需沿着 epiline 查找即可。因而它windows7旗舰版供给了更http协议矩阵的乘法运算好的性能和精确性)。windows7旗舰版这称为对算法工程师极约束。相同,一切点在另一幅图画中都有其对应的外算法工程师延线。平面 Xwindows更新有必要吗OO’ 称为对极平windows10激windows7旗舰版活密钥面。

O 和 O’ 是相机中心。从上面给出的设置中windows7旗舰版,您能httpclient够看到右windows更新有必要吗侧相机 O’ 的投影在左边图画上的点 e 处看到。它被称为极点。 Epipole 是经过相机中心和图画平面的线的交点。相似地,e’ 是左相机的极点。在某些情况下,您将无法在图画中找到极点矩阵的逆,它们或许在工龄差一年工资差多少图画之外(这意矩阵相乘怎样算算法的时间复杂度取决于味着,一台摄像机看不到另一台摄像机)。

一切的epilines都经过它的epipole。windows11有必要升级吗所以要找算法的五个工龄差一年工资差多少特性到极点的位windows11有必要晋级吗置,咱们能够找到宫颈癌许多极线并找到它们的交点。

因而,在本节中,咱们专心于寻觅极线和极线。但要找到它们,咱们还windows10激活密钥需求别的两种成分,根矩阵的逆本矩阵 (F) 和根本矩阵 (E)。矩阵和行列式的区别根本矩阵包括有关平移和旋转的信息,这windows许可证即将过期怎么办些信息描述了第二个摄像机相对矩阵转置于第一个摄像机在大局坐标中的方位。请拜见下图(图片供给:Gary Bradsky 的 Learning OpenCV):

OpenCV Tutorials 27 - 核级几许和立体图画深度图

windows许可证行将过期怎样办咱们更喜windows许可证行将过期怎样办欢在像素坐标中进行丈量,对吧? Fundamengooglet矩阵和行列式的区别al Matrix 包括与宫颈癌 Essential Mwindows10激活密钥atrix 相同的httpwatchttp 404h信息以工商银行及有关两个相机的内涵函数的信息,算法的时间复杂度取决于因而咱们能够在像素坐标中winhttp://www.baidu.comdows许可证行将过期怎样办相关两个相机。 (假如咱们运用校正后的图画windows许可证行将过期怎样办并经过除windows7怎么重装系统以焦距来归一化该点,F=E)。http://192.168.1.1登录 简而言之,根本矩阵 F 将一幅图画中的算法的时刻复杂度取决于一个点映射到另一幅图画中的一条线(epiline)。 这是依据两个图画的匹配点计算得出的。 至少需求 8 个这样的点才干找到根本矩阵(运用 8 点算法时)。 更多的点是矩阵首选,并运用 RA矩阵的逆NSAC 来取得更稳健的成果。

2. 代码

所以首要咱们需求在两幅图画之间找到尽或许多的匹配来找到根本http://www.baidu.com矩阵。 为此,咱们运用 SIFT矩阵计算器 描述符和根据 FL算法的空间复杂度是指ANN 的匹配器和比率测验。

import cv2 as cv
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
def cv_show(name,img):
    cv.imshow(name,img)
    cv.waitKey(0)
    cv.destroyAllWindows()
def compare(images):
    res = np.hstack(images)
    cv_show('Compare', res)
img1 = cv.imread('left.jpg',0)  #queryimage # left image
img2 = cv.imread('right.jpg',0) #trainimage # right image
sift = cv.SIFT_create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# FLANN parameters
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
flann = cv.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
pts1 = []
pts2 = []
# ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
    if m.distance < 0.8*n.distance:
        pts2.append(kp2[m.trainIdx].pt)
        pts1.append(kp1[m.queryIdx].pt)

现在咱们得到了两个图画的最佳匹配列表。 让咱们找到根本矩阵。

pts1 = np.int32(pts1)
pts2 = np.int32(pts2)
F, mask = cv.findFundamentalMat(pts1,pts2,cv.FM_LMEDS)
# We select only inlier points
pts1 = pts1[mask.ravel()==1]
pts2 = pts2[mask.ravel()==1]

接下来咱们找矩阵的逆到外延线。 在第二张图画上绘制对应于第一张图工龄差一工商银行年工资差算法的时间复杂度取决于多少像中的点的 Epilines。 所以在这里说到正确的图画很重要。 咱们得到一系列行。windows10激活密钥 所以咱们界说了一个新函数来windows体系在图画上绘制这些线条。

def drawlines(img1,img2,lines,pts1,pts2):
    ''' img1 - image on which we draw the epilines for the points in img2
        lines - corresponding epilines '''
    r,c = img1.shape
    img1 = cv.cvtColor(img1,cv.COLOR_GRAY2BGR)
    img2 = cv.cvtColor(img2,cv.COLOR_GRAY2BGR)
    for r,pt1,pt2 in zip(lines,pts1,pts2):
        color = tuple(np.random.randint(0,255,3).tolist())
        x0,y0 = map(int, [0, -r[2]/r[1] ])
        x1,y1 = map(int, [c, -(r[2]+r[0]*c)/r[1] ])
        img1 = cv.line(img1, (x0,y0), (x1,y1), color,1)
        img1 = cv.circle(img1,tuple(pt1),5,color,-1)
        img2 = cv.circle(img2,tuple(pt2),5,color,-1)
    return img1,img2

现在咱们在两个图画算法的时间复杂度取决于中找到外延线windows11有必要晋级吗并绘制它们。

# Find epilines corresponding to points in right image (second image) and
# drawing its lines on left image
lines1 = cv.computeCorrespondEpilines(pts2.reshape(-1,1,2), 2,F)
lines1 = lines1.reshape(-1,3)
img5,img6 = drawlines(img1,img2,lines1,pts1,pts2)
# Find epilines corresponding to points in left image (first image) and
# drawing its lines on right image
lines2 = cv.computeCorrespondEpilines(pts1.reshape(-1,1,2), 1,F)
lines2 = lines2.reshape(-1,3)
img3,img4 = drawlines(img2,img1,lines2,pts2,pts1)
compare([img5,img3])
# fig = plt.figure(figsize = (20,8))
# plt.subplot(121),plt.xticks([]),plt.yticks([])
# plt.imshow(img5)
# plt.subplot(122),plt.xticks([]),plt.yticks([])
# plt.imshow(img3)
# plt.show()

OpenCV Tutorials 27 - 核级几许和立体图画深度图

您能够在左边图画中看到一切外延线都在右侧枸杞图画外部的一点处会聚。 那Go司让职工下班发算法分析的目的是手机电量截图个交汇点就是极https和http的区别点。

为了取得更好的成果,应运用具有杰出分辨率和许多非平面点的图画。

二、立体图画深度图

windows是什么意思末节咱们主公积金要学习从立体图画中创建http://192.168.1.1登录一个深度图。

1. 根底概念

在上一节课https和http的差异中,咱们看Windows到了极线约束和其他相关术语等根本概念。 咱们还看到,假如咱们有两个相同场景的图画,咱们能够直观地从中获hhttp 500ttp://192.168.1.1登录windows体系深度信息。 下宫颈癌面是一张图片和一些简单的数学公式来证明这种直觉。 (图片暗示):

OpenCV Tutorials 27 - 核级几许和立体图画深度图

上图包括等算法的有穷性是指效三角形。 写出它们的等效方程将产生以下成果:disparity=x−x′=BfZdisparityGo = x – x’ = frac{Bf}{Z}

x 和 x’ 是对应于场景点 3D 的图画平面中的点与它们的相机中心之间的间隔。 B 是两个相机之间的间隔(咱们知道),f 是相机的焦距(已经知道)。 所以简而言之,上面的等式表明场景中一个点的深度与相算法工程师矩阵游戏图画点与其相机中心的间隔差成反比。 因而,利用这些信息,咱们能够推算法的五个特性导出图画中一切httpclienthttp代理矩阵计算器的深度。

所以它找到工商银行了两个图画之间的对应匹配。 咱们已经看到了epiline约束如何使这个操作更快更精确。 一旦找到匹配项,它就会找到差异。 让咱们看看如矩阵的迹何运用 OpenCV 做到这一点。

2. 代码

imgL = cv.imread('tsukuba_l.png',0)
imgR = cv.imread('tsukuba_r.png',0)
stereo = cv.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(imgL,imgR)
# compare([imgL,imgR,disparity])
fig = plt.figure(figsize = (20,8))
plt.subplot(131),plt.xticks([]),plt.yticks([])
plt.imshow(imgL,cmap='gray')
plt.subplot(132),plt.xticks([]),plt.yticks([])
plt.imshow(imgR,cmap='gray')
plt.subplot(133),plt.xticks([]),plt.yticks([])
plt.imshow(disparity,cmap='gray')
plt.show()

OpenCV Tutorials 27 - 核级几许和立体图画深度图

下图包括原始google图画(左)及其视差图(右)。 如您所见,成果被高度噪声污染。 经过调整 numDisp工资超过5000怎么扣税arities 和 blockSize 的值,能够取枸杞得更好的成果。

当您熟悉宫颈癌 Ster工龄越长退休金越多吗eowindows10激活密钥BM 时,有一些参数,您或许需求对参数进行微调以获https和http的差异得更好、更流通矩阵的成果。参数:

  1. texture_矩阵的秩threshold:过滤掉没有http://192.168.1.1登录满足纹路进行牢靠匹配的http://192.168.1.1登录区域
  2. Speckle range and size:算法设计与分析根据块的匹配器一般会算法设计与分析在目标鸿沟邻近产生“散斑”,其https和http的区别中匹配窗口在一侧捕捉前景,在另一侧捕捉背景。在这个场景中,匹配器好像也在桌子上的投影纹路中发现了小的虚假匹配。为了消矩阵相乘怎样算除这些伪影,咱们运用由 speckle_size 和 speckle_range 参数操控的散斑滤波器对视差图画进工龄越长退休金越多吗行后处理。 speckle_size 是视差斑点被视为“散斑”的像素数。 speckle_range 操控值差异的接近Go积金程度必须被视工龄差一年工资差多少为同一 blob 的一部分。
  3. 视差dispariti算法工程师es数:将windows7旗舰版窗口滑过多少像素。它越大,可见深度的规模越大,但需求工龄越长退休windows10金越多吗更多的计算。
  4. min_disparity:开始查找的左边像素的 x 方位的偏移windows体系量。
  5. uniqueness_ratio:另一个后过滤步骤。算法的有穷性是指假如最佳匹配视差没有比查找规模内的一切其他视差满足好,则过滤掉该像素。假如 texture_threshold 和散斑过滤依然允许虚假匹windows怎么激活配,您能够尝试调整它。
  6. prefilter_size 和 prefilter_cap:预过算法的空间复杂度是指滤阶段,标准化图画亮度并增强纹路,为块匹配做准备。一般你不需求调整这些。

3. 弥补材料

wiki.ros.org/stereo_imag…

4. 练习

#!/usr/bin/env python
'''
Simple example of stereo image matching and point cloud generation.
Resulting .ply file cam be easily viewed using MeshLab ( http://meshlab.sourceforge.net/ )
'''
# Python 2/3 compatibility
from __future__ import print_function
import numpy as np
import cv2 as cv
ply_header = '''ply
format ascii 1.0
element vertex %(vert_num)d
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
'''
def write_ply(fn, verts, colors):
    verts = verts.reshape(-1, 3)
    colors = colors.reshape(-1, 3)
    verts = np.hstack([verts, colors])
    with open(fn, 'wb') as f:
        f.write((ply_header % dict(vert_num=len(verts))).encode('utf-8'))
        np.savetxt(f, verts, fmt='%f %f %f %d %d %d ')
def main():
    print('loading images...')
    imgL = cv.pyrDown(cv.imread(cv.samples.findFile('aloeL.jpg')))  # downscale images for faster processing
    imgR = cv.pyrDown(cv.imread(cv.samples.findFile('aloeR.jpg')))
    # disparity range is tuned for 'aloe' image pair
    window_size = 3
    min_disp = 16
    num_disp = 112-min_disp
    stereo = cv.StereoSGBM_create(minDisparity = min_disp,
        numDisparities = num_disp,
        blockSize = 16,
        P1 = 8*3*window_size**2,
        P2 = 32*3*window_size**2,
        disp12MaxDiff = 1,
        uniquenessRatio = 10,
        speckleWindowSize = 100,
        speckleRange = 32
    )
    print('computing disparity...')
    disp = stereo.compute(imgL, imgR).astype(np.float32) / 16.0
    print('generating 3d point cloud...',)
    h, w = imgL.shape[:2]
    f = 0.8*w                          # guess for focal length
    Q = np.float32([[1, 0, 0, -0.5*w],
                    [0,-1, 0,  0.5*h], # turn points 180 deg around x-axis,
                    [0, 0, 0,     -f], # so that y-axis looks up
                    [0, 0, 1,      0]])
    points = cv.reprojectImageTo3D(disp, Q)
    colors = cv.cvtColor(imgL, cv.COLOR_BGR2RGB)
    mask = disp > disp.min()
    out_points = points[mask]
    out_colors = colors[mask]
    out_fn = 'out.ply'
    write_ply(out_fn, out_points, out_colors)
    print('%s saved' % out_fn)
    cv.imshow('left', imgL)
    # cv.imshow('right', imgR)
    cv.imshow('disparity', (disp-min_disp)/num_disp)
    cv.waitKey()
    print('Done')
if __name__ == '__main__':
    print(__doc__)
    main()
    cv.destroyAllWindows()
Simple example of stereo image matching and point cloud generation.
Resulting .ply file cam be easily viewed using MeshLab ( http://meshlab.sourceforge.net/ )
loading images...
computing disparity...
generating 3d point cloud...
out.ply saved
Done

OpenCV Tutorials 27 - 核级几许和立体图画深度图

发表评论

提供最优质的资源集合

立即查看 了解详情