视差前向合成虚拟视点/ view synthesis based on disparity

        视差前向合成虚拟视点的原理很简单,就是根据视差计算的原理来计算得到虚拟视点位置在左图像或有图像中的位置,然后对应取值得到对应虚拟视点的像素。

        假如左图中一点的像素位置为6,对应该点像素的视差值为3,那么这一点像素在右图中的位置3。因为视差的计算公式为,Xl - Xr = d;特别注意的是,这里合成算法使用的都是极线矫正处理过的图像,所以不用考虑y轴的影响。

        下面的代码使用了opencv的库。计算的是左视图和左视差图合成右视图的程序。

#include <iostream>
#include <vector>
#include <deque>
#include <unordered_map>
#include <math.h>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace std;

/*
*@func: 根据视差图正向合成右视图
*@param: img_left, disp_left 原图片左图
*@return: img_syn 合成的图像
*/
cv::Mat ImgAndDispForewardSyn(cv::Mat img, cv::Mat disp)
{
    int col = img.cols;
    int row = img.rows;

    Mat img_syn = Mat::zeros(row, col, CV_8UC3);
    disp /= 4;  // 因为输入的图像是1/4分辨率  对应不同输入的分辨率进行修改
    for(int i=0; i<row; i++)
    {
        for(int j=0; j<col; j++)
        {
            auto disp_vlaue = int(disp.at<uchar>(i, j) + 0.5);
            if(disp_vlaue + j >= col || disp_vlaue == 0)
                continue;
            img_syn.at<Vec3b>(i, j) = img.at<Vec3b>(i, disp_vlaue+j);
        }
    }
    return img_syn;
}

int main()
{
    auto image = imread("im2.png");
    auto disp2 = imread("disp2.png");

    auto img_syn = ImgAndDispForewardSyn(image, disp2);
    imwrite("syn_img.png", img_syn);

    return 0;
}

输入分别是如下所示的左视图和对应的左视差图

 

 合成得到如下所示的右视图:

这里面的数据集用的是middlebury。可以到对应的如下官网地址进行下载。

2003 Stereo Datasets 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值