首页 > 代码库 > 利用视差图合成新视点

利用视差图合成新视点

 利用视差图合成新视点,视差图一般通过图像匹配获取,以middlebury上的一张图为例,左边为原图(左图像),右边为对应视差图。

技术分享    技术分享

 

简单的利用视差图进行视点合成,取每一个像素点处的视差值,然后计算新图像中像素点位置,然后赋值。前向映射,单点赋值代码如下。配置完Opencv可以直接跑,设置的生成50张新视点图像

技术分享
 1 #include <iostream>
 2 #include <string>
 3 #include <opencv.hpp>
 4 
 5 using namespace std;
 6 using namespace cv;
 7 
 8 int index(int m, int n)
 9 {
10     if (m>=0 && m<n)
11         return m;
12     else if (m<0)
13         return 0;
14     else if (m>=n)
15         return n-1;
16 }
17 
18 void main()
19 {
20     string imgPath="data/source_images/teddy/";
21     Mat srcImgL=imread(imgPath+"imgL.png");
22     Mat dispL=imread(imgPath+"dispL.png");
23     dispL=dispL/4;
24 
25     int imgHeight=srcImgL.rows;
26     int imgWidth=srcImgL.cols;
27 
28     Mat dstImgL=Mat::zeros(imgHeight,imgWidth, CV_8UC3);
29 
30     uchar* pImgDataL=(uchar*)srcImgL.data;
31     uchar* pDispDataL=(uchar*)dispL.data;
32     uchar* pDstDataL=(uchar*)dstImgL.data;
33 
34     for (int k=0; k<50; k++)
35     {
36         float interp=(float)k/50;
37         for (int j=0; j<imgHeight; j++)
38         {
39             for (int i=0; i<imgWidth; i++)
40             {
41                 uchar dispL=pDispDataL[j*imgWidth+i];
42 
43                 float offsetL=dispL* interp;
44                 int idL=(int)(i-offsetL);
45 
46                 idL=index(idL, imgWidth);
47                 //插值结果
48                 pDstDataL[j*imgWidth*3+idL*3+0]=pImgDataL[j*imgWidth*3+i*3+0];
49                 pDstDataL[j*imgWidth*3+idL*3+1]=pImgDataL[j*imgWidth*3+i*3+1];
50                 pDstDataL[j*imgWidth*3+idL*3+2]=pImgDataL[j*imgWidth*3+i*3+2];
51             }
52         }
53         namedWindow("show");
54         imshow("show", dstImgL);
55         waitKey(100); 
56     }
57 
58 }
View Code

 

边缘有锯齿,随后找时间加上反向映射以及双线性插值的版本。

 

利用视差图合成新视点