Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MATLAB和图像工具创建三维街景图像?_Matlab_Image Processing_Matlab Cvst - Fatal编程技术网

如何使用MATLAB和图像工具创建三维街景图像?

如何使用MATLAB和图像工具创建三维街景图像?,matlab,image-processing,matlab-cvst,Matlab,Image Processing,Matlab Cvst,如何使用MATLAB从2D图像创建3D立体图像?我误解了你的问题(人们已经指出这不清楚),或者你误解了3D视觉的工作方式。您不会“使用3D玻璃查看2D图像”。3D视觉是通过分别向左眼和右眼提供两种不同的图像(左图像和右图像)来实现的。从根本上讲,MATLAB与之无关 因此,在没有一个容易理解或连贯的问题的情况下,我所能做的就是假设你想要这样的东西:你有一张2D图像,但你仍然想“看到3d图像格式”。在这种情况下,您需要以某种方式将单个图像拆分为两个新图像: 左眼的左图 右眼的正确图像 这不是小事。

如何使用MATLAB从2D图像创建3D立体图像?

我误解了你的问题(人们已经指出这不清楚),或者你误解了3D视觉的工作方式。您不会“使用3D玻璃查看2D图像”。3D视觉是通过分别向左眼和右眼提供两种不同的图像(左图像和右图像)来实现的。从根本上讲,MATLAB与之无关

因此,在没有一个容易理解或连贯的问题的情况下,我所能做的就是假设你想要这样的东西:你有一张2D图像,但你仍然想“看到3d图像格式”。在这种情况下,您需要以某种方式将单个图像拆分为两个新图像:

  • 左眼的左图
  • 右眼的正确图像
  • 这不是小事。通常,您从2D图像中每个像素的位置开始。由于您正在“猜测”深度信息,因此这两幅新图像将无法完美地表示3D场景

    接下来,使用该深度信息将图像分为多个层。它基本上看起来像儿童读物中的弹出式剪贴画:

    层越多,深度估计越精确,3D表示就越逼真

    最后,从两个不同的位置将该分层表示投影回2D,一个用于左眼,另一个用于右眼。这将为您提供所需的两种不同图像

    编辑

    您链接到的第二个描述了通常称为的简化创建。它需要3D红色青色眼镜,而不是现在大多数3D影院使用的偏光眼镜。我之所以说简化是因为它不区分前景和背景

    为了获得最佳效果,您应该将前景与背景分开,并仅将该方法应用于前景。这是因为通常背景有无限的深度,从单声道到立体视觉时不会改变。就钢琴而言,一切或多或少都是前景,因此这种方法是有效的

    视频描述的算法是:

    • 从两个图像开始,
      im1
      im2
      。它们是一样的
    • im1
      的绿色和蓝色通道设置为零。这将创建红色图像
    • im2
      的红色通道设置为零。这将创建青色图像
    • 将两幅图像偏移一定量(取决于拍摄对象的深度),使
      im1
      位于左侧,而
      im2
      位于右侧。您需要正确获取此订单,因为3D红色青色眼镜的左侧为红色,右侧为青色
    • 执行两个移位图像的元素相加。请注意,没有通道会饱和
    下面是我编写的一些Python/OpenCV代码:

    import cv
    SHIFT=8
    
    if __name__ == '__main__':
        import sys
        _, fname = sys.argv
        im  = cv.LoadImage(fname)
    
        size = cv.GetSize(im)
        width, height = size
        left  = cv.CreateImage(size, im.depth, im.nChannels)
        right = cv.CreateImage(size, im.depth, im.nChannels)
        anaglyph = cv.CreateImage((width - SHIFT, height), im.depth, im.nChannels)
    
        #
        # This would be easier if we had COI support for cv.Set, but it doesn't
        # work that way.
        # OpenCV uses BGR order (even if input image is greyscale):
        # http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html
        # red goes on the left, cyan on the right:
        # http://en.wikipedia.org/wiki/Anaglyph_image
        #
        b = cv.CreateImage(size, im.depth, 1)
        g = cv.CreateImage(size, im.depth, 1)
        r = cv.CreateImage(size, im.depth, 1)
        cv.Split(im, b, g, r, None)
    
        zeros = cv.CreateImage(size, r.depth, 1)
        cv.Merge(zeros, zeros, r, None, left)
        cv.Merge(b, g, zeros, None, right)
    
        #
        # cvRect is ( x, y, width, height ) and it MUST be a tuple, not a list
        # 
        cv.SetImageROI(left,  ( SHIFT, 0, width - SHIFT, height ))
        cv.SetImageROI(right, ( 0,     0, width - SHIFT, height ))
        cv.Add(left, right, anaglyph, None)
    
        cv.SaveImage('anaglyph.jpeg', anaglyph)
    
    下面是一幅与视频中使用的内容类似的图像:

    以下是输出:


    不幸的是,我没有3D红色青色眼镜来验证这一点。但至少在理论上,这似乎是应该的。如果我犯了错误,也许有人可以纠正我。

    如果你从稍微不同的角度拍摄了两张照片,这就容易多了。您可以通过对两幅图像进行校正来创建立体立体浮雕。相关功能包括计算机视觉系统工具箱中的
    estimateuncalibratedrectification
    stereoAnaglyph
    。参见示例


    或者,您可以使用校准摄像机,然后使用
    recifyStereoImages
    功能。请参阅。

    问题是什么?你尝试过什么?我认为如果你有3D数据,创建它会更容易,因为那时你只需要创建两个具有不同视角的投影。@carlosdc@Itamar Katz:如果我想使用3D玻璃查看2D图像,它将被视为3D图像格式。。这样地。或者其他任何方式都可以用三维方式看到它?非常感谢@misha。。但我想这样看视频链接,就像那样谢谢Abhi。基本上,第一个链接描述了我所做的事情。计算深度图,制作第二幅图像。我不确定置换过滤器的实际实现。第二个链接并不是那么重要——它不是一个立体图像,它只是实现了一种伪3D效果。如果这是你想要的,那么它的实现就相当简单,只需完全按照那个孩子在视频中说的去做。稍后我可能会看第三个视频——有点长,现在已经很晚了。在你的原始问题中加入相关链接,让你清楚地知道你想要什么。谢谢@misha yes you get。我想从2d图像中添加伪3D效果。我只是根据视频链接实现简单的3d效果。如果您有关于它的代码,请回复我….-阿披索你想要的是第二个视频——youtube.com/watch?v=g_JRHtHpuSY?我用一些OpenCV源代码更新了我的答案。移植到matlab应该不难——我将把它留给你。@misha,我是matlab新手,你能告诉我如何在matlab中执行你的代码吗?谢谢你的回答。。如果我们只有一个图像,那么我们可以制作立体图像吗??