精华内容
下载资源
问答
  • 视差图和深度图有何关系I bet it’s more powerful than you think… 我敢打赌,它比您想像的还要强大…… Photo by Pereanu Sebastian on Unsplash Pereanu Sebastian在Unsplash上拍摄的照片 The question comes ...

    视差图和深度图有何关系

    I bet it’s more powerful than you think…

    我敢打赌,它比您想像的还要强大……

    The question comes up again and again; what actually is deep learning? To understand deep learning let’s start with a simple use case to frame our explanation around. That use case is one of a self driving car.

    这个问题一次又一次地出现。 深度学习到底是什么? 为了理解深度学习,让我们从一个简单的用例开始,围绕我们进行解释。 该用例是自动驾驶汽车之一。

    A self driving car is an autonomous vehicle that drives itself without any human intervention. This driving is broken down into three primary activities: see, decide, act. For example I see a red light, I decide to stop, I put on the brakes. But in this case the car is doing everything on its own. So where does deep learning come into it? Let’s focus on the “see” by explaining how deep learning works in the context of image recognition.

    无人驾驶汽车是一种无人驾驶的自动驾驶汽车。 这种驱动分为三个主要活动:看,决定,行动。 例如,我看到红灯,我决定停下来,踩刹车。 但是在这种情况下,汽车可以自行完成所有操作。 那么深度学习从何而来呢? 让我们通过解释深度学习在图像识别环境中的工作原理来关注“看”。

    图像识别 (Image Recognition)

    When you take a picture of something, your brain processes all the information that it receives from the camera and converts it into an image. Deep learning is a subfield of machine learning that focuses on computer vision and that attempts to mimic the human brain’s ability to recognise objects in images.

    当您为某物拍照时,您的大脑会处理它从相机接收的所有信息并将其转换为图像。 深度学习是机器学习的一个子领域,专注于计算机视觉,并试图模仿人脑识别图像中对象的能力。

    We can look at images in a two dimensional plane, but an object’s three dimensional shape and position in space can be just as useful. Because of this, visual recognition can be broken up into classification and localisation. Classification identifies an object, while localisation finds the position of the object in the image.

    我们可以在二维平面中查看图像,但是对象的三维形状和空间位置同样有用。 因此,视觉识别可以分为分类和本地化。 分类识别对象,而本地化则找到对象在图像中的位置。

    For the sake of this explanation, we’ll focus on localisation.

    为了便于说明,我们将重点放在本地化上。

    Here’s an example image of a dog.

    这是狗的示例图像。

    Image for post
    https://medium.com/berrynet/run-object-detection-using-deep-learning-on-raspberry-pi-3-2-66f43609bc85https://medium.com/berrynet/run-object-detection-using-deep-learning-on-raspberry-pi-3-2-66f43609bc85

    In this image, the dog is in a different location than it appears to be in the photo as it’s position relative to where it’s normally located plays an important role in recognising the object.

    在此图像中,狗所处的位置与其在照片中所处的位置不同,因为它相对于通常所处位置的位置在识别物体方面起着重要作用。

    The nose is a region of high contrast that helps the computer identify the object. The ears and eyes also have some contrast making them easier to identify. The shape and texture of the fur plays a role as well. The two main components that come into play when the computer needs to figure out the position of the object in the image are the landmark data and scale.

    鼻子是高对比度区域,可帮助计算机识别物体。 耳朵和眼睛也有一些对比,使它们更易于识别。 皮毛的形状和质地也很重要。 当计算机需要弄清物体在图像中的位置时,两个主要组成部分是界标数据和比例尺。

    Landmark data is a region of the image that contains multiple, distinct features that can be used to identify the location of the object. The eyes are a good landmark, as are the ears. The distance between these landmarks is used in combination with the scale of the image to determine the location of the object.

    地标数据是图像的区域,其中包含可用于识别对象位置的多个不同特征。 眼睛和耳朵都是很好的标志。 这些界标之间的距离与图像的比例结合使用,以确定对象的位置。

    Here’s another example of landmark data. In this image, the computer has determined that the right eye is at (5, 3), and the nose is at (4, 5). The left eye is at (1, 1).

    这是地标数据的另一个示例。 在此图像中,计算机确定右眼在(5,3),鼻子在(4,5)。 左眼位于(1,1)。

    Image for post
    https://www.today.com/style/lost-found-app-uses-facial-recognition-technology-find-missing-pets-2D79501254https://www.today.com/style/lost-found-app-uses-facial-recognition-technology-find-missing-pets-2D79501254

    By taking the measurements of each landmark in the image, we can calculate a robust location for the nose.

    通过对图像中每个界标进行测量,我们可以计算出鼻子的稳健位置。

    Once the computer has located the nose, it uses this information to determine the scale of the image. In this case, the dog is about one third of the way into the photo from the left side. This provides a good starting point from which to measure the size of other areas of the image.

    一旦计算机确定了鼻子的位置,它将使用此信息来确定图像的比例。 在这种情况下,狗大约是从左侧进入照片的三分之一。 这为测量图像其他区域的大小提供了一个很好的起点。

    Let’s look at how we might recognise the red truck.

    让我们看一下如何识别红色卡车。

    Image for post
    https://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1182&context=ccee_pubshttps://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=1182&context=ccee_pubs

    狗的分类 (Dog Classification)

    In order to classify the image, the computer needs additional information. The most important of these is a set of parameters that describe what the computer believes a dog to look like. These parameters are referred to as a classifier. A good classifier will have high accuracy, be fast to train, and small in memory and processing requirements.

    为了对图像进行分类,计算机需要其他信息。 其中最重要的是一组描述计算机认为狗看起来像的参数。 这些参数称为分类器。 好的分类器将具有较高的准确度,训练速度快,内存和处理需求少。

    Here’s an example classifier. This classifier has a precision of 0.67 and a recall of 0.33. This means that out of all the times the dog was correctly identified, 67% of those times it was wrong. Only 33% of the time was it right.

    这是一个示例分类器。 该分类器的精度为0.67,召回率为0.33。 这意味着在正确识别狗的所有时间中,有67%的时间是错误的。 只有33%的时间是正确的。

    Image for post
    https://nerdist.com/article/dog-smile-ai-tool/https://nerdist.com/article/dog-smile-ai-tool/

    The computer’s ability to classify an image as either a dog or not is based on what the classifier believes a dog to look like. In this example, the computer believes a dog to be some combination of four features. The shape of the ears, the curve of the back, the width of the forehead, and the rotation of the neck. These parameters are combined to give us a value between 0 and 1, with 0 being completely human and 1 being a dog. The classifier in this example believes a dog to be any value between 0.67 and 1.0. This wide range makes the classifier susceptible to outliers.

    计算机将图像分类为狗的能力取决于分类器认为狗的外观。 在此示例中,计算机认为狗是四个功能的某种组合。 耳朵的形状,背部的弯曲,前额的宽度和脖子的旋转。 将这些参数组合起来可以得到0到1之间的值,其中0完全是人类,而1则是狗。 在此示例中,分类器认为狗的值介于0.67和1.0之间。 这种广泛的范围使分类器容易受到异常值的影响。

    So what does this mean for self driving cars? In self driving, cars use many cameras to classify and localise objects around them such as other cars, trucks, traffic lights, trees, pedestrians and road markings. Most car self driving systems today use some form of optical character recognition (OCR) to identify the labels on the road. Labels such as “ONE WAY”, “BUSY”, and “CLEARED” are hard to identify using OCR, and are better represented by a visual system that can see and understand the words. Cameras use a classifier to detect these labels and take them into consideration when localising an object. If a car’s classifier detects a label that it understands, then it will take that information into consideration when identifying other objects in the image.

    那么这对自动驾驶汽车意味着什么呢? 在自动驾驶中,汽车使用许多摄像头对周围的物体进行分类和定位,例如其他汽车,卡车,交通信号灯,树木,行人和道路标记 。 如今,大多数汽车自动驾驶系统都使用某种形式的光学字符识别(OCR)来识别道路上的标签。 使用OCR很难识别诸如“单向”,“繁忙”和“已清除”之类的标签,并且可以通过视觉系统看到并理解这些单词,从而更好地表示它们。 相机使用分类器检测这些标签,并在定位对象时将其考虑在内。 如果汽车的分类器检测到可以理解的标签,则在识别图像中的其他对象时会考虑该信息。

    Once it has identified objects in the image this information is combined with other data such as speed and distance to other objects before a decision is made and an action is taken by the self driving car. For example, if a self driving car’s classifier detects a pedestrian crossing on a road, it might predict that a collision is likely to occur.

    一旦确定了图像中的对象,此信息就会与其他数据(例如速度和与其他对象的距离)结合在一起,然后再做出决定并由自动驾驶汽车采取行动 。 例如,如果自动驾驶汽车的分类器检测到道路上有人行横道,则可能会预测可能发生碰撞。

    If it does, additional rules in its programming will make the decision to stop and the car will act by using the brakes, hopefully in a way that is not dangerous to other road users. In the future, self driving cars may predict that an upcoming hazard might cause a car to swerve out of control. In this case, the car may predict that it might need to execute a backwards leap to avoid a dangerous situation. This prediction would be made based on the information it has about a car’s height, speed, direction of travel and distance from potential hazards.

    如果是这样,则其编程中的其他规则将决定停止,并且汽车将通过使用制动器来工作,希望这种方式对其他道路使用者没有危险 。 将来,自动驾驶汽车可能会预测即将到来的危险可能会导致汽车转向失控。 在这种情况下,汽车可能会预测可能需要执行向后跳跃以避免危险情况。 该预测将基于其具有的有关汽车的高度,速度,行驶方向以及与潜在危险的距离的信息进行。

    There are many different ways to classify and localise an object, each with their own advantages and disadvantages. Some popular techniques are:

    有多种不同的方法可以对对象进行分类和定位,每种方法都有其自身的优点和缺点。 一些流行的技术是:

    • Classification : Determines what object a photo depicts using some combination of appearance, location, movement and other attributes.

      分类 :使用外观,位置,移动和其他属性的某种组合来确定照片所描绘的对象。

    • Feature Detection : Identifies the presence of a certain feature, such as the presence of a human face in an image.

      特征检测 :识别某些特征的存在,例如图像中人脸的存在。

    • Feature Localisation : Classifies a feature and determines its position in some coordinate system. For example, the position of a face in 3D space.

      特征本地化 :对特征进行分类并确定其在某些坐标系中的位置。 例如,脸部在3D空间中的位置。

    Out of all the techniques, feature detection and classification have had the most success in self driving cars. They are able to be used separately or in any combination by the software that powers self driving cars.

    在所有技术中,特征检测和分类在自动驾驶汽车中最为成功。 它们可以通过自动驾驶汽车的软件单独使用或组合使用。

    The feature detection and classification techniques can be sub divided into two groups: Supervised learning and Unsupervised learning. In supervised learning, the machine learns by example. It is fed a set of examples, each example containing data about an object, and the output is a class for that object. The machine is then fed new data, and given a new example. It is asked whether the new example matches a known class. For example, if the known classes are “cat”, “dog”, and “fish”, then the new example is whether an image contains a cat, and the answer will be either yes or no.

    特征检测和分类技术可分为两类: 监督学习无监督学习 。 在监督学习中,机器通过示例进行学习。 它提供了一组示例,每个示例都包含有关对象的数据,并且输出是该对象的类。 然后向机器提供新数据,并给出一个新示例。 询问新示例是否与已知类匹配。 例如,如果已知的类别是“猫”,“狗”和“鱼”,则新示例是图像是否包含猫,并且答案将是“是”或“否”。

    The machine will improve over time by being fed more and more examples. For example, if a new image contains a cat, a dog, and a fish, the machine will learn that the new example represents a cat. This method works, but it can be very slow. It is also possible that the machine makes a mistake, for example thinking a tree is a plant.

    随着时间的流逝,机器将得到越来越多的示例,因此将不断改进。 例如,如果新图像包含猫,狗和鱼,则机器将获悉新示例代表猫。 此方法有效,但速度可能很慢。 机器也可能出错,例如认为树是植物。

    In unsupervised learning, the machine doesn’t learn from examples. Instead, the machine is pre determined about what a certain object looks like. This method may be much faster, but it is far more likely to make mistakes. Since supervised learning is too slow and prone to mistakes, almost all self driving cars use unsupervised learning. In self driving cars, unsupervised learning is performed on raw sensor data. This data is interpreted and combined in different ways to detect objects, spaces, and relationships between the three.

    在无监督学习中,机器不会从示例中学习。 取而代之的是,机器预先确定某个对象的外观。 这种方法可能更快,但更容易出错。 由于有监督的学习太慢并且容易出错,因此几乎所有自动驾驶汽车都使用无监督的学习。 在自动驾驶汽车中,对原始传感器数据进行无监督学习。 这些数据将以不同的方式进行解释和组合,以检测对象,空间以及两者之间的关系。

    In conclusion, self driving cars use many different techniques to detect their surroundings. Some of these techniques, such as vision are better than others, unsupervised learning is often used despite its inherent flaws, and sensors can only detect features at a certain scale. The self driving car industry is still in its infancy, and there are many problems to be solved. But the experiments being performed today could result in a driverless car that can be on the market during your lifetime.

    总之 ,自动驾驶汽车使用许多不同的技术来检测周围环境。 这些技术中的某些技术(例如视觉技术)比其他技术更好,尽管存在固有缺陷,但仍经常使用无监督学习,并且传感器只能以一定规模检测特征。 自动驾驶汽车行业仍处于起步阶段,有许多问题需要解决。 但是今天进行的实验可能会导致无人驾驶汽车在您一生中投放市场。

    And finally, how powerful is deep learning? Powerful enough that a deep neural network wrote everything in the article you have just read that isn’t in italics :) It’s called GPT-3 developed by OpenAI, check it out

    最后,深度学习有多强大? 强大的功能足以使 深度神经网络 将您刚刚阅读的文章中所有不以斜体字书写的内容都写成:)它由OpenAI开发,称为GPT-3,请查看

    翻译自: https://medium.com/swlh/whats-so-good-about-deep-learning-6b2ef2e88bbb

    视差图和深度图有何关系

    展开全文
  • 视差图推出深度图

    万次阅读 2018-10-24 09:46:41
    视差图推出深度图 相机成像的模型如下图所示: P为空间中的点,P1P2是点P在左右像平面上的成像点,f是焦距,OROT是左右相机的光心。由下图可见左右两个相机的光轴是平行的。XRXT是两个成像点在左右两个像面上...

    视差图推出深度图

    相机成像的模型如下图所示:
    P为空间中的点,P1和P2是点P在左右像平面上的成像点,f是焦距,OR和OT是左右相机的光心。由下图可见左右两个相机的光轴是平行的。XR和XT是两个成像点在左右两个像面上距离图像左边缘的距离。
    在这里插入图片描述
    若两个相机已经校正完成即达到极线平行,两条光轴方向也平行。则视差和物体深度的关系式如下:
    在这里插入图片描述
    可推导
    在这里插入图片描述
    其中d为视差
    根据公式易得,b,f是常数,Z与d成反比,即深度越小视差越大,距离近的物体视差大。这也就是视差图中近的的物体颜色越深的原因。
    由上面两幅图,可知距离像面越近的点,它在左右相机中的视差越大,距离像面越远的点,它在左右相机中的视差越小。
    深度Z和视差的关系图如下:
    在这里插入图片描述

    展开全文
  • 文章会把视差映射讲一下,算是对学习的记录总结。Parallax Mapping视差映射好多人的文章里都写到:视差映射是法线映射的增强版,不止改变了光照作用,还在平坦的多边形上创建了3D细节的假象。其实我们看原理代码...

    44ce4356d7960227ba2ab44ab730bce0.png

    继续练习一个模拟冰块的效果,模拟的是一个不透明内部有杂质的冰块,内部杂质用视差映射来实现,表面就是简单的法线贴图+Cubemap反射采样,也可以直接只计算高光不反射图案。文章会把视差映射讲一下,算是对学习的记录和总结。

    Parallax Mapping视差映射

    好多人的文章里都写到:

    视差映射是法线映射的增强版,不止改变了光照作用,还在平坦的多边形上创建了3D细节的假象

    其实我们看原理和代码能看出来,视差映射只是增加了高低错落的感觉,并没有扰动表面法线改变光照结果,所以在需要的时候我们还是要通过法线贴图+视差映射来渲染出想要的视觉效果。

    视差映射只需要用到一个浮点值,也就是只需要贴图中的一个通道就可以表达,所以经常保存在法线贴图的A通道或者其他贴图的其中一个通道中。这个通道中的值保存的是对应的每个点要沉入物体表面多少深度而不是高出表面的高度,所以也可以叫做深度图。

    视差映射只是对视向量进行了偏移,对主贴图进行偏移采样来达到让平面看起来是立体的效果。物体表面本身还是原来的样子,顶点并没有发生偏移,高低落差只是一个假象。

    064591a832ebeac19ee07be5e1922552.png
    当前片元是图中的T0,视向量为V,纹理左边对深度图采样得到当前的深度是0.55,所以V碰到的并不是T0,而是继续向前延伸碰到的高度为0.15的点,对应的纹理坐标是T1,所以应该使用T1的纹理坐标进行主纹理和法线的采样。

    简单视差映射 Parallax Mapping

    带偏移上限的视差映射 Parallax Mapping With Offse Limiting

    只取一步近似计算得到新纹理坐标是最简单的视差映射,被直接成为视差映射。

    视差映射只有在高度相对平滑,并且不存在复杂细节时,才能得到相对可以接受的结果。如果视向量和表面法线夹角过大的话就会出现严重错误的结果。

    偏移纹理坐标的方法:

    切线空间是沿着物体表面建立的,法线垂直于表面,而TB分量和纹理坐标的xy分量重合,所以视向量V的z分量为法线分量,xy分量和纹理的xy分量重合,所以视向量的xy分量可以不加换算的直接用作纹理坐标来计算偏移。用xy除以z,就是视差映射技术中对纹理坐标偏移的原始计算。

    如果不除以z,得到的就是带偏移上限的视差映射,带偏移上线的视差映射可以避免在向量V和法向量N夹角太大时的一些错误的结果。

    然后把V的xy分量加到T0的纹理坐标上,并且和T0纹理的深度值H(T0)相乘,就得到了沿着V方向的新的纹理坐标。

    然后用一个scale系数来控制视差映射效果的幅度。把scale乘给V的xy分量。最有意义的值在0-0.5之间。更高的值会得到错误的映射计算。也可以把scale设为负数,这样的话法向量的z分量需要反转过来进行计算。

    c1147fb9005c11a80c7ce409f15010eb.png

    4317cb8bca06e02a135407b25a3a1feb.png

    27697dd908a6d37527ec983e1510900e.png

    从上图中可以看出,视向量正确的交点和偏移后的采样点Tp差距还是很大的,所以视差映射和带偏移上限的视差映射在视向量与法线的夹角越大的情况下误差就会越大。

    陡峭视差映射 Steep Parallax Mapping

    陡峭视差映射,不是简单的视差近似,不只是简单粗暴的对纹理坐标进行偏移而不进行合理性检查,会检查结果是否接近于正确值。陡峭视差映射是将深度分割为等距的若干层,然后从0层开始采样高度图,每一次会沿着V的方向偏移纹理坐标,如果采样的深度已经大于当前层的深度,停止检查并使用最后一次采样的纹理坐标作为结果。

    6a069efbbee385ddb36c6e336f1f7d90.png

    以上图为例,深度被分割为8层,每层高度为0.125,每层的纹理坐标偏移是V.xy/V.z*sclae/numLayer,从黄色方块开始检查:

    • 0层开始,层深为0,采样深度图得到值为0.75,采样的结果大于层的深度,开始下一次迭代
    • 沿着V方向偏移纹理坐标,1层开始,层深为0.125,采样深度图的值为0.625,采样结果大于层的深度,开始下一次迭代
    • 沿着V方向偏移纹理坐标,2层开始,层深为0.25,采样高度图的值为0.4,采样结果大于层的深度,开始下一次迭代
    • 沿着V方向偏移纹理坐标,3层开始,层深为0.375,采样高度图的值为0.2,采样结果小于层的深度,所以得到了实际交点的近似点,采样本次使用的纹理坐标。

    可以看出T3的坐标离实际交点还是有距离的,但是这种方式可以检查偏移采样的正确性,如果想得到更精确的结果,可以增加层的数量,提高采样的精确度。层数的提高会降低性能,降低层数会有明显的锯齿现象,可以根据视向量V和表面法向量N的夹角来动态决定层的数量。

    vec2 ParallaxMapping(vec2 texCoords, vec3 viewDir)
    { 
        //高度层数
        float numLayers = 5;
    
    
        //每层高度
        float layerHeight = 1.0 / numLayers;
        // 当前层级高度
        float currentLayerHeight = 0.0;
    
    
        //视点方向偏移总量
        vec2 P = viewDir.xy / viewDir.z * heightScale; 
    
    
        //每层高度偏移量
        vec2 deltaTexCoords = P / numLayers;
    
    
        //当前 UV
        vec2  currentTexCoords     = texCoords;
    
    
        float currentHeightMapValue = texture(heightMap, currentTexCoords).r;
    
    
        while(currentLayerHeight < currentHeightMapValue)
        {
            // 按高度层级进行 UV 偏移
            currentTexCoords += deltaTexCoords;
            // 从高度贴图采样获取的高度
            currentDepthMapValue = texture(depthMap, currentTexCoords).r;  
            // 采样点高度
            currentLayerHeight += layerHeight;  
        }
    
        return finalTexCoords;  
    }

    浮雕视差映射 Relief Parallax Mapping

    浮雕视差映射是在陡峭视差映射的基础上做出的升级优化,先进行陡峭视差映射,可以得到准确交点的前后两个层,和对应的深度值,然后在两层之间使用二分法进行迭代查找。

    443bf309cb24066317185637f820653f.png

    执行步骤:

    • ST、SH除以2,把纹理坐标T3沿着反方向偏移ST,深度沿反方向偏移SH,得到此次迭代的纹理坐标T4和深度H(T4)
    • * 采样高度图,ST、SH除以2
    • 如果采样高度图得到的深度值大于当前层的深度H(T4),将当前迭代层的深度增加SH,纹理坐标沿着V的方向偏移ST
    • 如果采样高度图得到的深度值小于当前层的深度H(T4),将当前迭代层的深度减去SH,纹理坐标沿着V的反向偏移ST
    • 从*处循环,知道达到规定的次数,或者两个深度偏差达到一个阈值
    • 得到的纹理坐标就是浮雕视差映射的结果

    视差遮蔽映射 Parallax Occlusion Mapping

    视差遮蔽映射是陡峭视差映射的另一个优化版本,浮雕映射使用二分法来提升精度,但是会降低性能。视差遮蔽性能比陡峭映射好,但是效果比浮雕映射要差。

    视差遮蔽映射是使用陡峭映射得到的最后一次采样的H(T3)、UV和前一次采样的到的层深H(T2)、UV,进行一次插值的到的结果。

    247944b730f98bac9d4f4ab5c6a92fb6.png
    float2 ParallaxMapping(float2 texCoords, float3 viewDir)
    { 
        //高度层数
        float numLayers = 50;
        //每层高度
        float layerHeight = 1.0 / numLayers;
        // 当前层级高度
        float currentLayerHeight = 0.0;
        //视点方向偏移总量
        float2 P = viewDir.xy / viewDir.z * _ParallaxStrength; 
        //每层高度偏移量
        float2 deltaTexCoords = P / numLayers;
        //当前 UV
        float2  currentTexCoords     = texCoords;
        float currentHeightMapValue = tex2D(_ParallaxMap, currentTexCoords).r;
    
        while(currentLayerHeight < currentHeightMapValue)
        {
            // 按高度层级进行 UV 偏移
            currentTexCoords += deltaTexCoords;
            // 从高度贴图采样获取的高度
            currentHeightMapValue = tex2Dlod(_ParallaxMap, float4(currentTexCoords,0,0)).r;  
            // 采样点高度
            currentLayerHeight += layerHeight;  
        }
    
        //前一个采样的点
        float2 prevTexCoords = currentTexCoords - deltaTexCoords;
        //线性插值
        float afterHeight  = currentHeightMapValue - currentLayerHeight;
        float beforeHeight = tex2D(_ParallaxMap, currentTexCoords).r - (currentLayerHeight - layerHeight);
        float weight =  afterHeight / (afterHeight - beforeHeight);
        float2 finalTexCoords = prevTexCoords * weight + currentTexCoords * (1.0 - weight);
        
        return finalTexCoords;  
    }

    完成后的冰块效果:

    知乎视频www.zhihu.com

    虽然完成了效果,但是对视差映射一直还是有一些没有搞懂的地方,为什么简单视差和陡峭视差在计算的时候偏移使用的是V.xy/V.z,而在带偏移上限的计算中偏移使用的是V.xy。在看过的很多文章中都是对所有视差映射的原理方法和代码进行了描述,并没有对这部分的讲解。

    后来 @梦旅人 给我发了一篇文章:

    https://catlikecoding.com/unity/tutorials/rendering/part-20/catlikecoding.com

    在这篇文章中详细的讲解了视差映射的相关内容,在这篇文章中找到了关于我的疑问的讲解,看过以后发现大家的文章中没有对于这部分的讲解估计是因为确实太基础了.....

    bcd9e75a7b544521c9cd4f8a6510d5e6.png

    从上图中可以看出,深度采样H的值肯定是在0-1之间的:

    • V.xy*H就可以得到一个一定范围内的偏移量,所以带偏移上限的视差映射使用的V.xy来计算偏移量的
    • 那为什么correct offset的偏移距离,也就是陡峭中的总偏移距离为什么是V.xy/V.z呢,将我们的数学功力发挥到初中水平就可以得到结果,∵ ∠a=∠b,∴ cot∠a=cot∠b,∴ xy/z = correct offset / 最大深度1,∴ correct offset = xy/z,这样xy分量除以z分量得到的就是总的UV坐标偏移量了........

    结合陡峭的算法也就能想明白为什么要取UV的总偏移量.....

    文章中部分内容、插图和代码参考和转自:

    [译] GLSL 中的视差遮蔽映射(Parallax Occlusion Mapping in GLSL)segmentfault.com吴洲:视差贴图(Parallax Mapping)学习笔记zhuanlan.zhihu.com
    0d53531866c59f2c0bb8b22540149602.png
    梦旅人:Unity Shader基于视差映射的云海效果zhuanlan.zhihu.com
    ae8d1df799ba5537635c7392268dbd37.png
    GEngine:视差映射(Parallax Mapping)zhuanlan.zhihu.com
    99c9259d87aeeea66b9922d06de2a72b.png
    展开全文
  • 视差图常为CV_16S或CV_32S等,如果直接使用cv::imwrite()保存视差图深度图,则图像将被转成CV_8U格式,损失很大的精度。 保存 在进行保存的时候,为保存无压缩图像,需要使用到cv::imwrite()的第三个参数。 显示...

    OpenCV默认的图像格式为CV_8UC3,此时图像为3通道、8位RGB图像,每个通道所能表达的灰度阶为28=2562^8=256。而视差图常为CV_16S或CV_32S等,如果直接使用cv::imwrite()保存视差图或深度图,则图像将被转成CV_8U格式,而像素值大于255将会被转成255。

    可选图像格式

    首先来看一下,OpenCV有哪些可选的数据类型

    Unsigned 8bits uchar 0~255
    Mat: CV_8UC1, CV_8UC2, CV_8UC3, CV_8UC4
    
    Signed 8bits char -128~127
    Mat: CV_8SC1,CV_8SC2,CV_8SC3,CV_8SC4
    
    Unsigned 16bits ushort 0~65535
    Mat: CV_16UC1,CV_16UC2,CV_16UC3,CV_16UC4
    
    Signed 16bits short -32768~32767
    Mat: CV_16SC1,CV_16SC2,CV_16SC3,CV_16SC4
    
    Signed 32bits int -2147483648~2147483647
    Mat: CV_32SC1,CV_32SC2,CV_32SC3,CV_32SC4
    
    Float 32bits float -1.18*10-38~3.40*10-38 
    Mat: CV_32FC1,CV_32FC2,CV_32FC3,CV_32FC4
    
    Double 64bits double 
    Mat: CV_64FC1,CV_64FC2,CV_64FC3,CV_64FC4
    

    如上数据类型,在访问图像像素时可用于确定像素类型(如确定.at< type >中的type)。

    显示

    OpenCV提供的接口函数:cv::imwrite()、cv::imshow()都只能对像素值处于0-255范围内的图像进行存储和显示,其他范围内的图像,则会被转成0-255范围进行存储、显示。也就是说,无法使用OpenCV提供的接口函数存储和显示诸如CV_16S格式的视差图/深度图,只能转换成CV_8U格式进行操作。

    其实,人眼对灰度级的敏感度比较低、根本无法分辨256级灰度值。而对视差图/深度图进行显示,也只是为了比较直观的验证视差图/深度图的准确性(如颜色随距离逐层变化),所以说完全没必要对216=655362^{16}=65536级灰度进行显示,转换成CV_8U格式就能完全满足需求,这也许就是为什么OpenCV没有提供这样接口的原因之一吧。

    如果非要进行显示,Windows系统可以使用Visual Studio的Image Watch插件,通过设置断点来显示视差图/深度图。不过,因为存在的灰度级数较多、视觉对比不强烈,导致图片看起来很费眼力。

    存储

    图像的显示可以说是为了直观的判断视差图/深度图的效果,但是在对深度值进行存储时,则必须要求像素值的精确性,此时CV_8U格式显然无法满足需求。

    理论上来说,我们处理的图像作为数字矩阵,可以按照任何自定义的规则进行存储和读入,而不会影响使用,但缺点是不能直观的显示、规则的自定义导致了可移植性较差。

    但存储成大家普遍使用的格式,相对来说开发起来会容易很多,比如存储成XML/YML格式。XML/YML作为互联网通用的文件格式,可以跨平台、跨系统,同时不受编程语言的限制,好处多多,而且OpenCV还为这两种格式文件的读写提供了相关的API函数,实现起来简单快捷,而不用“自己造轮子”了。

    • 代码
      这里给出XML读写的简单Demo,起到抛砖引玉的作用,更多复杂、丰富的功能留待大家自行探索。
    /*
    cv::FileStorage:
    	XML/YAML/JSON file storage class that encapsulates all the information necessary for writing or reading data to/from a file
    */
    #include <iostream>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main(int argc, char* argv[])
    {
    	// write
    	Mat src = (Mat_<double>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
    	FileStorage fswrite("test.xml", FileStorage::WRITE);// 新建文件,覆盖掉已有文件
    	fswrite << "src1" << src;
    	fswrite.release();
    
    	cout << "Write Fineshed!" << endl;
    
    	// read
    	FileStorage fsread("test.xml", FileStorage::READ);
    	Mat dst;
    	fsread["src1"] >> dst; // 读出src1节点里的数据
    	cout << dst << endl;
    	fsread.release();
    
    	cout << "Read Finishied" << endl;
    	
    	waitKey();
    	return 0;
    }
    
    • 结果
      xml文件有其特殊存储格式,如下图可见一斑。
    展开全文
  • 视差图转换为深度图的实现

    千次阅读 热门讨论 2020-06-19 15:35:25
    双目视觉视差图转换为深度图 视差图转换为深度图 网上关于视差图转换为深度图的博客较多,但缺少具体实现。我根据原理网上的一些参考自己实现了一个版本,做个记录,也希望能供大家参考 1 原理 根据视差图得到深度...
  • based Depth Refinement and Normal Estimation基于深度优化法线估计作者:Mattia Rossi, Mireille El Gheche, Andreas Kuhn, Pascal F...
  • 铜灵 发自 凹非寺量子位 出品 | 公众号 QbitAI一个你边...输入这样的视频:就能输出这样的3D景深版:谷歌在博客中表示,这是世界首个在摄像机人体同时运动情况下的深度学习景深预测算法,优于制作深度图的最先进工...
  • 主要是基于图深度学习的入门内容。讲述最基本的基础知识,其中包括深度学习、数学、神经网络等相关内容。该教程由代码医生工作室出版的全部书籍混编节选而成。偏重完整的知识体系学习指南。在实践方面不会涉及太...
  • MC-CNN(1409.4326)《Computing the Stereo Matching Cost ... 通过基于交叉的成本汇总半全局匹配来细化成本,然后进行左右一致性检查以消除被遮挡区域中的错误。缺陷:CNN为一对图像块计算相似度分数,以进一步...
  • 接上文 : ...然后shader中会有两层的深度(最后采样的两层),而V表面的交点坐落于这两层之间.如下这两个图层在纹理坐标T3T2的位置.现在您能使用二叉搜索来提高精度.二叉搜索的每一次迭...
  • 因为parallax算法RayMarching算法相似(都为步进采样),就放在一个专栏里了,自己理解的地方有注明.原文链接 :https://github.com/UPBGE/upbge/issues/1009这个教程介绍了怎么用GLSL使用不同的视差贴图技术(也可以...
  • CogDL 是由清华大学知识工程实验室(KEG)联合北京智源人工智能研究院(BAAI)所开发的基于深度学习的开源工具包,底层架构 PyTorch,编程语言使用了 Python。视频 ↑CogDL 允许研究人员开发人员轻松地针对数据...
  • 法线贴图一样视差贴图能够极大提升表面细节,使之具有深度感。它也是利用了视错觉,然而对深度有着更好的表达,与法线贴图一起用能够产生难以置信的效果。视差贴图光照无关,我在这里是作为法线贴图的技术延续来...
  • 视差图和深度图很像,因为视差大的像素离摄像机近,而视差小的像素离摄像机远。按以米为单位来计算摄像机距物体多远需要额外的计算。 根据Matlab教程,计算视差图的标准方法是用简单的块匹配(Block Matching)。...
  • 双目立体视觉获取视差图和深度图的原理可参考: 点云拼接:(视觉SLAM14讲+计算机视觉战队)
  • 【新智元导读】今天新智元介绍清华大学朱文武教授组的一篇预印版综述论文,全面回顾 (graph) 深度学习,从半监督、无监督强化学习三大角度,系统介绍了 GNN、GCN、自编码器 (GAE) 等 5 大类模型及其应用发展...
  • 这款售价为486元的转换器包含了USB-C接口、HDMI 接口USB-A接口。新款USB-C数字影音多端口转换器的型号为A2119 ,支持 HDMI 2.0,也就是说可以通过15 寸 MacBook Pro(2017年或更新)、视网膜 iMac(2017年或更新)、...
  • OpenGL视差贴图

    2019-10-09 17:19:23
    参考: ...视差贴图(Parallax Mapping)技术法线贴图差不多,但...法线贴图一样视差贴图能够极大提升表面细节,使之具有深度感。它也是利用了视错觉,然而对深度有着更好的表达,与法线贴图一起用能够产生难以置信的...
  • 目标在本节中,我们将学习根据立体图像创建深度图。基础在上一节中,我们看到了对极约束其他相关术语等基本概念。我们还看到,如果我们有两个场景相同的图像,则可以通过直观的方式从中获取深度信息。下面是一张...
  • 下面是一个图像,一些数学公式证明这个直觉上面的包含等面积三角形,写出他们的等式会得到下面的结果:xx'是图像平面里的点对应的场景里的点摄像机中心的距离。B是两个摄像机之间的距离(我们已知),f是摄像...
  • 双目矫正及视差图的计算 立体匹配主要是通过找出每对图像间的对应关系,根据三角测量原理,得到视差图;在获得了视差信息后,根据投影模型很容易地可以得到原始图像的深度信息三维信息。
  • 针对传统匹配算法得到的初始视差图不精确的问题,提出一种基于均值偏移区域映射的视差图优化算法。该算法首先采用均值偏移算法对视差图进行区域分割,提取由误匹配所导致的黑洞区域;将左原始图像的分割区域映射到...
  • 三角网格是最常用的三维模型表述方式,基本结构为: 顶点 (Vertex),决定空间位置 面片 (Facet),描述拓扑结构 边 (Edge)。 通过Photo-consistencyfairness准则相结合,来优化曲面网格。
  • 双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图。而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,...
  • 提出了一种利用同一场景的两幅视差图像生成用于多视点自由立体显示的...最后提出一种基于投影原理的多幅视差图像生成方法,由左视差图像深度图像生成了应用于多视点自由立体显示的多幅视差图像,其立体显示效果良好。
  • 上一节中,我们学习了极线约束的概念和相关术语。主要包含:如果我们有同一个...下图和其中的数学公式可以证明该理论。 上图是上一节2幅图像间对极几何关系的等价三角形。它的等价方程式如下 disparity=x−x′=Bf...
  • 在研究区域匹配算法特征匹配算法的基础上,提出了改进的基于视差梯度的区域匹配算法基于尺度不变性的Harris角点特征...利用该算法提取视差图,进而提取深度图,最后利用OpenGL进行三维重建,获得了良好的重建效果。

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 310
精华内容 124
关键字:

视差图和深度图