深度图 - 带有 OpenCV 的 Android 中的立体图像

Posted

技术标签:

【中文标题】深度图 - 带有 OpenCV 的 Android 中的立体图像【英文标题】:Depth map - stereo image in Android with OpenCV 【发布时间】:2015-12-27 04:01:43 【问题描述】:

我想问一下,如何使用左右相机和 JAVACV/OPENCV 库中的两个图像创建深度图(视差图)?

我在 android 中使用 OpenCV(+JavaCV 包装器)。我在互联网上找到了这些代码 - 这是正确的代码吗?如何校准相机?

 private Mat createDisparityMap(Mat rectLeft, Mat rectRight)

        // Converts the images to a proper type for stereoMatching
        Mat left = new Mat();
        Mat right = new Mat();

        Imgproc.cvtColor(rectLeft, left, Imgproc.COLOR_BGR2GRAY);
        Imgproc.cvtColor(rectRight, right, Imgproc.COLOR_BGR2GRAY);

        // Create a new image using the size and type of the left image
        Mat disparity = new Mat(left.size(), left.type());

        int numDisparity = (int)(left.size().width/8);

        opencv_calib3d.StereoSGBM stereoAlgo = new opencv_calib3d.StereoSGBM(
                0,    // min DIsparities
                numDisparity, // numDisparities
                11,   // SADWindowSize
                2*11*11,   // 8*number_of_image_channels*SADWindowSize*SADWindowSize   // p1
                5*11*11,  // 8*number_of_image_channels*SADWindowSize*SADWindowSize  // p2

                -1,   // disp12MaxDiff
                63,   // prefilterCap
                10,   // uniqueness ratio
                0, // sreckleWindowSize
                32, // spreckle Range
                false); // full DP
        // create the DisparityMap - SLOW: O(Width*height*numDisparity)
        stereoAlgo.compute(left, right, disparity);

        Core.normalize(disparity, disparity, 0, 256, Core.NORM_MINMAX);

        return disparity;
    

【问题讨论】:

【参考方案1】:

试试这个(与 android OpenCV SDK 更兼容):

private Mat createDisparityMap(Mat rectLeft, Mat rectRight)

    // Converts the images to a proper type for stereoMatching
    Mat left = new Mat();
    Mat right = new Mat();

    Imgproc.cvtColor(rectLeft, left, Imgproc.COLOR_BGR2GRAY);
    Imgproc.cvtColor(rectRight, right, Imgproc.COLOR_BGR2GRAY);

    // Create a new image using the size and type of the left image
    Mat disparity = new Mat(left.size(), left.type());

    int numDisparity = (int)(left.size().width/8);

    StereoSGBM stereoAlgo = StereoSGBM.create(
        0,    // min DIsparities
        numDisparity, // numDisparities
        11,   // SADWindowSize
        2*11*11,   // 8*number_of_image_channels*SADWindowSize*SADWindowSize   // p1
        5*11*11,  // 8*number_of_image_channels*SADWindowSize*SADWindowSize  // p2

        -1,   // disp12MaxDiff
        63,   // prefilterCap
        10,   // uniqueness ratio
        0, // sreckleWindowSize
        32, // spreckle Range
        0); // full DP
    // create the DisparityMap - SLOW: O(Width*height*numDisparity)
    stereoAlgo.compute(left, right, disparity);

    Core.normalize(disparity, disparity, 0, 256, Core.NORM_MINMAX);

    return disparity;

【讨论】:

以上是关于深度图 - 带有 OpenCV 的 Android 中的立体图像的主要内容,如果未能解决你的问题,请参考以下文章

Kinect和Opencv,深度图,怎么用

OpenCV中的立体图像创建深度图

来自形成立体系统的两个校准相机的 openCV 深度图

深度图从ros数据类型转换成了opencv数据类型

使用立体相机从视差图进行深度重建

在android上使用带有opencv的usb相机